据我了解,谓词 setof/3 和 bagof/3 可用于生成问题解决方案的列表。(链接到 gprolog 手册)。
正如预期的那样,以下查询的解决方案是 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] 。我究竟做错了什么?
我正在为 Mac OS 使用 gprolog 1.4.0。
编辑:解决方案
我真正需要的是 (^)/2 运算符,但是这里给出的答案是完全正确的,非常感谢您的帮助。如果有人有类似的问题,这里是我当前从 3 维网格中选择单元格的代码。
% 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).