prolog - Prolog 中 bagof/3 的问题

标签 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]。我做错了什么?

我正在使用适用于 Mac 操作系统的 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).

最佳答案

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

setof(Things, GoalCondition, Bag)

如果您将 Things 指定为 X,并且 nth/3 中的 X(如上例所示)每次都只是一个变量,setof 将只创建该单个变量的列表。其他可能的统一也是可能的,但它每次只会制作一个包含 1 件元素的袋子。

正式:谓词 bagof 和 setof 产生目标中自由变量的单独绑定(bind)的集合。 setof 产生没有重复项的集合的排序版本... findall 的作用类似于 bagof,所有自由变量都自动存在量化。另外findall返回一个空列表[]没有目标满足,而bagof失败。

长话短说:使用 findall :P

关于prolog - Prolog 中 bagof/3 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6308427/

相关文章:

prolog - Prolog中的合一算法

reflection - 如何列出具有特定原子的所有谓词?

linux - 在 GNU-Prolog 中,我可以 'catch' 一个 linux 信号吗?

prolog - Prolog 列表中的计数

prolog - 二叉搜索树 : min element

memory-management - 为什么 gprolog 需要这么多内存?

prolog - 为什么 gprolog 不将 modus ponens 的使用链接在一起?

arrays - 序幕,骑士攻击

html - 在网络浏览器中运行 Prolog