Prolog如何得出3<2之类的无意义结果?

我正在阅读的一篇论文如下:

Plaisted [3] 表明,可以使用一阶谓词演算语义编写形式上正确的 PROLOG 程序,并导出无意义的结果,例如 3 < 2。

它指的是 Prologs 在当时(1980 年代)没有使用发生检查的事实。

不幸的是,它引用的论文是在付费墙后面。我仍然希望看到这样的例子。直觉上,感觉就像省略发生检查只是将结构的范围扩大到包括循环结构(但根据作者的说法,这种直觉一定是错误的)。


我希望这个例子不是

smaller(3, 2) :- X = f(X).

那会令人失望。

回答

这是论文中现代语法的示例:

three_less_than_two :-
    less_than(s(X), X).

less_than(X, s(X)).

确实我们得到:

?- three_less_than_two.
true.

因为:

?- less_than(s(X), X).
X = s(s(X)).

具体来说,这解释了查询中 3 和 2 的选择:鉴于X = s(s(X))的值为s(X)“三个”(s如果不展开内部X,它包含三个出现的),而X它本身是“两个”。

启用发生检查让我们回到逻辑行为:

?- set_prolog_flag(occurs_check, true).
true.

?- three_less_than_two.
false.

?- less_than(s(X), X).
false.

所以这确实是

arbitrary_statement :-
    arbitrary_unification_without_occurs_check.


以上是Prolog如何得出3&lt;2之类的无意义结果?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>