我正在尝试找到来自谓词quizslots / 3 quizslot(Group,Day,Slot)的可用插槽。
quizslot(group4,tuesday,1)。
quizslot(group4,thursday,1)。
quizslot(group6,Saturday,5)。
这是我的假设,但它似乎没有用。
available_timings(G,L): - SETOF(X,quizslot(G,X,_),L)。
我希望结果为(group4,L),L = [星期二,1,星期四,1]。
答案 0 :(得分:1)
setof的语法:
% Set of every FooResult
?- setof(FooResult,foo(X,Y,FooResult),Result).
[FooResult1, FooResult2, ..]
% Set of tuples of every input X and FooResult
?- setof((X,FooResult),foo(X,Y,FooResult),Result).
[(X1,FooResult1), (X2,FooResult2), ..]
% Set of lists of every input X and FooResult, ommitting input Y
?- setof([X,FooResult],foo(X,_,FooResult),Result).
[[X1,FooResult1], [X2,FooResult2], ..]
我认为你明白了。正如潜伏者在上面的回答中所述,你试图将结果包含在结果中,但是,你告诉prolog找到形式的所有不同的小测验 - 事实:
quizslot(group G, day X, whatever slot)
由于此通配符将与任何插槽匹配,因此无法检索包含插槽的实际变量,Prolog不会为您检索变量。
正确的用法是,例如,以下之一
setof([Day,Slot], quizslot(Group,Day,Slot), Result) % List of lists
setof((Day,Slot), quizslot(Group,Day,Slot), Result) % List of tuples