Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Prolog > Удалить все вхождения из списка и подсписков


Автор: boobie 17.4.2015, 13:14
Всем привет!
Пытаюсь решить задачу. Напишите предикат p(+V, +X, -L) - истинный тогда и только тогда, когда список L получается из списка V после удаления всех вхождений X на всех уровнях, например, p([1, [2, 3, [1]], [3, 1]], 1, [[2, 3, []], [3]]) - истина.
Написал алгоритм удаления из списка всех элементов, совпадающих с Х.
Код

add1(T,Y,[T|Y]) :- !.                                                                   %склеиваем
del(_,[],[]) :- !.                                                                        %когда оба списка пусты и обрабатывать нечего
del(X,[X|Hvost],L) :- del(X,Hvost,L) , !.                                   %если в голове списка искомый "ненужный" элемент
del(X,[Golova|L1],L) :- del(X,L1,Temp2) , add1(Golova,Temp2,L) , !.%исследуем хвост

Видел реализацию короче, но она для меня менее понятна, поэтому есть add1 для сбора списка.
Делаем запрос. Получаем:
Код

?- del(1,[3,2,1],L).
L = [3, 2] ;
false.

Вложенный список он не обрабатывает, он считает его элементом.
Код

?- del(1,[3,2,[1,5]],L).
L = [3, 2, [1, 5]] ;
false.

Пытаюсь заставить его пробегать и по вложенным спискам:
Код

add1(T,Y,[T|Y]):-!.
del(_,[],[]):-!.
del(X,[X|Hvost],L):-del(X,Hvost,L),!.
del(X,[Golova|L1],L):-del(X,Golova,Temp1),del(X,L1,Temp2),add1(Temp1,Temp2,L),!.

del(?,?,?):-!.%как составить правило для поиска в подсписке? У меня от Пролога голова становится квадратной.

Если это решу, то можно будет добавлять уже "p(+V, +X, -L)". 
Как это доделать?

Автор: boobie 21.4.2015, 13:41
Сделал... Некрасиво, зато работает. Может, кому-нибудь пригодится.
Код

add1(T,Y,[T|Y]):-!.
del(_,[],[]):-!.
del(X,[X|Hvost],L):-del(X,Hvost,L),!.
del(X,[Golova|L1],L):-((is_list(Golova),del(X,Golova,Temp1));(integer(Golova),Temp1=Golova)),!,(del(X,L1,Temp2),add1(Temp1,Temp2,L)),!.

Автор: Berli 2.5.2015, 13:16
Всем привет. 

Помогите, пож, определить предикат len_NM (L,N,M), который проверяет содержит ли конкретный список из списков L не более N элементов с длинной, более М. Спасибо 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)