在Prolog中有bagof / 3的问题

时间:2011-06-10 15:19:22

标签: prolog gnu-prolog

据我所知,可以使用谓词setof / 3和bagof / 3生成问题解决方案列表。 (Link to gprolog manual)

正如预期的那样,以下查询的解决方案是a,b和c。

?- nth(_, [a,b,c], X).                 
X = a ? ;
X = b ? ;
X = c ? ;
yes

现在我试试这个:

?- setof(X, nth(_, [a,b,c], X), ListOfSolutions).
ListOfSolutions = [a] ? ;
ListOfSolutions = [b] ? ;
ListOfSolutions = [c]
yes

在我看来,解决方案应该是[a,b,c]。我做错了什么?

我正在使用gprolog 1.4.0 for Mac OS。


编辑:解决方案

我真正需要的是(^)/ 2操作符,但这里给出的答案完全正确,非常感谢您的帮助。如果有人有类似的问题,这里是我目前的代码,从三维网格中选择单元格。

% selectFLR(?Grid, ?ClassId, ?TDayIdD, ?HourId, -ListOfFLR)
% ---------------------------------------------------------
selectFLR(Grid, ClassId, DayId, HourId, ListOfFLR) :-
    bagof(FLR, ClassId^DayId^HourId^selectSingleFLR(Grid, ClassId, DayId, HourId, FLR), ListOfFLR).

selectSingleFLR(Grid, ClassId, DayId, HourId, FLR) :-
    nth(ClassId, Grid, Class),
    nth(DayId, Class, Day),
    nth(HourId, Day, FLR).

2 个答案:

答案 0 :(得分:2)

不,不应该。 nth(_,[a,b,c],X)每次给出X的1个解。 setof(和bagof)的工作方式如下:

setof(Things, GoalCondition, Bag)

如果你将Things指定为X,并且来自第n / 3的X(正如你在上面的例子中所示)每次只有一个变量,setof将只创建该单个变量的列表。其他可能的统一将是可能的,但它每次只会制作一件Bag of 1项目。

形式:谓词bagof和setof为目标中的自由变量的单独绑定产生集合。 setof产生一个没有重复的集合的排序版本... findall就像bagof一样,所有自由变量都自动存在量化。另外findall返回一个空列表[]没有目标满意度,而bagof失败。

简而言之:使用findall:P

答案 1 :(得分:1)

尝试这样写:

findall((A,B,C,D,E), coursemeetings(A,B,C,D,E),L)