SWI-Prolog 中的正确 subsumes_term/2 ?

问题描述

让我们假设 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,可以用来代替。