【发布时间】:2020-12-24 13:57:38
【问题描述】:
Peano 算术中的这个小于谓词
less(0, s(_)).
less(s(X), s(Y)) :- less(X, Y).
循环
?- less(X, Y), X=s(0), Y=0.
有没有更好的方法来编写less/2(仅使用 Horn 子句)?
【问题讨论】:
-
请注意@false 的评论stackoverflow.com/questions/65427391/… 是关于建立在
less/2之上的“幼稚”neq/2。这并不是指出less/2的问题,而是说在 Prolog 中,两个目标的分离,每个目标都有无限的解决方案,不会表现得公平。 -
@IsabelleNewbie 你不觉得
less/2的这种行为本身就很麻烦吗? -
如果您想要一个能够枚举答案的
less/2,则不是。如果它可以枚举答案,那么这个查询会说“枚举所有 N, M 对,使得 N 必然循环。与neq/2的区别很重要,因为与less/2不同,分配X=s(0), Y=0是 一个有效的解决方案。当您要求neq/2搜索此解决方案时,循环是不必要的。 -
@IsabelleNewbie 我明白你和@false 的意思了。谢谢。
-
@IsabelleNewbie:“两个目标的分离,每个都有无限的解决方案将不公平” 反例:
( X = f(_) ; X = g(_) )。这是两个目标的分离,每个目标都有无限的解决方案。它甚至终止,从而公平地列举解决方案。需要进一步要求的是,这些无限解只能用无限多的答案来描述。否则我完全同意你的看法。
标签: prolog successor-arithmetics logical-purity