prolog - 在 Prolog 中使用追加反转列表时会发生什么?

标签 prolog reverse

我不太明白这段代码发生了什么:

reverse2([],[]).
reverse2([H|T],R):- reverse2(T,R2), append(R2,[H],R).

我们在追加之前进行递归对我来说没有意义。

有人可以解释一下在达到基本情况后每个元素 H 是如何附加的吗?

谢谢。

最佳答案

递归位于列表的尾部。考虑列表[1,2,3] 。第一条规则不匹配。第二条规则匹配,统一H = 1T = [2,3] 。然后我们调用reverse2([2,3], R2) 。同样,第一条规则不匹配。第二条规则匹配,统一H = 2T = [3] 。可以看到,从这里开始递归,最终会碰到第一条规则。放大回最外面的调用,其中 H = 1T = [2, 3] ,我们最终会得到 R2 = [3, 2] 。然后将发生追加,粘贴 [1]在最后。

您可能会发现执行如下示例查询很有帮助:

?- trace, reverse2([1,2,3], X).

这将向您展示查询如何展开以及每个变量的绑定(bind)。

思考递归函数的方法是归纳法。看看基本情况。基本情况应该是非常正确的,而且确实如此——空列表的反面确实是空列表。然后看感应案例。假设它适用于大小为 N 的较小列表,那么它也适用于大小为 N+1 的列表吗? 假设它可以反转列表的尾部(大小 = N),并查看如果这是真的,则将头附加到末尾将使其适用于 N+1。这就是您需要相信的一切,感应才会发挥作用。如果你相信这两件事,你就相信一切值得相信的事情,并且它对每一个输入都有效。因此,将自己从需要相信任何其他步骤中解放出来。 :)

关于prolog - 在 Prolog 中使用追加反转列表时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23207540/

相关文章:

c++ - 反向位算法

javascript - 我不明白javascript中的这个array.reverse()

Prolog路径查找

prolog:列表中最大重复元素

prolog - 如何扭转或构建对杰森(特工的话)的信念?

prolog - 序言中的深度优先,找到目标但无法跟踪路径

android - 有什么方法可以使进度条在值为 0 时为 100%?

c# - for 循环参数是否执行每次迭代?

java - java中分割数组的索引并将其存储到一个新数组中

performance - BProlog 8.1 中的表格性能不均衡