我想在列表中添加一个列表。
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)
答案 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/1
和goo/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]