Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нахождение элементов в списке 
V
    Опции темы
Ak47black
  Дата 20.9.2010, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

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



Здравствуйте.
Начал решать немного посложней задачи и столкнулся с двумя задачи к которым никак не могу придумать сам принц решения. (Думаю они чем то похожи)

Задача 1
Цитата

Сделать предикат который берёт два списка и возвращает список разницы.
Другими словами, должно быть
Цитата

raznica([a,b,c,d], [d,e], R).
    R = [a,b,c].


Задача 2
Цитата

Сделать предикат который в списке S находит K раз идущие повторяющие элементы и возвращает в переменной E имя.
Другими словами, должно быть
Цитата

povtor([a,a,c,a,b,b,b,b,a,g],4,E).
    E=b.


PM MAIL   Вверх
Ak47black
Дата 21.9.2010, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

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



Может у кого-нибудь есть какие-нибудь идеи как их можно решить?
PM MAIL   Вверх
Фантом
Дата 21.9.2010, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


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

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



Цитата(Ak47black @  20.9.2010,  11:25 Найти цитируемый пост)

Сделать предикат который берёт два списка и возвращает список разницы.

Ну, например, так:
Код

razn([],_,R,R).
razn([H|T],B,Q,R):-ifin(H,B),razn(T,B,Q,R).
razn([H|T],B,Q,R):-razn(T,B,[H|Q],R).

ifin(_,[]):-!,fail.
ifin(Z,[Z|_]).
ifin(Z,[_|P]):-ifin(Z,P).

raznica[A,B,R]:-razn(A,B,[],R).


При этом собственно raznica - опять "оболочка", для придания желаемого вида. smile Ну и порядок в разнице получается противоположным по сравнению с "вычитаемым", но, по идее, это все равно.

Цитата(Ak47black @  20.9.2010,  11:25 Найти цитируемый пост)

Сделать предикат который в списке S находит K раз идущие повторяющие элементы и возвращает в переменной E имя.

Это даже проще.
Код

perpov(_,1,_).
perpov([E|H],K,E):-Kk is K-1,perpov(H,Kk,E).

povtor([E|T],K,E):-perpov(T,K,E).
povtor([_|T],K,E):-povtor(T,K,E).

Кстати, интересно отметить, что он сработает и в варианте вызова: povtor([a,a,c,a,b,b,b,b,a,g],4,b). В этом случае получится true, а если что-нибудь вроде povtor([a,a,c,a,b,b,b,b,a,g],4,g) - false.
PM   Вверх
Фантом
Дата 21.9.2010, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


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

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



Да, кстати, по крайней мере часть написанного выше обычно уже встроена в Пролог-системы. Например, мою реализацию ifin можно заменить на стандартный предикат member.
PM   Вверх
Ak47black
Дата 23.9.2010, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

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



Долго смотрел на решение и пытался понять как это работает, но сегодня понял  smile 

Это сообщение отредактировал(а) Ak47black - 23.9.2010, 18:32
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума Prolog
Void
  • Пожалуйста, создавайте темы с содержательными названиями.
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

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

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


 




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


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

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