Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
пособие_Пролог_часть1.doc
Скачиваний:
44
Добавлен:
13.11.2019
Размер:
1 Мб
Скачать
☆

3.2.3. Правила.

Кроме фактов, логические программы могут содержать правила, условные предложения языка Пролог. Правила  это средство определения новых утверждений, используя уже существующие в Прологпрограмме утверждения (факты и правила).

С точки зрения синтаксиса языка Пролог правило это утверждение вида A: B1,B2,…Bn. (n0) где A  заголовок правила, а конъюнкция предикатов B1,B2,…Bn называется телом правила.

В правилах, так же как и в фактах, переменные неявно связаны квантором всеобщности. Например, утверждение «Точка с координатами (X,Y) принадлежит окружности с радиусом, равным 2, и с центром в точке начала координат, если X2+Y2=4.» на Прологе будет записано следующим образом:

circle(X,Y): X^2+X^2=4. что означает для любых X и Y, таких что X^2+X^2=4, точка (X,Y) принадлежит окружности с радиусом, равным 2, и с центром в точке начала координат.

В Прологпрограмме может быть записано произвольное число фактов и правил. Набор правил, заголовки которых имеют одно и то же имя и арность, описывает одно и то же отношение и называется процедурой.

3.2.4. Подстановки и примеры утверждений.

Логические переменные служат для обозначения неопределенных объектов. Областью действия переменной является одно утверждение (факт или правило).

Подстановкой называется конечное (возможно, пустое) множество пар вида Xi = ti, где Xiпеременная, а tiтерм, не содержащий переменную Xi. Результат применения подстановки  к утверждению A обозначается A и получается путем замены каждого вхождения в A каждой переменной Xi на соответствующий терм ti.

Утверждение B является примером утверждения A, если найдется такая подстановка , что B=A. Например, факт summa(1,2,3), которое означает, что 1+2=3, является примером утверждения summa(X,Y,3) при применении подстановки ={X=1,Y=2}.

Утверждение С называется общим примером утверждений A B, если найдутся такие подстановки 1 и 2, что C=A1 и C=B2, т.е. C является примером A и B одновременно. Например, факт summa(1,2,3) является общим примером утверждений summa(X,2,Z) и summa(1,Y,Z) при применении подстановок 1={X=1,Z=3} и 2={Y=2,Z=3}.

3.2.5. Пример Прологпрограммы.

П

Эд

рограмма «Родственники» является примером простой Прологпрограммы. На рис 2. показано трехуровневое генеалогическое дерево.

Родственные отношения можно записать с помощью фактов, соответствующие отношению parent:

parent(‘Памелла’,’Джон’).

parent(‘Памелла’,’Элизабет’).

parent(‘Том’,’Джон’).

parent(‘Том’,’Элизабет’).

parent(‘Джон’,’Анна’).

parent(‘Джон’,’Пат’).

parent(‘Элизабет’,’Эд’).

parent(‘Пат’,’Джим’).

Расширим эту программу фактами, определяемыми схемой отношения person.

person(‘Памелла’,’ж’,72).

person(‘Том’,’м’,78).

person(‘Джон’,’м’,42).

person(‘Элизабет’,’ж’,35).

person(‘Эд’,’м’,14).

person(‘Анна’,’ж’,20).

person(‘Пат’,’ж’,25).

person(‘Джим’,’м’,3).

Теперь мы можем задавать Прологпрограмме вопросы, используя оба отношения.

Вопрос 1.

Вопрос ”Является ли Пат родителем Джима?” на Прологе можно задать следующим образом:

?-parent(‘Пат’,’Джим’).

Пролог-система будет искать в программе факт, совпадающий с вопросом, и, обнаружив такой факт, система выдаст ответ ‘YES’. В случае, когда соответствующий факт не обнаружен, система выдаст ответ ‘NO’.

Вопрос 2.

Вопрос ”Кто отец Элизабет и сколько ему лет?” на Прологе можно задать следующим образом:

?-parent(Х,’ Элизабет’),person(X,’м’, Y).

Пролог-система выдаст ответ:

X=’Том’->

Y=78->

YES

Если возраст не интересует пользователя, то в вопросе используется анонимные переменные, обозначаемые знаками подчеркивания ‘_’.

Вопрос 3.

Вопрос ”Кто отец Элизабет?” на Прологе можно задать следующим образом:

?-parent(Х,’ Элизабет’),person(X,’м’, _).

Пролог-система выдаст ответ:

X=’Том’->

YES

Приведенные примеры вопросов относятся к программе, состоящей из одних фактов. Для того чтобы сократить и упростить вопросы в Пролог—программах задаются правила.

Вопрос 3 можно упростить, если задать следующее правило:

“X является отцом Y, если X является родителем Y, и X – мужчина.”

На языке Пролог это правило записывается так:

father(X,Y):-parent(X,Y),person(X,’м’,_).

А вопрос 3 записывается следующим образом:

?-father(X,’Jim’).