将所有可能的结果合并到prolog中的一个列表中

时间:2016-03-17 23:33:23

标签: prolog logic

我正在尝试找到来自谓词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]。

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