Логическое программирование
Правила
Кроме фактов программы на языке Пролог могут содержать правила, позволяющие получать дополнительные знания о том мире, который описывает программа. Правило задает новый предикат через определенные ранее.
Правило состоит из головы (предиката) и тела (последовательности предикатов, разделенных запятыми). Голова и тело разделены знаком :- и, подобно каждой фразе Пролога, правило должно заканчиваться точкой. Запятая в теле правила означает конъюнкцию (&&, логическое и ).
Знак :- есть схематическая запись стрелки (<-) и показывает, что из правой части следует левая. Этот знак читается как " если ". Интуитивный смысл правила состоит в том, что цель, являющаяся головой, будет истинной, если Пролог сможет показать, что все выражения (подцели) в теле правила являются истинными.
Пример
Правило, определяющее отношение ребенок/2 через отношение отец/2, запишется следующим образом:
ребенок(X, Y) :- отец(Y, X).
Это означает, что если человек Y является для человека X отцом, то X является ребенком Y. Здесь X и Y - переменные. Напомним, что запись ребенок/2 показывает, что предикат ребенок является функцией от двух аргументов.
Пример
Определим отношение мать/2 через отношения родитель/2 и женщина/1 следующим образом: матерью X для человека Y является его родитель женского рода.
мать(X, Y) :- родитель(X, Y), женщина(X).
Предикаты отличаются друг от друга не только именем, но и количеством аргументов. Можно, например, определить отношение мать/1 следующим образом:
мать(X) :- родитель(X, _), женщина(X).
Так как нам в данном предикате не важно, чьим родителем является данная женщина, то мы использовали анонимную переменную.
?- мать(X, Y). X=анна Y=юлия Yes ?- мать(X). X=анна Yes
Пример
Определим отношение дедушка/2:
дедушка(X, Y) :- отец(X, Z), отец(Z, Y). дедушка(X, Y) :- отец(X, Z), мать(Z, Y).
Эти правила утверждают, что дедушкой X для человека Y является отец человека Z, который в свою очередь является отцом или матерью человека Y.
Задания
- Создайте файл, содержащий следующую базу данных:
(скопировать файл1
женщина(анна). женщина(юлия). женщина(галина). женщина(елена). мужчина(борис). мужчина(антон). мужчина(олег). мужчина(павел). родитель(анна,юлия). родитель(анна,антон). родитель(анна,борис). родитель(олег,юлия). родитель(олег,антон). родитель(олег,борис). родитель(галина,анна). родитель(галина,елена). родитель(борис,павел). женщина(анна). мужчина(борис). женщина(юлия). мужчина(олег). женщина(галина). мужчина(антон). женщина(елена). мужчина(павел). родитель(борис,павел). % кто чей родитель(анна,юлия). родитель(анна,антон). родитель(анна,борис). родитель(олег,юлия). родитель(олег,антон). родитель(олег,борис). родитель(галина,анна). родитель(галина,елена).
- Добавьте правила, задающее отношения отец/2, мать/2, мать/1 и дедушка/2, после чего сформулируйте запросы, определяющие всех матерей и дедушек в данной базе.
- Определите отношение сестра/2 через отношения родитель/2 и женщина/1.
- Сформулируйте правило, определяющее отношение тетя/2 через отношения родитель/2 и сестра/2.