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

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

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 (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).



Синтаксис Пролога

 

Программа на прологе состоит из предложений. Предложения трех видов: факты, правила, вопросы. Все предложения строятся из термов.

Термявляется синтаксической единицей.
     
     

 

Константы

Константы - это поименованные конкретные объекты или отношения.
Атомы - аналогичны атомам или символам в Лиспе.
Атомы могут задаваться:

1) Цепочкой букв, цифр и символом подчеркивания '_', начиная со строчной буквы.

a
sister
x_23

2) специальными символами*: = = =>

Числа
Целые (диапазон -32768 32767)
Действительные (диапазон 1Е-307 1Е+308)

 







Переменные

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

Имена переменных могут начинаться:
- или с прописной буквы
- или с символа подчеркивания

X
Y
Result
_result

Eсли значение переменной не интересует, то можно использовать анонимные переменные в виде символа подчеркивания '_'.

Например,






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


Здесь значение Y не интересует, можно записaть


Haschild(X):-parent(X, _).


Значение анонимной переменной не выводится на печать. Если несколько анонимных переменных, то они все разные. Использование анонимных переменных позволяет не выдумывать имена переменных, когда не надо.

Пусть задано отношение parents для двух родителей.


Parents(ann, tom, bob).


Тогда в правиле:


Child(X):-parents(_, _, X).

 дв е анонимные переменные разные.

! Внимание. Область действия переменных - одно предложение.

 
     
     

Одноименные переменные в разных предложениях могут иметь разные значения.

Структуры

Структура - это единый объект состоящий из совокупности других объектов, называемых компонентами.
Компоненты в свою очередь могут быть также структурами.

Структура data:

Название структуры стоит перед скобками, а компоненты внутри скобок, через запятую.

Название структуры - ФУНКТОР.

Структуры можно изображать в виде деревьев:

data / | \ 27 april 1992

Структура может иметь вид:

       owns(bob, book(moby_dick, mell_will)).

Структуры можно использовать, например,  для представления геометрических фигур.

Объекты:

точка Р1=point(1, 1)
точка Р2=point(3, 3)
отрезок seg(P1, P2)
или
seg(point(1, 1), point(3, 3)).
треугольник  - triangle(point(2, 5), point(2, 8), point(5, 8))

Cтруктуру всегда можно представить в виде дерева.

Корень дерева - главный функтор.

Если точка трехмерного пространства: point3(X, Y, Z),
то можно записать: point(X, Y, Z).
Получается: point(X, Y, Z) и point(X, Y)

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

  • именем
  • арностью - т.е. числом атомов

Удобно арность писать следующим образом:

point/2
point/3

Например, если написано: Отношение point/2 означает, что задано point(_,_)

 











Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: