Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удалить все вхождения из списка и подсписков 
V
    Опции темы
boobie
Дата 17.4.2015, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 16.9.2011

Репутация: нет
Всего: нет



Всем привет!
Пытаюсь решить задачу. Напишите предикат 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)". 
Как это доделать?
PM   Вверх
boobie
Дата 21.4.2015, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 16.9.2011

Репутация: нет
Всего: нет



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

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)),!.


Это сообщение отредактировал(а) boobie - 21.4.2015, 13:41
PM   Вверх
Berli
Дата 2.5.2015, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 2.5.2015

Репутация: нет
Всего: нет



Всем привет. 

Помогите, пож, определить предикат len_NM (L,N,M), который проверяет содержит ли конкретный список из списков L не более N элементов с длинной, более М. Спасибо 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума Prolog
Void
  • Пожалуйста, создавайте темы с содержательными названиями.
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Prolog | Следующая тема »


 




[ Время генерации скрипта: 0.1193 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.