gpt4 book ai didi

prolog - 读一剪!在序言中

转载 作者:行者123 更新时间:2023-12-01 00:36:19 24 4
gpt4 key购买 nike

我正在阅读 Learn Prolog Now! 's chapter on cuts同时是 Bratko 的 Prolog 人工智能编程,第 5 章:控制回溯。起初,cut 似乎是模仿其他编程语言中已知的 if-else 子句的直接方式,例如

# Find the largest number
max(X,Y,Y):- X =< Y,!.
max(X,Y,X).

然而,正如下面提到的,即使我们期望 false 在所有变量都被实例化的情况下,这段代码也会失败。 ,例如
?- max(2,3,2).
true.

原因很明显:第一个规则失败,第二个不再有任何条件与之相关,所以它会成功。我明白这一点,但随后提出了一个解决方案(这里是 swish ):
max(X,Y,Z):- X =< Y,!, Y = Z. 
max(X,Y,X).

我很困惑我应该如何阅读这个。我以为 !意思是:'如果在此之前的所有内容 !为真,停止终止,包括具有相同谓词的任何其他规则'。但是,这不可能是正确的,因为这意味着 Y = Z 的实例化只有在失败的情况下才会发生,这对于该规则是无用的。

那么应该如何以“人”的方式阅读剪辑?而且,作为扩展,我应该如何阅读 max/3 的建议解决方案以上?

最佳答案

另见 this answerthis question .

how should I read the proposed solution for max/3 above?


max(X,Y,Z):- X =< Y, !, Y = Z. 
max(X,Y,X).

您可以按如下方式阅读:

When X =< Y, forget the second clause of the predicate, and unify Y and Z.



切割会丢弃选择点。选择点是证明树中的标记,它告诉 Prolog 在找到解决方案后在哪里继续搜索更多解决方案。所以切割会切掉证明树的一部分。上面的第一个链接 ( here it is again ) 详细讨论了削减,但该答案的很大一部分只是引用了其他人对其他地方削减的看法。

我想带回家的信息是,一旦你在 Prolog 程序中加入了一个剪辑,你就会强制自己以操作方式而不是声明方式阅读它。为了了解证明树的哪些部分将被切掉,您(程序员)必须走一遍 Action ,考虑子句的顺序,考虑哪些子目标可以创建选择点,考虑丢失哪些解决方案。您需要构建证明树(而不是让 Prolog 来做)。

许多 您可以用来避免创建您知道不需要的选择点的技术。然而,这是一个有点大的话题。您应该阅读可用 Material 并提出具体问题。

关于prolog - 读一剪!在序言中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40933408/

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