2009-12-16 187 views
3

即时通讯尝试让我的手臂围绕一些基本的序言,但挣扎了一下。在具体 - 即时通讯试图通过项目列表并将其逐项复制到一个新的列表。我可以把它扭转,但我发现它在不倒车的情况下做到了。序言,复制列表

我一直尝试以下 -

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

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

当我在这个运行跟踪 - 我可以看到被整个复制的个别项目,但他们得到“丢失”,并且不形成越来越多(在R,因为我希望)。我怎么能这样?

非常感谢

+0

你是否想要copy_term/2具有相同的行为? – Kaarel 2009-12-26 01:35:47

回答

6

你的基本情况需要设置副本列表空当原来的列表是空的。然后,递归情况下需要采取H从列表L并将其添加到列表R的头:

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

当你调用copy,它工作的方式,以基本情况,在那里设置R到空的清单。然后,当它恢复工作时,它会继续将已知列表[H|T1]的头H附加到变量列表[H|T2]的开头。它会这样做,直到达到原始案例,此时R包含L的完整副本。

+0

谢谢,所以如果我正确理解跟踪 - 它在列表中运行直到accCp([],_)为真,在这种情况下_被替换为[],然后当它再次备份时,它确保第二'[]'总是等于第一个?这是逻辑吗? 非常感谢! – 2009-12-16 02:15:13

+0

是的,这是正确的 - 在递归的情况下,它从L获取H并将其添加到R的头部。并且由于在基本情况下两个列表都是相等的(空的),所以当函数是完成。 – 2009-12-16 02:35:57

+0

如果答案还讨论了如果输入列表包含变量会发生什么,这将是很好的,例如,不应该该副本与原始版本无关(与copy_term/2一样)。另外,如何复制开放列表?测试用例可以是例如“copy([A,B,c,A | X],L)” – Kaarel 2009-12-26 22:24:32