Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Prolog
Перезагрузить страницу Простые задачки на SWI.
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
imported_director imported_director вне форума
Member
 
Сообщений: 13
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 31.08.2005
По умолчанию Простые задачки на SWI. - 05.09.2005, 10:08

Привет Народ. Привет Винитарх.!
Подскажите пожалуйста где лежат похожие темы на мой контрольные работы, Все посмотрел вроде все, и не чего не нашел. Уважаемый Винитарх на чем лучше делать эти контрольные работы? вообще задали на swi-прологе. Если Вас не затруднит, помогите пожалуйста, уже целый месяц мучаюсь.



1)Напишите предикат p(+v,-l) – истинный тогда и только тогда, когда список l получается из списка v после удаления всех повторяющихся элементов, т.е из списка получается множество.

2)Напишите предикат exists(+P,+L), который проверяет 'существует ли элемент списка L, удовлетворяющий предикат P?'

3) Запрограммируйте предикат p(+A,+B), распознающий, можно ли получить список элементов A из списка элемента B посредством вычеркивания некоторых элементов.
Алгоритм: Если А-пустой список, то ответом будет 'Да'. В противном случае нужно посмотреть, не пуст ли список B. Если это так, то ответом будет 'нет' Иначе нужно сравнить первый элемент списка А с первым элементом списка В. Если они совпадают, то надо снова применить то же алгоритм к остатку списка А и остатку списка В. В противном случае нужно снова применить то же алгоритм к исходному списку А и остатку списка B.

4)Напишите предикат p(+x,+y,+l) – истинный тогда и только тогда, когда x и y является соседними элементами списка l.

5)Определите предикат occurances(+Sub,+Tern,-N), истинный, если число N равно числу вхождений SUB и терм Tern. Предполагается, что терм Tern не содержит переменных.

6)Разработайте программу 'Советник по транспорту'. Выберите либо сеть, состоящую из городов, либо транспортную сеть маршрутов поездов или автобусов в а пределах одного города. Вы должны информировать систему о том, откуда и куда Вы собираетесь добраться, а система должна выдать рекомендации о том , какими поездами , автобусами, самолетами и т.д. Вам следует воспользоваться, что бы добраться до пункта назначения.
Ответить с цитированием
  (#2 (permalink)) Старый
wanja wanja вне форума
Member
 
Сообщений: 582
Сказал(а) спасибо: 1
Поблагодарили 24 раз(а) в 24 сообщениях
Регистрация: 08.05.2005
По умолчанию 05.09.2005, 19:28

3)
subset([],_).
subset([H|T],L):-member(H,L),
subset(T,L).
member(H,[H|_]).
member(H,[_|T]):-member(H,T).
4)
neighbours(X,Y,[X,Y|_]).
neighbours(X,Y,[Y,X|_]).
neighbours(X,Y,[H|T]):-neighbours(X,Y,T).
5)
Ответить с цитированием
  (#3 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,955
Сказал(а) спасибо: 2
Поблагодарили 302 раз(а) в 302 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 05.09.2005, 21:27

director пишет:
Цитата:
Если Вас не затруднит, помогите пожалуйста, уже целый месяц мучаюсь.
Было бы неплохо увидеть Ваши попытки.

Цитата:
1)Напишите предикат p(+v,-l) – истинный тогда и только тогда, когда список l получается из списка v после удаления всех повторяющихся элементов, т.е из списка получается множество.
В SWI это делается библиотечным предикатом:
Код:
list_to_set(+List,-Set)
Можно расписать эту задачу подробней:
Код:
удалить_повторы([Элемент|Хвост],[Элемент|Выходной_список]):-
    удалить_все_вхождения(Элемент,Хвост,Хвост1),!,
    удалить_повторы(Хвост1,Выходной_список).
удалить_повторы([],[]).
удалить_все_вхождения(Элемент,[Элемент|Хвост],Хвост1):-!,
    удалить_все_вхождения(Элемент,Хвост,Хвост1).
удалить_все_вхождения(Элемент,[Элем|Хвост],[Элем|Хвост1]):-!,
    удалить_все_вхождения(Элемент,Хвост,Хвост1).
