Предположим, у меня есть список типа [1,[2,1,[2],[3,1,1,[[3]],1,[1]],1],2,1,2,1,3]
, и я хочу удалить из него каждое второе вхождение '1' для результирующего списка [1,[2,[2],[3,1,[[3]],1,[]],1],2,2,1,3]
. Пока что я придумал вот что:
delete_second_occurrence([], [], _, _).
delete_second_occurrence([X|L], [X|R], X, N) :-
0 is mod(N, 2),
N1 is N + 1,
delete_second_occurrence(L, R, X, N1).
delete_second_occurrence([X|L], R, X, N) :-
1 is mod(N, 2),
N1 is N + 1,
delete_second_occurrence(L, R, X, N1).
delete_second_occurrence([E|L], [E|R], X, N) :-
is_list(E),
delete_second_occurrence(E, R, X, N),
delete_second_occurrence(L, R, X, N).
delete_second_occurrence([E|L], [E|R], X, N) :-
delete_second_occurrence(L, R, X, N).
Чтобы уточнить,
- R - результирующий список
- L - список ввода
- X - это элемент, который я хочу удалить
- N - это количество раз, когда X встречался
Он удаляет каждое второе вхождение на самом нижнем уровне, но не ничего для вложенных списков. Как мне go удалить также дубликаты во вложенных списках?