0

在序言中,我试图将每个有效的需求配对与资源统一起来

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 矩阵已完全形成,我可以简单地键入“。” 结束程序(而不是,你知道,中止它)。

它只生成第一个有效的解决方案。为什么会这样?

4

1 回答 1

0

您已经构建了test谓词,以便bagof/3needs(N)and的每个实例组合调用resources(R)它,因此它将每个结果收集make_bid到它自己的bagof/3结果中:

ece3520 1 joel
Bag = [[ece3520, 1, tu, 11, 14, joel, _G4310]]

第一行是谓词中的write那个。make_bid第二行是对一对/Bag的单个查询的结果。列表中的最后一个参数, 出现是因为您的谓词使用并且它是匿名的(从未使用/实例化)。make_bidneedsresources_G4310_

您的 currentmake_bid旨在将结果写入循环而不是在多个回溯中实例化它们。所以可以改成:

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).

(注意:我不确定您为什么_在第三个列表参数的末尾有。它代表什么?)

如果您想将整个结果收集到一个列表中,那么您可以使用findall/3

findall([Class, Sect, Name], (needs(N), resources(R), make_bid(N, R, [Class, Sect, _, _, _, Name, _]), Listings).

这将收集一个看起来像 的元素列表[Class, Sect, Name]。您可以bagof/3在此处使用,但您需要一个存在量词来make_bid/3表示您不想绑定的调用中的变量。

如果您想要整个Listing列表,那么:

findall(L, (needs(N), resources(R), make_bid(N, R, L)), Listings).

但是 的每个元素Listings都是一个列表,其最后一个元素是一个匿名变量,因为这make_bid/3就是结构化的方式。

于 2015-01-30T15:31:58.120 回答