prolog,复制列表

时间:2009-12-16 01:46:28

标签: logic prolog

我试图让我的手臂绕过一些基本的序言,但有点挣扎。具体来说 - 我试图通过项目列表并将其逐项复制到新列表中。我可以让它反转,但是我发现它在没有倒车的情况下做了它。

我一直在尝试以下内容 -

copy(L,R) :- accCp(L,R).

accCp([],R).
accCp([H|T],R) :- accCp(T,H).

当我对此进行追踪时 - 我可以看到正在复制的各个项目,但它们会“丢失”,并且不会形成增长列表(在R中,正如我希望的那样)。我怎么能想到这个?

非常感谢

2 个答案:

答案 0 :(得分:6)

当原始列表为空时,您的基本案例需要将副本列表设置为空。然后,递归案例需要从列表H中取L并将其添加到列表R的头部:

copy(L,R) :- accCp(L,R).
accCp([],[]).
accCp([H|T1],[H|T2]) :- accCp(T1,T2).

当您致电copy时,它会向下移动到基本情况,并将R设置为空列表。然后,当它恢复工作时,它会继续将已知列表H的头部[H|T1]附加到变量列表[H|T2]的开头。它会在达到原始案例之前执行此操作,此时R包含L的完整副本。

答案 1 :(得分:1)

非常简单的方法是:

clone1(X,X).

?-clone1([1,2,3],Z).
  Z=[1,2,3]

这是一种用于列表处理的表达方式。您要复制或克隆列表。我的方法是将列表中的每个元素添加到要复制到另一个列表并返回另一个列表的地方。

clone([],[]).
clone([H|T],[H|Z]):- clone(T,Z).

输出

?- clone([1,2,3,4,5],Z).
   Z=[1,2,3,4,5]

?- clone([a,b,c,d],Z).
   Z=[a,b,c,d]

?- clone([ [a,1,2] , [b,2,3] , [c,3,4] ],Z).
   Z = [[a, 1, 2], [b, 2, 3], [c, 3, 4]]

这适用于各种列表。希望这是您想要的。希望这些能帮到您。