我一直在尝试以下内容 -
copy(L,R) :- accCp(L,R).
accCp([],R).
accCp([H|T],R) :- accCp(T,H).
当我对此进行追踪时 - 我可以看到正在复制的各个项目,但它们会“丢失”,并且不会形成增长列表(在R中,正如我希望的那样)。我怎么能想到这个?
非常感谢
答案 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]]
这适用于各种列表。希望这是您想要的。希望这些能帮到您。