2010-11-08 85 views
2

我想只删除给定数组中每个元素的第二个外观,并将结果返回给一个新数组。给定的数组可以有原子元素,但也可以在其中包含像元素一样的列表。
谓词应该像这样调用:delete_second(L1,L2)。
L1 = [1,2,4,1,[1,2,3,[4]],2,1]
L2 = [1,2,4,[1,3,[]],2 ,1]。如何从Prolog中的数组中删除元素的特定外观?

+1

如果你想投桃报李,以gusbro,你能接受他的答案。 – Cephalopod 2010-12-13 17:02:30

回答

1

您可能会使用两个累加器列表。在一个蓄能器中,你将拥有只出现一次的物品,而在另一个蓄能器上,你将拥有不止一次出现的物品。 因此,您必须通过输入列表中的所有项目更新这些累加器,并根据需要从输出列表中选择并丢弃项目。

喜欢的东西:

delete_second(In, Out):- 
delete_second(In, [], [], _, _, Out). 

delete_second([], Once, Twice, Once, Twice, []):- !. 
delete_second([X|Tail], Once, Twice, NOnce, NTwice, [Y|Out]):- 
    delete_second(X, Once, Twice, MOnce, MTwice, Y), 
    !, 
    delete_second(Tail, MOnce, MTwice, NOnce, NTwice, Out). 
delete_second([X|Tail], Once, Twice, NOnce, NTwice, [X|Out]):- 
    member(X, Twice), 
    !, 
    delete_second(Tail, Once, Twice, NOnce, NTwice, Out). 
delete_second([X|Tail], Once, Twice, NOnce, NTwice, Out):- 
    append(OnceP, [X|OnceT], Once), 
    append(OnceP, OnceT, MOnce), 
    !, 
    delete_second(Tail, MOnce, [X|Twice], NOnce, NTwice, Out). 
delete_second([X|Tail], Once, Twice, NOnce, NTwice, [X|Out]):- 
    !, 
    delete_second(Tail, [X|Once], Twice, NOnce, NTwice, Out). 
+0

谢谢你。你是最伟大的。我希望有一天我能把这份恩惠归还给你。 祝您有愉快的一天。 – Fuzion 2010-11-08 17:07:53

相关问题