Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.10.2011, 17:24   #1
hunter03
Форумчанин
 
Регистрация: 05.05.2009
Сообщений: 244
По умолчанию дедуктивность в прологе с бд

Здравствуйте, только начали учить пролог, задали задачу с базами данных и дедуктивностью уровня не меньше 2...У меня тема столицы стран Европы и Азии. Как мне сказал преподаватель, для обеспечения 2 уровня дедуктивности нужно помимо самой страны, столицы и части света добавить что-нибудь еще...к примеру была ли эта страна чемпионом мира по футболу...я пытался родить что смог, но 2 уровень дедуктивности не пойму как приклеить, помогите если разбираетесь.

Код:
domains

strana1=strana(symbol,symbol)
lstrana=strana1*

capital1=capital(symbol,symbol)
lcapital=capital1*

predicates
works(lstrana)
search(symbol)
search1(symbol,lstrana)

works1(lcapital)
searchcap(symbol)
searchcap1(symbol,lcapital)

closes
works([ strana("Europe","France"),
           strana("Europe","Italy"),
           strana("Asie","Korea"),
           strana("Asie","Japan")]).
search(X):-works(List), search1(X,List).
search1(X,[strana(X,Y) | _]:- write(X,Y),!.
search1(X,[_ | Tail ]):-search1(X,Tail).
search1(_, []):-write("Not find")

works1([ capital("France","Paris"),
           capital("Italy","Rome"),
           capital("Korea","Phenian"),
           capital("Japan","Tokyo")]).
searchcap(X):-works1(List), searchcap1(X,List).
searchcap1(X,[capital(X,Y) | _]:- write(X,Y),!.
searchcap1(X,[_ | Tail ]):-searchcap1(X,Tail).
searchcap1(_, []):-write("Not find")

goal
search("France").
Capital(Pays,Cap)
strana(Part,Pays).
Не могли бы подсказать ошибки?
hunter03 вне форума Ответить с цитированием
Старый 06.10.2011, 21:32   #2
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

а тут все одна большая ошибка, начиная от closes вместо clauses, заканчивая какой-то нелепой базой данных.
У вас база аж из двух фактов - work и work1. И неважно какая длина списка внутри них. Если это база данных - то должна быть нормальная возможность добавить факт в базу и при этом не переписывать ничего. А у вас так не получится, т.к. вы решили данные засунуть в список и считывать его так:
Код:
search(X):-works(List),
а это аще неверно. Используйте findall, иначе ваш вариант эквивалентен
Код:
search(X):-List = [ strana("Europe","France"),strana("Europe","Italy"),strana("Asie","Korea"),strana("Asie","Japan")]
а тут базой и не пахнет, у вас чтобы добавить факт надо ИЗМЕНИТЬ список в факте works

По тому что вам сказал препод. Добавьте в БД информацию о чемпионатах, типа
Код:
champion("Russia", 1000).
champion("USA", 2050).
т.е. год и государство.

Ну и в поиск их совсем не трудно приделать(1 строка, но сейчас ее некуда писать, т.к. все что написано - то криво)
rrrFer вне форума Ответить с цитированием
Старый 06.10.2011, 21:46   #3
hunter03
Форумчанин
 
Регистрация: 05.05.2009
Сообщений: 244
По умолчанию

findall по условию нельзя, и по условию нужно использовать базу данных с рекурсивным доступом, что-то вроде того что я написал...
по поводу чемпионов тогда придется делать аналогично тому что я написал?
hunter03 вне форума Ответить с цитированием
Старый 06.10.2011, 21:54   #4
hunter03
Форумчанин
 
Регистрация: 05.05.2009
Сообщений: 244
По умолчанию

Нукак я понял преподавателя, какраз в works я и должен буду добавлять факты, или вы имеете ввиду что придеца изменять strana1=strana(symbol,symbol) т.е. если я захочу добавить еще 1 факт то придеца все переписывать?
hunter03 вне форума Ответить с цитированием
Старый 08.10.2011, 11:57   #5
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
т.е. если я захочу добавить еще 1 факт то придеца все переписывать?
в вашей реализации придется изменять предикат works1, хотя надо просто добавить факт. Вывод - у вас что-то не так.
преподавателя вы, наверняка, поняли неправильно(или преподаватель не адекватен)

Хотя, в вашей реализации тоже можно не менять works, а добавить еще один, например
Код:
works([strana("1","1")]).
works([strana("2","2")]).
но тогда при добавлении записи(факта) в базу данных нужно вообще будет изменять предикат search- а это полный бред, т.к. функции, обрабатывающие данные, вообще никогда не должны зависеть от количества этих данных. Ну это примерно тоже самое что написать функцию для сортировки массива из 5 элементов, а при добавлении шестого элемента - переписывать функцию.

Думайте, вобщем.
rrrFer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача на Прологе VikaR Помощь студентам 1 01.07.2011 22:36
программки на прологе qweerity Помощь студентам 0 12.04.2011 19:01
Задача на прологе Fenixbo Помощь студентам 6 22.01.2011 00:23
задачи на Прологе Svetlashka Помощь студентам 0 04.01.2010 20:43