在序言中,我试图将每个有效的需求配对与资源统一起来
needs([ece2090,1,m,13,16]).
needs([ece3520,1,tu,11,14]).
needs([ece4420,1,w,13,16]).
resources([joel, [ece2090,ece2010,ece3520,ece4420],[[m,13,16]]]).
resources([sam, [ece2010,ece4420],[]]).
resources([pete, [ece3520],[[w,13,16]]]).
使用这个公式
make_bid([Class,Sect,Day,Ts,Te],[Name,Cap,Unavail],[Class,Sect,Day,Ts,Te,Name,_]) :-
no_conflict_all_unavailable(Day,Ts,Te,Unavail),
course_capable(Class,Cap),
writef('%w %w %w\n',[Class,Sect,Name]),
fail.
并运行此测试。
test(Listing) :- needs(N), resources(R), make_bid(N,R,Listing).
该计划的这一部分的重点是为每个班级配备一名教师,该教师既具有授课资格,又在此期间不缺课。它应该给出一个清单。
?- test(Listing).
ece3520 1 joel
ece3520 1 pete
ece4420 1 joel
ece4420 1 sam
false.
运行时,会生成上述内容。这是正确的,但它的格式对我来说没用,因为我需要它作为自己的变量来进行进一步的计算。那么解决办法就是用bagof或者findall吧?
所以我从程序的主要部分中删除了失败子句,然后将测试更改为这个
test(Bag) :- needs(N), resources(R), bagof(Listing,make_bid(N,R,Listing),Bag).
但它会产生这个
ece3520 1 joel
Bag = [[ece3520, 1, tu, 11, 14, joel, _G4310]]
如果你仔细观察,你会发现结尾没有句号,也没有正确/错误的陈述。这会让人们相信它是无限循环的。然而,情况并非如此,因为 Bag 矩阵已完全形成,我可以简单地键入“。” 结束程序(而不是,你知道,中止它)。
它只生成第一个有效的解决方案。为什么会这样?