удалить_все_вхождения(_,[],[]).
А вот прога супер быстрая (моё личное изобретение):
Код:
ку([Ч|Список],Ответ):-ч(Ч),!,ку(Список,Ответ).
ку([Ч|Список],Ответ):-assert(ч(Ч)),!,ку(Список,Ответ).
ку([],Ответ):-findall(Ч,ч(Ч),Ответ).
Цитата:
2)Напишите предикат exists(+P,+L), который проверяет 'существует ли элемент списка L, удовлетворяющий предикат P?'
Наколько я знаю, в SWI для этой цели есть встроенный предикат:
Код:
checklist(P,List)
Если подробней, то примерно так (за точность не ручаюсь, ибо в таком медленном Прологе как SWI я не работаю):
Код:
exists(P,[A|L]):-call(P,A),!.
exists(P,[_|L]):-exists(P,L).
Цитата:
3) Запрограммируйте предикат p(+A,+B), распознающий, можно ли получить список элементов A из списка элемента B посредством вычеркивания некоторых элементов.
Алгоритм: Если А-пустой список, то ответом будет 'Да'. В противном случае нужно посмотреть, не пуст ли список B. Если это так, то ответом будет 'нет' Иначе нужно сравнить первый элемент списка А с первым элементом списка В. Если они совпадают, то надо снова применить то же алгоритм к остатку списка А и остатку списка В. В противном случае нужно снова применить то же алгоритм к исходному списку А и остатку списка B.
Алгоритм, приведённый Вами очень плох. Вот как надо:
Код:
подсписок([Й|А],[Й|Б]):-подсписок(А,Б).
подсписок([Й|А],[_|Б]):-подсписок(А,Б).
подсписок([],_).
Цитата:
4)Напишите предикат p(+x,+y,+l) – истинный тогда и только тогда, когда x и y является соседними элементами списка l.
Для этой цели в SWI есть библиотечный предикат:
Код:
nextto(X,Y,List)
Поэтому Ваша задача принимает такой вид:
Код:
соседи(X,Y,L):-nextto(X,Y,L);nextto(Y,X,L).
Если подробней, то так:
Код:
соседи(X,Y,[X,Y|L]):-!.
соседи(X,Y,[Y,X|L]):-!.
соседи(X,Y,[_|L]):-соседи(X,Y,L).
Ответить с цитированием
  (#4 (permalink)) Старый
imported_director imported_director вне форума
Member
 
Сообщений: 13
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 31.08.2005
По умолчанию 06.09.2005, 09:28

Ребята а вот с этиим задачками как?

5)Определите предикат occurances(+Sub,+Tern,-N), истинный, если число N равно числу вхождений SUB и терм Tern. Предполагается, что терм Tern не содержит переменных.

6)Разработайте программу 'Советник по транспорту'. Выберите либо сеть, состоящую из городов, либо транспортную сеть маршрутов поездов или автобусов в а пределах одного города. Вы должны информировать систему о том, откуда и куда Вы собираетесь добраться, а система должна выдать рекомендации о том , какими поездами , автобусами, самолетами и т.д. Вам следует воспользоваться, что бы добраться до пункта назначения.

Заранее спасибо.
Ответить с цитированием
  (#5 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,955
Сказал(а) спасибо: 2
Поблагодарили 302 раз(а) в 302 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 06.09.2005, 14:23

Пятую задачку попробуйте сделать сами по образу и подобию. Если что не получается - предъявите свои попытки и я Вам подскажу.

Шестая задачка является по сути настоящей программой, делать которую за Вас никто не будет. Единственное - могу помочь деловым советом ПО СУЩЕСТВУ КОНКРЕТНОГО вопроса.
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
imported_director imported_director вне форума
Member
 
Сообщений: 13
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 31.08.2005
По умолчанию 06.09.2005, 14:49

Спасибо всем. Задачи 5 и 6 Я решил.
Ответить с цитированием
  (#7 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,955
Сказал(а) спасибо: 2
Поблагодарили 302 раз(а) в 302 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 18.09.2005, 13:48

Решение задачи №2 на VIP.
Вот как в VIP5.2 можно проверять, удовлетворяют ли элементы списка (или хотя бы один элемент) заданному условию:
Код:
DOMAINS
il = integer*
условие = determ (integer) - (i)
проверка = determ (условие,il) - (i,i)

PREDICATES
положит : условие
отрицат : условие
все_элементы : проверка
хотя_бы_один_элемент : проверка

CLAUSES
положит(А):-А>0.
отрицат(А):-А<0.

все_элементы(P,[А|А1]):-P(А),
    все_элементы(P,А1).
все_элементы(_,[]).

хотя_бы_один_элемент(P,[А|_]):-P(А),!.
хотя_бы_один_элемент(P,[_|А1]):-
    хотя_бы_один_элемент(P,А1).
    
GOAL
все_элементы(положит,[1,2,3]),
все_элементы(отрицат,[-7,-8,-9]),
хотя_бы_один_элемент(положит,[0,-2,3]),
хотя_бы_один_элемент(отрицат,[1,2,-3]).
Ответить с цитированием
  (#8 (permalink)) Старый
flogiston flogiston вне форума
Member
 
Сообщений: 13
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 12.10.2011
По умолчанию 14.11.2011, 14:35

Ребята, есть у кого-то 6 задача "советник по транспорту"? Если есть, выложите пожалуйста.
Ответить с цитированием
  (#9 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,955
Сказал(а) спасибо: 2
Поблагодарили 302 раз(а) в 302 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 14.11.2011, 16:47

Есть такие проги. Ищите по ключевой фразе минимальный путь на графе ил похожей.
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Простые числа aag Prolog 10 12.11.2011 15:53
ПРОСТЫЕ ПРИМЕРЧИКИ Reg7 Prolog 0 20.10.2010 23:41
простые числа Mazit Общетематический 2 12.01.2010 17:40
Простые числа cha0s Prolog 16 06.01.2010 19:28
Простые числа tohen Pascal 4 21.08.2008 02:58
2 простые задачки lliype Prolog 26 25.12.2007 23:22
Две простые задачи Kukushka Prolog 3 11.06.2007 22:52
2 задания - 4 задачки (вообщем то простые) bl77 Prolog 4 06.06.2007 16:57
Простые числа milanitka Prolog 1 02.11.2006 18:08
Простые числа AgentZoy Prolog 7 15.03.2006 21:41
Простые програмы NikGuard Prolog 10 26.01.2006 23:28
Как написать простые два шифрования surv Lisp 0 16.05.2005 11:46



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов