SWI-Prolog 中正确的 subsumes_term/2?

Proper subsumes_term/2 in SWI-Prolog?

让我们假设 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=a), subsumes_term(X, b), X = b.
no

当在 SWI-Prolog 中做同样的事情时,我得到不同的结果:

?- when(nonvar(X), X=a), subsumes_term(X, b), X = a.
false.

?- when(nonvar(X), X=a), subsumes_term(X, b), 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,可以用来代替。