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.