Logic 序言,复制列表

Logic 序言,复制列表,logic,prolog,Logic,Prolog,我正试图让我的手臂围绕一些基本的序言,但在这个过程中有点挣扎。具体地说,我试图通过一个项目列表,并将其逐项复制到一个新的列表中。我可以让它倒过来,但我发现不倒过来更麻烦 我一直在尝试以下方法- copy(L,R) :- accCp(L,R). accCp([],R). accCp([H|T],R) :- accCp(T,H). 当我对此进行跟踪时,我可以看到单个项目被复制,但它们会“丢失”,并且不会形成一个不断增长的列表(如我所希望的,在R)。我怎么能做到这一点 非常感谢当原始列表为空时,您

我正试图让我的手臂围绕一些基本的序言,但在这个过程中有点挣扎。具体地说,我试图通过一个项目列表,并将其逐项复制到一个新的列表中。我可以让它倒过来,但我发现不倒过来更麻烦

我一直在尝试以下方法-

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

accCp([],R).
accCp([H|T],R) :- accCp(T,H).
当我对此进行跟踪时,我可以看到单个项目被复制,但它们会“丢失”,并且不会形成一个不断增长的列表(如我所希望的,在R)。我怎么能做到这一点


非常感谢

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

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

当您调用
copy
时,它会向下移动到基本大小写,将
R
设置为空列表。然后,当它进行备份时,它不断将已知列表的头
H
追加到变量列表
[H | T2]
的开头。它会一直这样做,直到到达原始案例,此时
R
包含
L
的完整副本非常简单的方法是:

clone1(X,X).

?-clone1([1,2,3],Z).
  Z=[1,2,3]
下面是一种用于列表处理的表达方式。您要复制或克隆列表。我的方法是将列表中的每个元素添加到另一个列表中,然后返回另一个列表

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


这适用于所有类型的列表。希望这就是你要找的。希望tihs能帮助您。

谢谢,如果我正确理解跟踪,它会一直在列表中运行,直到accCp([],u)为真,在这种情况下,u被替换为[],然后在再次备份时,它确保第二个“[]”始终等于第一个?这就是逻辑吗?非常感谢!是的,这是正确的——在递归的情况下,它从L中取H,并将其添加到R的开头。由于两个列表在基本情况下是相等的(空),当函数完成时,它们最终将相等。如果答案还讨论了如果输入列表包含变量会发生什么,那就好了,例如,副本不应该独立于原件(如副本/2)。此外,如何复制打开的列表?测试用例可以是例如“copy([A,B,c,A | X],L)”,您想要与copy|u term/2相同的行为吗?
?- 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]]