Prolog是否使用渴望评估?

Prolog是否使用渴望评估?,prolog,lazy-evaluation,Prolog,Lazy Evaluation,因为即使在找到答案后(在本例中,只有一个解决方案),Prolog也会使用按时间顺序的回溯(从Prolog Wikipedia页面),这会证明Prolog使用了渴望评估吗 mother_child(trude, sally). father_child(tom, sally). father_child(tom, erica). father_child(mike, tom). sibling(X, Y) :- parent_child(Z, X), parent_child(Z,

因为即使在找到答案后(在本例中,只有一个解决方案),Prolog也会使用按时间顺序的回溯(从Prolog Wikipedia页面),这会证明Prolog使用了渴望评估吗

mother_child(trude, sally).

father_child(tom, sally).
father_child(tom, erica).
father_child(mike, tom).

sibling(X, Y)      :- parent_child(Z, X), parent_child(Z, Y).

parent_child(X, Y) :- father_child(X, Y).
parent_child(X, Y) :- mother_child(X, Y).
具有以下输出:

?- sibling(sally, erica).
true ;
false.

下面用@WillNess总结讨论,是的,Prolog是严格的。但是,Prolog的执行模型和语义与通常标记为严格或非严格的语言有很大不同。有关更多信息,请参见下文


我不确定这个问题是否真的适用于Prolog,因为它实际上没有其他语言所具有的隐式求值顺序。在Haskell这样的语言中,这一点非常重要,您可能会有这样一个表达式:

f (g x) (h y)
在像ML这样严格的语言中,有一个定义的求值顺序:
gx
将被求值,然后
hy
,最后
f(gx)(hy)
。在Haskell这样的语言中,
gx
hy
将只根据需要进行评估(“非严格”比“懒惰”更准确)。但在序言中

f(g(X), h(Y))
没有相同的含义,因为它没有使用函数表示法。查询将分为三个部分,
g(X,A)
h(Y,B)
,和
f(A,B,C)
,这些成分可以按任意顺序排列。评估策略是严格的,因为在一个序列中较早出现的内容将在下一个内容之前进行评估,但它是不严格的,因为不要求在评估开始之前将变量实例化为基本项。统一完全满足于完成,而不必为每个变量提供值。我之所以提出这个问题,是因为您必须将另一种语言中的复杂嵌套表达式分解为Prolog中的几个表达式


据我所知,回溯与此无关。我不认为回溯到最近的选择点并从那里恢复会排除一种非严格的评估方法,只是碰巧Prolog的评估方法是严格的。

就目前情况而言,这个问题在其陈述中是不正确的。按时间顺序回溯并不意味着Prolog必须回溯“在只有一个解决方案的示例中”

考虑这一点:

foo(a, 1).
foo(b, 2).
foo(c, 3).

?- foo(b, X).
X = 2.

?- foo(X, 2).
X = b.
所以这是一个只有一个解决方案的例子,Prolog认识到了这一点,并且不试图回溯。在某些情况下,您可以以Prolog无法识别只有一个逻辑解决方案的方式实现问题的解决方案,但这是由于实现,而不是Prolog的执行模型固有的

您应该仔细阅读Prolog的执行模型。您似乎引用了“从操作上讲,Prolog的执行策略可以被认为是其他语言中函数调用的泛化,不同之处在于多个子句头可以匹配给定的调用。在这种情况下,[emphasis mine]该系统创建了一个选择点,将目标与第一个备选方案的条款标题统一起来,并继续实现第一个备选方案的目标。”阅读Sterling和Shapiro的《序言的艺术》,了解关于该主题的更完整的讨论。

来自我的

在即时求值中,表达式一绑定到变量就立即求值

然后我认为有两个级别-在用户级别(我们的谓词),Prolog并不急切。 但这是在“系统”级别,因为变量的实现尽可能高效


事实上,属性变量被实现为惰性变量,并且与“逻辑”Prolog变量相当“正交”。

Prolog在给出问题的几个正确答案后暂停与惰性无关;它是其用户交互协议的一部分。每个答案都经过精心计算

有时只有一个答案,但Prolog事先不知道,所以它等待我们按下
继续搜索,希望找到另一个解决方案。有时,它能够提前推断,并会立即停止,但只是有时

更新:

Prolog本身不进行评估。所有术语都未赋值,就像在Lisp中“引用”一样

Prolog将按照编写的方式展开您的谓词定义,并且非常乐意让您的数据结构充满未赋值的未实例化漏洞(如果谓词定义包含这些漏洞的话)

当用户请求输出时,Haskell不需要任何值

类似地,Prolog根据用户的请求逐个生成解决方案

Prolog甚至比Haskell更懒惰,在Haskell中,所有算术都是严格的,即立即的,而在Prolog中,您必须使用
is/2
明确请求算术求值


因此,这个问题可能是不适定的。Prolog的操作模型太不一样了。首先,没有“结果”或“功能”;但从另一个角度来看,一切都是结果,谓词是“多”函数。

这个问题似乎不完整。提到的“本案”是什么?“按时间顺序回溯”是什么意思?维基百科增加了一个例子,让你相信“按时间顺序回溯”这个词很奇怪吗?@错误只是因为它强调时间,而不是位置。当事情已经按规定的顺序进行时,暗示它们也按时间顺序进行,并不会添加任何有用的信息(或者,像往常一样,我实际上不理解确切的意思,因此会产生混淆)。按时间顺序的意思:你可以以某种方式回溯:你总是回溯到最年轻的选择点。您不能选择任何选项点(如in或parallel Approach),您只能选择一个。@false谢谢您的解释。在谷歌上搜索了一下之后,我差不多明白了。我只是觉得谈论一个选择的年龄令人困惑