我有一个快速的问题。在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).
为什么会这样?那么你需要统一者的情况会是什么?
谢谢!
答案 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