List 如何在Prolog中从数组中删除元素的特定外观?

List 如何在Prolog中从数组中删除元素的特定外观?,list,prolog,element,List,Prolog,Element,我只想删除给定数组中每个元素的第二次出现,并在新数组中返回结果。给定的数组可以有原子元素,但也可以有类似列表的元素。 谓词应该这样调用:delete_second(L1,L2)。 L1=[1,2,4,1,1,2,3,4,2,1] L2=[1,2,4,[1,3,[],2,1]。您可以使用两个累加器列表。在一个累加器中,项目只出现一次,而在另一个累加器中,项目出现多次。 因此,您必须检查输入列表中的所有项目,更新这些累加器,并在需要时从输出列表中选择和丢弃该项目 比如: delete_second

我只想删除给定数组中每个元素的第二次出现,并在新数组中返回结果。给定的数组可以有原子元素,但也可以有类似列表的元素。
谓词应该这样调用:delete_second(L1,L2)。
L1=[1,2,4,1,1,2,3,4,2,1]

L2=[1,2,4,[1,3,[],2,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).

谢谢你,伙计。你是最伟大的。我希望有一天我能报答你的恩惠。祝你今天愉快。如果你想回报古斯布罗一个人情,你可以接受他的回答。