Лекция 1
Общий обзор языка Пролог.
1.1 Пример программы: родственные отношения.
1.2 Факты.
1.3 Вопросы.
1.4 Переменные.
1.5 Конъюнкция целей.
1.6 Правила.
1.7 Конъюнкция в правилах.
1.8 Переменные в теле правила.
1.9 Cтруктура пролог-программы.
| Пролог - | это язык программирования, используемый для решения задач, в которых действуют объекты и отношения между этими объектами. |
Программа на прологе состоит из предложений, которые могут быть фактами, правилами или вопросами.
Введем отношение
-родитель- (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).
Совокупность фактов в прологе называют базой даннах.
К составленной базе данных можно задать вопросы. .
Вопрос
в обычном прологе начинается с ?- yes
Вопрос записывается также, как и факт.
Например:
Когда пролог получает
вопрос, он пытается сопоставить его с базой данных. Такой факт находится, ответ:
да (yes).
?
- parent (bob, pat).
На вопрос no
?-parent
(bob,mary).
Ответ будет нет (no), так как такого факта в базе данных нет.
Можно задать вопрос и узнать
кто родитель liz: X= tom
?-parent
(X, liz).
Здесь X - переменная. Ее величина неизвестна и она может принимать значения. В данном случае ее значением будет объект, для которого это утверждение истинно.
Вопрос : X=tom X= pam
Можно задать вопрос, кто является чьим родителем.
?-parent
(X, bob).
X=pam 

Или найти
такие X и Y, что X является родителем Y.
?-parent
(X, Y).
Y= bob
Y= tom
X= bob
и т.д.
Можно задать более общий
вопрос: Кто является родителем родителя juli. Так как нет отношения grandparent,
то можно разбить на два вопроса:
| ?-parent
(Y, juli), parent (X, Y). X=bob Y=pat |
| ||
При поиске решения
сначала находится Y , а затем по второму условию Х. Y=bob
Вопрос:
Кто внуки тома?:
?-parent
(tom, Y), parent (Y, X).
X=ann
Y=bob
X=pat
И наконец, есть ли
у ann и pat общий родитель? Y=bob
?-parent
(Y, ann), parent(Y, pat).
Введем отношение peбенок
child, обратное к parent "родитель".
Можно было бы определить
аналогично:
Но
можно использовать, что отношение child обратно к parent и записать
в виде утверждения- правила :
child (liz, tom).
Правило
читается так:
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".
Добавим еще одно отношение
в базу данных, унарное, определяющее пол.
Теперь определим
отношение mother. Оно описывается следующим образом:
male(tom).
male(bob).
male(jim).
female(liz).
female(pam).
female(pat).
female(ann).
Для
всех X Y
X -mother Y, if
X- parent Y и
X -female.
Таким
образом правило будет yes
Можно
записать
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,
производится подстановка
?-mother
(pam, bob).
X=pam
Y=bob
Получаем правило
mother(pam,
bob):-
parent(pam, bob),
female(pam).
Сначала удовлетворяются parent , а затем female
Пролог
отвечает: yes X=pam
Вопрос :
?-mother (X, bob).
Определим отношение 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).
предложение -
факт, правило, вопрос
clause fact, rule, goal
состав head head
. .. ?
| |
body body . .
Классификация операционных
систем Виртуальная память
Реализация многозадачности
Системы безопасности Операционная
система Linux Введение в
компьютерные сети Принципы построения вычислительных систем
Базовые технологии локальной сетиСредства
анализа Процедуры и функции Pascal
Язык запросов SQL Программирование
на СИ Брандмауэры Протоколы TCP/IP Файловые
системы Драйверы устройств