Лекция 1
Общий обзор языка Пролог.

Cодержание

1.1 Пример программы: родственные отношения.
1.2 Факты.
1.3 Вопросы.
1.4 Переменные.
1.5 Конъюнкция целей.
1.6 Правила.
1.7 Конъюнкция в правилах.
1.8 Переменные в теле правила.
1.9 Cтруктура пролог-программы.

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

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

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

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

1.2 Факты.

Введем отношение -родитель- (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).

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

1.3 Вопросы.

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

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

? - parent (bob, pat).

yes

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

На вопрос

?-parent (bob,mary).

no

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

1.4 Переменные.

Можно задать вопрос и узнать кто родитель 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
и т.д.

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

Можно задать более общий вопрос: Кто является родителем родителя 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

1.6 Правила.

Введем отношение 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".

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

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

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

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

Определим отношение 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.9 Cтруктура пролог-программы.

предложение- факт,правило,вопрос
clausefact,rule,goal
составheadhead
...?
||
bodybody
..

Классификация операционных систем Виртуальная память Реализация многозадачности
Системы безопасности Операционная система Linux Введение в компьютерные сети Принципы построения вычислительных систем Базовые технологии локальной сетиСредства анализа Процедуры и функции Pascal Язык запросов SQL Программирование на СИ Брандмауэры Протоколы TCP/IP Файловые системы Драйверы устройств