one*_*day 5 prolog prolog-setof
我有一个快速的问题。在序言中使用 setof 的存在限定符(即 ^)。
使用 SICStus 似乎(尽管许多网站声称),S 确实似乎在下面的代码中被量化(使用沼泽标准,事实之母 / 事实之子,我没有包括在这里):
child(M,F,C) :- setof(X,(mother(S,X)),C).
Run Code Online (Sandbox Code Playgroud)
我使用以下方法检查统一:
child(M,F,C) :- setof(X-S,(mother(S,X)),C).
Run Code Online (Sandbox Code Playgroud)
所以下面的代码,与存在运算符似乎没有什么区别:
child(M,F,C) :- setof(X,S^(mother(S,X)),C).
Run Code Online (Sandbox Code Playgroud)
任何想法这是为什么?那么在什么情况下您需要统一器?
谢谢!
好吧,我不确定我能完美地解释它,但让我尝试一下。
它与您正在查询二元关系 的事实有关mother/2。在这种情况下,用作X-S模板对结果集的影响与在目标前面C使用的效果类似。S^在X-S模板中使用这两个变量,因此 X 和 S 的每个可能的绑定都包含在 C 中。S^在目标前面使用会获得相同的效果,因为这表示“在构造结果时忽略 S 的绑定” 。
但是当您查询三元关系时,两者之间的区别变得更加清晰。SWI手册有这样的例子:
foo(a, b, c).
foo(a, b, d).
foo(b, c, e).
foo(b, c, f).
foo(c, c, g).
Run Code Online (Sandbox Code Playgroud)
现在执行与示例中类似的查询
setof(X-Z, foo(X,Y,Z), C).
Run Code Online (Sandbox Code Playgroud)
和
setof(Z, X^foo(X,Y,Z), C).
Run Code Online (Sandbox Code Playgroud)
你会得到不同的结果。
它不仅仅是检查统一性,还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
Run Code Online (Sandbox Code Playgroud)
第二个产生:
?- setof(Z, X^foo(X,Y,Z), C).
Y = b
C = [c, d] ;
Y = c
C = [e, f, g] ;
No
Run Code Online (Sandbox Code Playgroud)