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