Переменные в теле правила.




Пример программы: родственные отношения.

 

Рассмотрим дерево родственных отношений:

 

Факты.

Введем отношение -родитель- (parent) между объектами.
parent (tom, bob).
Это факт, определяющий, что Том является родителем Боба.

parent - имя отношения, tom, bob - его аргументы. Теперь можно записать программу, описывающую все дерево родственных отношений.

 

  parent (pam, bob). parent (tom, bob). parent (tom, liz). parent (bob, ann). parent (bob, pat). parent (mary, ann). parent (pat, juli).  

 

Эта программа состоит из семи предложений (утверждений), clause(клоз).
Каждый клоз записан фактом в виде отношения parent.
При записи фактов надо соблюдать следующие правила:

  • Имена всех отношений и объектов с маленькой буквы.
  • Сначала записывается имя отношения, затем в круглых скобках через запятую объекты.
  • В конце ставится точка.

Еще пример факта:

  like (bob, pam).

Совокупность фактов в прологе называют базой данных.

 

Вопросы.

К составленной базе данных можно задать вопросы..

Вопрос в обычном прологе начинается с ?-
Вопрос записывается также, как и факт.
Например:

  ? - parent (bob, pat). yes  

Когда пролог получает вопрос, он пытается сопоставить его с базой данных. Такой факт находится, ответ: да (yes).

На вопрос

  ?-parent (bob,mary). no  

Ответ будет нет (no), так как такого факта в базе данных нет.

 

Переменные.

Можно задать вопрос и узнать кто родитель liz:

  ?-parent (X, liz). X= tom  

Здесь X - переменная. Ее величина неизвестна и она может принимать значения. В данном случае ее значением будет объект, для которого это утверждение истинно.

Вопрос:

  ?-parent (X, bob). X=tom X=pam    

Можно задать вопрос, кто является чьим родителем.
Или найти такие X и Y, что X является родителем Y.

  ?-parent (X, Y). X= pam Y= bob Y= tom X= bob и т.д.  

 

Конъюнкция целей.

Можно задать более общий вопрос: Кто является родителем родителя juli. Так как нет отношения grandparent, то можно разбить на два вопроса:

1. кто родитель juli. Предположим- Y.

2. кто родитель Y. Предположим- X.


Тогда составной вопрос:

  ?-parent (Y, juli), parent (X, Y). X=bob Y=pat  

При поиске решения сначала находится Y, а затем по второму условию Х.
Вопрос: Кто внуки тома?:

  ?-parent (tom, Y), parent (Y, X). Y=bob X=ann Y=bob X=pat  

И наконец, есть ли у ann и pat общий родитель?

  ?-parent (Y, ann), parent(Y, pat). Y=bob  

 

Правила.

Введем отношение peбенок child, обратное к parent "родитель".
Можно было бы определить аналогично:

  child (liz, tom).

Но можно использовать, что отношение child обратно к parent и записать в виде утверждения- правила:

  child(Y, X):-parent (X, Y).

Правило читается так:

Для всех X и Y
Y -child X, если
X -parent Y.

Правило отличается от факта тем, что факт всегда истина, а правило описывает утверждение, которое будет истинной, если выполнено некоторое условие. Поэтому в правиле выделяют: заключение условие

 

  child(Y, X):- parent (X, Y).
голова head   тело body

 

 

Если условие parent (X, Y). выполняется, то логическим следствием из него будет утверждение child(Y, X).

Как правило используется прологом:

Зададим вопрос

?-child(liz, tom).  

В программе нет данных о child.
Но есть правило, которое верно для всех X Y, в том числе для liz и tom.
Мы должны применить правило для этих значений.
Для этого надо подставить в правило вместо X - tom, a вместо Y - liz.

Говорят, что переменные будут связаны, а операция будет называться подстановкой.
Получаем конкретный случай для правила

Child(liz, tom):-parent (tom, liz).

Условная часть приняла вид
parent (tom, liz).
Теперь надо выяснить выполняется ли это условие. Исходная цель child(liz,tom) заменяется подцелью parent (tom, liz)., которая выполняется, поэтому пролог ответит "yes".

 

Конъюнкция в правилах.

Добавим еще одно отношение в базу данных, унарное, определяющее пол.

  male(tom). male(bob). male(jim). female(liz). female(pam). female(pat). female(ann).

Теперь определим отношение mother. Оно описывается следующим образом:

Для всех X Y
X -mother Y, if
X- parent Y и
X -female.

Таким образом правило будет

  mother(X, Y):-parent(X, Y), female(X).

Можно записать

 

  mother(X, Y):-parent(X, Y),
  female(X).

 


или

  mother(X, Y):-
  parent(X, Y), female(X).

 

Запятая между двумя условиями означает конъюнкцию целей. Это означает, что два условия должны быть выполнены одновремено.
Как система ответит на вопрос?

  ?-mother (pam, bob). yes  

Находится правило mother, производится подстановка

X=pam
Y=bob

Получаем правило

mother(pam, bob):-
parent(pam, bob),
female(pam).

Сначала удовлетворяются parent, а затем female

Пролог отвечает: yes
Вопрос:

?-mother (X, bob). X=pam  

 

Переменные в теле правила.

Определим отношение sister

Для любых X и Y
X sister Y, if
у X и Y есть общий родитель,
и X female

Запишем правило на прологе

 

  sister (X, Y):- parent(Z,X),
  parent(Z,Y), female(X).

 

 

Здесь Z -общий родитель. Z -некоторый, любой.
Можно спросить

?-sister(ann, pat). yes ?-sister(pat, pat). yes  

 

Ответ будет "yes". Так как мы не потребовали, чтобы X и Y были разные.

Добавим отношение different (X, Y), которое указывает,что X и Y разные.

 

  sister (X, Y):- parent(Z,X),
  parent(Z,X), female(X), different (X, Y).

 

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-05-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: