如何将列表附加到Prolog中的列表?

时间:2017-11-12 11:46:58

标签: list prolog append

我想在列表中添加一个列表。

rollmeanr(t(df_close[,-1])[,2],2,fill=NA)

我想得到如下所示的结果。但我意识到我无法执行foo([a,b,c]). goo([d,e,f]). hi(X):-append(foo(X),goo(X)). foo(X)

goo(X)

2 个答案:

答案 0 :(得分:1)

关于Prolog的一个常见误解是它有 no 函数:它只有谓词。谓词没有输入或输出,它统一了调用它的变量。因此,谓词可以是 mutlidirectional

关于prolog的另一个误解是,如果你打电话:

append(foo(X), goo(Y)).

Prolog会将foo(x)goo(Y)视为谓词调用。它没有:在这种情况下,foo(X)goo(Y)条款。带有仿函数(不是谓词)和术语的术语。因此,此处foo(X)是一个带有仿函数foo/1且术语X作为第一个(也是唯一的)参数的术语。

然而,您可以通过在另一个谓词的正文中写入来调用谓词。

例如,你可能想要:

hi(X) :-
    foo(A),
    goo(B),
    append(A, B, X).

那么这是如何运作的?如果我们调用hi(X),那么Prolog将在源代码中查找是否存在由该名称定义的谓词。如果有,它的目标是从上到下执行谓词的子句。这里只有hi/1的一个条款,我们刚刚写的那个。所以现在Prolog将开始执行该子句的 body

我们现在看到正文中的第一项是foo(A)(注意A,而不是X)。所以现在Prolog将再次为foo/1谓词寻找一个条款。你的问题中有一个。 foo([a,b,c])。这意味着Prolog现在将执行统一。它将统一我们的变量A。因此,在调用foo/1谓词后,现在A = [a,b,c]。我们对goo(B)执行了同样的操作:调用B = [d,e,f]后。{/ p>

最后我们致电append(A, B, X).。现在append/3是一个内置谓词,它将两个第一个参数中的列表附加到第三个参数(但它可以用于多向)。通话结束后,X将统一为[a,b,c,d,e,f]。由于它是谓词调用的结束,Prolog将报告X = [a,b,c,d,e,f]

我们现在完成了吗?没有! Prolog的另一个重要方面是它在语法上回溯免费。这意味着,对于我们已完成的每个谓词调用(foo(A)goo(B)append(C)),仍然可以存在我们感兴趣的子句。因此,从概念上讲,Prolog解释器将寻找更多答案。但我们很幸运,foo/1goo/1只有一个定义。请注意,大多数Prolog口译人员不必在这里进行回溯,因为他们会做一些簿记,以便事先知道我们是否应该尝试回溯。

答案 1 :(得分:1)

也可以编写自己的追加谓词,它可以帮助您更全面地了解Prolog:

append_list([],L, L).
append_list([Head|Tail], List2, [Head|List]):-
     append_list(Tail, List2, List).

它接受第一个列表的第一个元素并将其插入到结果列表中,然后在没有列表的第一个元素的情况下递归调用自身,这意味着它将移动到第二个元素上。基本谓词是append_list([], L, L).,这表示:当第一个列表为空时,返回结果列表。

插入你的价值

append_list([a,b,c],[d,e,f],X).

将返回X = [a, b, c, d, e, f]