所以我有这个代码将列表中的所有内容复制到另一个列表中。 我应该如何修改它才能复制,让我们说前两个字符。
$copy(L,R) :-
copy2(L,R).
copy2([X],[X]).
copy2([H|T1],[H|T2]) :-
copy2(T1,T2).
我希望它的例子:? - 复制([a,b,c,d,e,f],X, 2 )。 - > X = [a,b]
答案 0 :(得分:1)
您可以使用统一来复制列表:
?- [a,b,c,d,e] = List.
List = [a, b, c, d, e].
?- [a,b,c,d,e] = [V,W,X,Y,Z].
V = a,
W = b,
X = c,
Y = d,
Z = e.
?- [a,b,c,d,e] = [V,W|Rest].
V = a,
W = b,
Rest = [c, d, e].
可以定义一个类似你所描述的谓词,复制列表的前N个元素:
first_n(List, N, Xs) :-
length(Xs, N),
append(Xs _, List).
其中的作用如下:
?- first_n([a,b,c,d,e], 2, X).
X = [a, b].
有许多不同的方法可以编写类似的谓词。我定义first_n/3
的方式,如果N大于List
的长度,它将失败(注释中的@false指出了这一点)。可以改为编写共同函数take的类比,如果List
大于N
长度,它将完整地返回List
:
take_n(N, List, Taken) :-
( length(List, M),
N > M
->
Taken = List
;
length(Taken, N),
append(Taken, _, List)
).
在@ false的有益批评的指导下,这个答案得到了纠正(好几次)。