prolog中的存在性限定符,使用setof / bagof

时间:2009-12-31 19:18:57

标签: prolog prolog-setof

我有一个快速的问题。在prolog中使用setof的存在性限定符(即^)。

使用SICStus似乎(尽管许多网站声称),S确实似乎在下面的代码中量化(使用沼泽标准,事实的母亲/事实的孩子,我没有包括在这里):< / p>

child(M,F,C) :- setof(X,(mother(S,X)),C).

我使用以下方法检查统一:

child(M,F,C) :- setof(X-S,(mother(S,X)),C).

所以以下代码与存在运算符似乎没有区别:

child(M,F,C) :- setof(X,S^(mother(S,X)),C).

为什么会这样?那么你需要统一者的情况会是什么?

谢谢!

1 个答案:

答案 0 :(得分:2)

好的,我不确定我能否完美地解释它,但让我试试。

这与您查询2-ary关系mother/2的事实有关。在使用X-S作为模板的 情况下,对结果集C的影响与在目标前使用S^的效果类似。在X-S中,您在模板中使用了两个变量,因此X和S中的每个可能绑定都包含在C中。您可以在目标前使用S^获得相同的效果,因为这是说“在构造结果时忽略S的绑定”。

但是,当您查询3-ary关系时,两者之间的差异会变得更加清晰。 SWI手册有这个例子:

foo(a, b, c).
foo(a, b, d).
foo(b, c, e).
foo(b, c, f).
foo(c, c, g).

现在执行与示例中类似的查询

setof(X-Z, foo(X,Y,Z), C).

setof(Z, X^foo(X,Y,Z), C).

你会得到不同的结果。

不只是检查统一,X-Z有效地更改了结果集。

希望有所帮助。

修改:当我包含上述两个查询的结果时,它可能会澄清一些事情。第一个是这样的:

?- setof(X-Z, foo(X,Y,Z), C).   
Y = b
C = [a-c, a-d] ;
Y = c
C = [b-e, b-f, c-g] ;
No

第二个产生:

?- setof(Z, X^foo(X,Y,Z), C).
Y = b
C = [c, d] ;
Y = c
C = [e, f, g] ;
No