gpt4 book ai didi

prolog - Prolog 使用 Eager Evaluation 吗?

转载 作者:行者123 更新时间:2023-12-01 18:46:41 24 4
gpt4 key购买 nike

因为 Prolog 即使在找到答案之后也使用时间回溯(来自 Prolog 维基百科页面)(在本例中只能有一个解决方案),这是否可以证明 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 这样的严格语言中,有一个定义的评估顺序:g x将被评估,然后 h y ,和f (g x) (h y)最后的。在像 Haskell 这样的语言中,g xh y只会根据需要进行评估(“非严格”比“惰性”更准确)。但在 Prolog 中,

f(g(X), h(Y))

没有相同的含义,因为它没有使用函数符号。该查询将分为三个部分:g(X, A) , h(Y, B) ,和f(A,B,C) ,并且这些成分可以按任何顺序放置。评估策略是严格的,因为序列中较早出现的内容将在接下来的内容之前进行评估,但它是非严格的,因为没有要求在进行评估之前将变量实例化为基本项。无需为每个变量提供值即可完成统一。我提出这个问题是因为您必须将另一种语言中的复杂嵌套表达式分解为 Prolog 中的多个表达式。

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

关于prolog - Prolog 使用 Eager Evaluation 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20481733/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com