gpt4 book ai didi

prolog - 当我调用 `even(3)` 时发生了什么,而 `even` 是生成器函数?

转载 作者:行者123 更新时间:2023-12-01 09:28:45 28 4
gpt4 key购买 nike

我在序言中有以下奇数和偶数生成器

even(0).
even(X) :- odd(Y), X is Y+1, X>0.

odd(1).
odd(X) :- even(Y), X is Y+1, X>1.

我想了解为什么我不能将这些函数用作测试器,即 ?even(3)。 这会导致无限循环。

这不是我调用 ?even(3). 时发生的情况吗?

X 被实例化为 3。尝试找出任何奇怪的 Y(从 0 开始)。找到 Y=1。现在是我不明白的部分。我不知道当它必须处理子句 X 是 Y+1 时会发生什么。考虑到 X 已经给出,这里发生了什么?

最佳答案

您在这里试图了解程序的精确终止属性,当您来自过程语言时,这有点令人惊讶。在 Prolog 中,有几个交错的控制流,这使得实际执行通常难以遵循。

要理解它,您可以逐步跟踪程序以了解实际发生的情况,但该方法很快就会变得复杂。而且您的程序尽可能简单。相反,我将向您展示另一种方法,使用 failure-slices .

您非常幸运地使用了查询 even(3),它立即向您表明存在问题。您可以使用另一个查询,例如 even(2).,它不会立即向您显示问题。事实上,Prolog 很好地完成了这个查询。一切似乎都很好,除非您要求查看更多答案。

那么我们如何才能确保我们尽快面对问题呢?一种方法是提出查询 even(2), false。在这种情况下,我们预计查询会失败,因为 false 永远不会成功。但是,查询可能会产生无限循环(或错误),而不是失败。通过在末尾添加 false 我们说:跳过所有答案,并简单地显示查询是否终止。

现在(纯粹的、单调的)Prolog 的好处是我们可以对你的程序做同样的事情。所以我们可能会在你的程序中添加目标false。如果生成的程序(称为故障切片)现在循环,那么原始程序实际上也会循环。

这是仍然循环的最小故障片:

even(0) :- false.even(X) :- odd(Y), false, X is Y+1, X>0.odd(1) :- false.odd(X) :- even(Y), false, X is Y+1, X>1.

正是这个微小的剩余部分负责所有循环。现在,您不仅可以证明 even(2) 循环的原因,还可以看到更一般的情况:这个失败切片将独立于 even/1 的参数循环>。所以它会循环任何查询!

更多信息请参见 .

关于prolog - 当我调用 `even(3)` 时发生了什么,而 `even` 是生成器函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18750587/

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