如何删除Prolog中给定嵌套列表中每隔一次出现的元素?

时间:2017-10-31 23:56:57

标签: prolog

简而言之,输入:

?- remove_second(([1,[2,1,[2],[3,3,[[3]],1,[1]],1],2,1,2,1,3],R).

输出:R=[1,[2,[],[3,[[3]],1,[]],1],2,1]

我的尝试无效:

delete_second_occurrence(_, _, [], []):-!.
delete_second_occurrence(X, Z, [X|O], [X|L]):-Z==0,nested_memeber(X, O),
    delete_second_occurrence(X, 1, O, L).
delete_second_occurrence(X, Z, [X|O1], L):-Z==1, delete_second_occurrence(X, 0, O1, L).

nested_memeber(X, [X|O]):-!.
nested_memeber(X, [Y|O]):-not(is_list(Y)),!, nested_member(X, O).
nested_member(X, [Y|O]):-(!,nested_member(X, Y));(!,nested_member(X,O)).

is_list([]).
is_list([_|_]).

1 个答案:

答案 0 :(得分:0)

我认为您希望所有列表都是唯一的?每个嵌套列表和外部列表必须具有唯一的元素。这应该适用于这种情况:

R = [1,[2,1,[2],[3,[[3]],1,[1]]],2,3]

不是最优化的代码,但它可以解决问题。

您输入的输出结果为remove_second([1,[2,1,[2],[3,3,[[3]],1,[1]],1],2,1,2,1,3],R). = =AND(C2="NOT ANSWERED",A2=A3,B2=B3)  您可以删除许多预定义谓词,例如成员到成员和lengthOfList等