我有一个快速的问题 . 在prolog中使用setof的存在性限定符(即^) .
使用SICStus似乎(尽管许多网站声称),S确实似乎在下面的代码中量化(使用沼泽标准,事实的母亲/事实的孩子,我没有包括在这里):
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 回答
好吧,我不确定我能否完美地解释它,但让我试一试 .
它与你在查询2-ary关系
mother/2
这一事实有关 . 在 that 情况下,使用X-S
作为模板对结果集C
具有类似的效果,就像在目标前面使用S^
一样 . 在X-S
中,您在模板中使用了两个变量,因此X和S的每个可能绑定都包含在C中 . 您在目标前使用S^
获得相同的效果,因为这是在说"ignore bindings of S when constructing the result" .但是,当您查询3-ary关系时,两者之间的差异会变得更加清晰 . SWI手册有这个例子:
现在执行与示例中类似的查询
和
而你会得到不同的结果 .
这不只是检查统一,
X-Z
有效地改变了你的结果集 .希望有所帮助 .
Edit :当我包含上述两个查询的结果时,它可能会澄清事情 . 第一个是这样的:
第二个产生: