所以我有这段代码,可以将所有内容从一个列表复制到另一个列表。为了复制,我应该如何修改它,比如说前两个字符。
$copy(L,R) :-
copy2(L,R).
copy2([X],[X]).
copy2([H|T1],[H|T2]) :-
copy2(T1,T2).
我想要的示例是:?-copy([a,b,c,d,e,f],X,2。-> X = [a,b]
您可以统一复制列表:
?- [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的有用批评的指导下,此答案已被纠正(几次)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句