Prolog以递归方式附加列表

时间:2016-12-30 13:43:24

标签: prolog

这是一个以递归方式在列表末尾添加元素X的代码。

app(X, [], [X]).
app(X, [Y | S], [Y | S2]) :- app(X, S, S2).

有人能解释一下它是如何运作的吗?返回声明在哪里,app(X, S, S2) [Y | S], [Y | S2]到底是做什么的?

2 个答案:

答案 0 :(得分:2)

你不需要返回语句一切都是通过统一完成的(简单的模式匹配)。条款:

app(X, [Y | S], [Y | S2]) 

表示第二个参数是头部Y和尾部S的列表,第三个参数是头部Y和尾部S2的列表。因此它强制(通过使用统一)两个列表的头部是相同的。递归地,两个列表变得相同,除了第三个参数列表在末尾有另外一个元素(元素X)并且这由第一个子句定义。请注意,第二个子句仅适用于具有一个或多个元素的列表。因此,当我们检查空列表(在第二个参数中)时,作为递归的基础,由于第一个子句而产生的第三个列表仅包含一个元素X元素。

答案 1 :(得分:2)

Prolog程序是通过定义事实和规则来制定的。您定义事实和规则,Prolog解释器试图提出解决方案,使它们成为现实。除了这个基本概念,您还需要了解Prolog程序员广泛使用的另外两个重要概念。 这些是:

  1. 输入和输出参数:Prolog中没有返回语句。一些变量将是结果(输出),而另一些变量将是输入。在你的程序中,输入第一个和第二个参数,最后一个参数是输出。
  2. 模式匹配:如果列表表示为[Head|Tail]。 Head是第一个元素,Tail是剩余元素的列表。
  3. 当您致电app时,例如app(5, [1, 2, 3, 4], L).,Prolog解释程序会尝试为L提供app为真的值。

    Prolog解释器正在通过以下步骤解决问题:

    1. 为了使app(X, [Y | S], [Y | S2])成立,最后一个参数的第一个元素需要变为Y。所以,在我的例子中,L变为[1,S2]。
    2. 然后它尝试匹配规则app(X, S, S2)。这里S是[2,3,4],S2是下次运行的输出参数。然后使用app(5, [2, 3, 4], S2)重复步骤1,之后S2变为[2,S2]。所以,L,现在变成[1,2,S2]。
    3. 同样的事情重复(递归),L填充为[1,2,3,4,S2]。
    4. 现在,第二个参数为空。因此,第一个事实app(X, [], [X])是匹配的。为了使其成立,最后一个参数变为仅包含X的列表(在这种情况下为5),这导致L为[1,2,3,4,5]。