在prolog上将某些字符从列表复制到另一个列表

时间:2014-09-02 22:59:18

标签: list copy prolog

所以我有这个代码将列表中的所有内容复制到另一个列表中。 我应该如何修改它才能复制,让我们说前两个字符。

$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]

1 个答案:

答案 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的有益批评的指导下,这个答案得到了纠正(好几次)。