【问题标题】:Proper subsumes_term/2 in SWI-Prolog?SWI-Prolog 中正确的 subsumes_term/2 吗?
【发布时间】:2021-01-02 20:41:33
【问题描述】:

假设 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 可能没有帮助,因为它使用正常的统一。

【问题讨论】:

    标签: prolog swi-prolog sicstus-prolog


    【解决方案1】:

    这是一个建议(未在 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,可以用它来代替。

    【讨论】:

    • 是的,在 SWI-Prolog 演讲中,他们展示了使用 copy_term_nat/2 的解决方案。所有这些复制当然不是非常有效,但看不到 SWI-Prolog 的其他解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 2016-01-16
    • 1970-01-01
    相关资源
    最近更新 更多