FWIW, ваша постановка проблемы довольно неясна.
Как я понимаю, проблема в том, что у вас есть произвольное «дерево», неконечные узлы которого являются списками, а листовые узлы чего-то еще. «Список списков» как бы. Вы хотели бы видеть, что как логическая плоская последовательность листовых узлов, итерируйте по этому и удалите каждый второй листовой узел без , изменяя общую форму "дерева", так что единственное, что изменяется, - это количество листьев, свисающих с любого данного узла.
Исходя из следующих входных данных, вы получите соответствующие выходные данные:
input: []
output: []
input: [a,b,c,d]
output: [a,c]
input: [a,[],b,c,d]
output: [a,[],c]
input: [a,[b],c,d]
output: [a,[],c]
input: [a,[b,c,d,e],f,g]
output: [a,[c,e],g]
input: [a,[b,[],[c,d,[e,f,g],h],i],j]
output: [a,[[],[c,[e,g]],i]]
Вот [непроверенное] прологическое решение. В нем я просто поддерживаю два состояния keep
и remove
и переключаюсь между ними по мере необходимости. Вы получаете нечетное / четное бесплатно: это зависит только от состояния, в котором вы запускаете машину.
Следует отметить, что если переданная структура данных содержит какие-либо несвязанные / неунифицированные переменные, вы вряд ли получите правильные результаты. Нежелательное объединение вызывает проблемы. Для правильной работы с ними необходимо добавить пункты охраны.
% ====================
% The public interface
% ====================
remove_even( Xs , Ys ) :- remove_every_other_node( keep , _ , Xs , [] , Ys ).
remove_odd( Xs , Ys ) :- remove_every_other_node( remove , _ , Xs , [] , Ys ).
%------------------
% The core iterator
%------------------
remove_every_other_node( S , S , [] , T , List ) :-
reverse(T,List)
.
remove_every_other_node( S , N , [X|Xs] , T , List ) :-
process_node( S, S1 , X , T , T1 ) ,
remove_every_other_node( S1 , N , Xs , T1 , List )
.
%----------------------
% The list node handler
%----------------------
process_node( S , S , [] , T , [[]|T] ).
process_node( S , N , [X|Xs] , T , [L1|T] ) :-
remove_every_other_node( S , N , [X|Xs] , [] , L1)
.
process_node( keep , remove , X , T , [X|T] ).
process_node( remove , keep , X , T , T ).