- •Введение
- •1.Основные элементы языка Пролог. Структура программы на языке Пролог.
- •2. Структуры. Состав логических операций в Прологе. Решение логической задачи в tp.
- •3. Использование рекурсии. Построение программ с использованием основных структур данных Пролога - списков.
- •1.Принадлежность.
- •2.Сцепление.
- •4. Использование механизма отсечения для оптимизации поиска решения в программах на Прологе.
- •5. Управление стратегией вывода в экспертных системах с помощью обратной цепочки рассуждений.
- •6. Управление стратегией вывода в экспертных системах с помощью прямой цепочки рассуждений.
- •7.Управление стратегией выбора в экспертных системах с помощью эвристик.
- •8. Получение вывода экспертными системами в условиях неопределённости.
- •9. Организация в экспертных системах ответов на вопросы “Почему” и “Как”.
- •Рекомендуемая литература.
2. Структуры. Состав логических операций в Прологе. Решение логической задачи в tp.
Структура - это единый объект, состоящий из совокупности других объектов, называемых компонентами. Компоненты группируются в структуру для удобства их использования. Приведем пример структурированного описания фактов:
domains
articles = book(title,author);
horse(name); boat;
bankbook (balance)
title,author,name = symbol
balance = real
predicates
owns(name,articles)
clauses
owns(john,book("A friend of...","Irwin Shaw")).
owns(john,horse(blacky)). /*лошадь*/
owns(john,boat). /*лодка*/
owns(john,bankbook(1000)). /*банковская книжка*/
В описанном ниже примере приводится вариант использования вложенных структур для вывода на печать дерева данных:
Пример:
domains
treetype = tree(string, treetype, treetype) ; empty()
predicates
print_all_elements(treetype)
clauses
print_all_elements(empty).
print_all_elements(tree(X, Y, Z)) :-
write(X), nl,
print_all_elements(Y),
print_all_elements(Z).
goal
print_all_elements(tree("Cathy",
tree("Michael",
tree("Charles", empty, empty),
tree("Hazel", empty, empty)),
tree("Melody",
tree("Jim", empty, empty),
tree("Eleanor", empty, empty)))).
В Прологе существует встроенный предикат '=' равенство. Когда делается попытка доказать согласованность с базой данных целевого утверждения ? - X=Y, Пролог пытается установить соответствие между X и Y. При этом целевое утверждение доказуемо, если такое соответствие имеется.
Для того, чтобы указать, что объекты различны, используется символ "<>". Например, Y<>X означает “Y не равно X”. Кроме этого, в Прологе существуют встроенные предикаты, позволяющие сравнивать числа: <, >,<=,>=.
Пролог-системы обеспечивают выполнение следующих операций: X+Y, X-Y, X*Y, X/Y, X mod Y (остаток от деления X на Y).
Рассмотрим реализацию простейших логических задач на языке Пролог.
Пример №1. На одном заводе работали три друга: слесарь, токарь и сварщик. Их фамилии Борисов, Иванов и Семенов. У слесаря нет ни братьев, ни сестер. Он самый младший из друзей. Семенов, женатый на сестре Борисова, старше токаря. Назовите фамилии слесаря, токаря и сварщика. (Ответ: Семенов - сварщик, Борисов - токарь, Иванов - слесарь). Программа имеет вид:
predicates
prof (symbol) /*профессия*/
not_sister (symbol) /*наличие сестры*/
ml (symbol,symbol) /*отношение младше*/
st (symbol,symbol) /*отношение старше*/
all (symbol,symbol,symbol) /*кто есть кто*/
clauses
prof(slesar).
prof(tokar).
prof(svarschik).
not_sister(slesar).
ml(slesar,_).
st (P1,P2):- not(ml(P1,P2)), P1<>P2.
all (Borisov,Ivanov,Semenov):-
prof(Borisov),
prof(Ivanov),
prof(Semenov),
Borisov<>Ivanov,
Borisov<>Semenov,
Ivanov<>Semenov,
st(Sermenov,tokar),
not (not_sister(Borisov)).
goal all (Borisov,Ivanov,Semenov).
Пример №2 . В соревнованиях по бегу участвовали 4 студента: Андрей, Борис, Вася, Гриша. На вопрос, какое каждый из них занял место, они дали следующие ответы:
Андрей: “Я был вторым, Боря – третьим.”
Вася: “Я был вторым, Андрей – первым.”
Гриша: “Я был вторым, Боря - четвертым.”
Определить, какое место занял каждый из них, если известно, что в каждом из ответов одно утверждение верное, а другое - ложное. (Ответ: Андрей - 1, Гриша - 2, Боря - 3, Вася – 4.) Программа имеет вид:
domains
Name=symbol
Nomer=integer
predicates
Boyname(name). /*имя мальчика*/
Andysay(name,name). /*что сказал Андрей*/
Vasasay(name,name). /*что сказал Вася*/
Grishasay(name,name). /*что сказал Гриша*/
Writelistboy. /*целевой предикат*/
Cheking(name,name,name,name).
goal
Writelistboy.
clauses
Boyname("Andy").
Boyname("Vasa").
Boyname("Grisha").
Boyname("Boris").
Andysay(X,Y):-
X="Andy",Y<>"Boris":
X<>"Andy",Y="Boris".
Vasasay(X,Y):-
X="Vasa",Y<>"Andy":
X<>"Vasa",Y="Andy".
Grishasay(X,Y):-
X="Grisha",Y<>"Boris":
X<>"Grisha",Y="Boris".
Writelistboy:-
Boyname(A).
Boyname(B).
A<>B,
Boyname(C).
A<>C,
B<>C,
Boyname(D).
A<>D.
B<>D.
C<>D.
Cheking(A,B,C,D).
Cheking(A,B,C,D):-
Andysay(B,C),
Vasasay(B,A),
Grishasay(B,D),
Write ("Решением данной задачи будет :"),nl,
Write(A),Write(" "),
Write(B),Write(" "),
Write(C),Write(" "),
Write(D),Write(" "),nl,
Write("Нажмите любую клавишу."),nl,
Readchar(E).
Упражнения: Реализовать в среде Турбо-Пролог следующие логические задачи:
1.Петя, Гена, Дима и Вова занимаются в детской спортивной школе в разных секциях: гимнастической, баскетбольной, волейбольной и лёгкой атлетики. Петя, Дима и волейболист занимаются в одном классе. Петя и Гена на тренировки ходят пешком вместе, а гимназист ездит на автобусе. Легкоатлет не знаком ни с баскетболистом, ни с – волейболистом. Определить, кто в какой секции занимается.
2.В семье трое детей. Тоне вдвое больше лет, чем будет Гале тогда, когда Жене исполнится столько же лет, сколько Тоне сейчас. Определить, кто из них самый старший, кто самый младший, кто средний по возрасту.
3.Три мальчика нашли в море старинный сосуд – амфору. Один сказал, что амфору изготовили финикийцы в 5 в. до н. э., второй сказал, что её изготовили греки в 3 в. до н. э., а третий сказал, что она не греческая, а изготовлена в 4 в до н.э. Учитель оглядел амфору и сказал, что каждый из прав только на половину, т.е. у каждого мальчика одно утверждение верное, а другое – ложное. Требуется узнать в каком веке и каким народом изготовлена амфора.
4.Четверо друзей – Алексей Иванович, Фёдор семёнович, Валентин Петрович и Григорий Аркадьевич пошли с детьми в парк. В парке они решили прокатиться на “колесе обозрения”. В кабинах “колеса обозрения” оказались вместе: Алексей Иванович с Лёней, Андрей с отцом Коли, Тима с отцом Андрея, Фёдор Семёнович с сыном Валентина Петровича, Валентин Петрович с сыном Алексея Ивановича. Определить кто является чьим сыном.
5.Мальчики Лёня, Дима, Коля и Алик пошли ловить рыбу. Алик поймал рыбы больше чем Коля. Леня и Дима поймали столько же, сколько Коля и Алик. Лёня и Алик поймали меньше, чем Коля и Дима. Распределить места по количеству улова.