问题描述
让我们假设 SICStus Prolog 是 某些谓词的实现,甚至是 ISO 核心标准 谓词。尤其是与属性变量有关。
然后我找到了这些例子 here。它来自 SICStus 4 而不仅仅是 SICStus 3:
?- when(nonvar(X),X=a),subsumes_term(X,b),X = a.
X = a ?
yes
?- when(nonvar(X),X = b.
no
当在 SWI-Prolog 中做同样的事情时,我得到不同的结果:
?- when(nonvar(X),X = a.
false.
?- when(nonvar(X),X = b.
false.
如何在 SWI-Prolog 中实现一种解决方法? ROKs METUTL.PL 可能没有帮助,因为它使用正常统一。
解决方法
这是一个建议(实际上并未在 SWI-prolog 中测试过):
subsumes_term_sicstus(X,Y):-
copy_term(X-Y,XC-YC,_),subsumes_term(XC,YC).
这个想法只是简单地复制两个结构,然后在副本上使用原始谓词,它们没有附加属性或冻结目标。
根据文档,似乎 copy_term/2
复制了 SWI-prolog 中的属性变量的属性(但不是在 SICStus 中),所以我在这里使用 copy_term/3
代替。我看到还有一个 copy_term_nat/2
,可以用来代替。