这是一个以递归方式在列表末尾添加元素X的代码。
app(X, [], [X]).
app(X, [Y | S], [Y | S2]) :- app(X, S, S2).
有人能解释一下它是如何运作的吗?返回声明在哪里,app(X, S, S2)
[Y | S], [Y | S2]
到底是做什么的?
答案 0 :(得分:2)
你不需要返回语句一切都是通过统一完成的(简单的模式匹配)。条款:
app(X, [Y | S], [Y | S2])
表示第二个参数是头部Y和尾部S的列表,第三个参数是头部Y和尾部S2的列表。因此它强制(通过使用统一)两个列表的头部是相同的。递归地,两个列表变得相同,除了第三个参数列表在末尾有另外一个元素(元素X)并且这由第一个子句定义。请注意,第二个子句仅适用于具有一个或多个元素的列表。因此,当我们检查空列表(在第二个参数中)时,作为递归的基础,由于第一个子句而产生的第三个列表仅包含一个元素X元素。
答案 1 :(得分:2)
Prolog程序是通过定义事实和规则来制定的。您定义事实和规则,Prolog解释器试图提出解决方案,使它们成为现实。除了这个基本概念,您还需要了解Prolog程序员广泛使用的另外两个重要概念。 这些是:
[Head|Tail]
。 Head是第一个元素,Tail是剩余元素的列表。当您致电app
时,例如app(5, [1, 2, 3, 4], L).
,Prolog解释程序会尝试为L
提供app
为真的值。
Prolog解释器正在通过以下步骤解决问题:
app(X, [Y | S], [Y | S2])
成立,最后一个参数的第一个元素需要变为Y
。所以,在我的例子中,L变为[1,S2]。app(X, S, S2)
。这里S是[2,3,4],S2是下次运行的输出参数。然后使用app(5, [2, 3, 4], S2)
重复步骤1,之后S2
变为[2,S2]。所以,L
,现在变成[1,2,S2]。L
填充为[1,2,3,4,S2]。app(X, [], [X])
是匹配的。为了使其成立,最后一个参数变为仅包含X
的列表(在这种情况下为5),这导致L
为[1,2,3,4,5]。