Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛабПрактикум(1-5)_ПЗ в ИС_2011 .doc
Скачиваний:
27
Добавлен:
19.11.2019
Размер:
1.56 Mб
Скачать

Понятие предиката

Теоретической основой Пролога является раздел символьной логики, называемый исчислением предикатов. Предикат - это логическая функция, которая выражает некоторое отношение между своими аргументами и принимает значение "истина", если это отношение имеется или "ложь", если оно отсутствует.

Рассмотрим понятие предиката в Прологе на примере родословной Рюриковичей.

Вначале запишем отношения типа родитель – ребенок. В синтаксисе Пролога выражение «Игорь является родителем Святослава» выглядит следующим образом:

parent (игорь, святослав).

Здесь родитель parent – это имя предиката, а «игорь» и «святослав» – аргументы. Аргументы игорь и святослав являются константами, поэтому записаны строчными буквами. С прописной буквы в Прологе начинаются переменные. Точка означает конец предиката, так же, как и конец предложения на естественном языке.

Рис. 1.1. Родословная Рюриковичей

Запишем также родительские отношения для других членов генеалогического дерева:

parent(рюрик, игорь). parent(ефанда, игорь).

parent(ольга, святослав). parent (игорь, святослав).

parent(святослав, святополк).parent(куно, святополк). и т.д.

Полученный набор предикатов образует базу знаний.

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

? parent(ефанда, игорь).

Эта цель может быть прочитана следующим образом: Является ли Ефанда родителем Игоря? Сопоставив эту цель с содержимым базы знаний, Пролог установит, что данное утверждение истинно и сообщит об этом.

Запрос «Кто является родителями Игоря?» в Прологе выглядит следующим образом:

? parent(X, игорь).

Здесь X является переменной, которой должны быть присвоены искомые значения. Переменная в Прологе является аналогом местоимения или вопросительного слова. Из приведенной выше базы знаний Пролог извлечет два ответа:

X = рюрик

X = ефанда

Мы можем сформулировать вопрос следующим образом: Есть ли у Игоря родители?

parent(_, игорь).

Пролог выдаст ответ: Yes.

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

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

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

? parent(X, ярослав), parent(Y, X).

Данная запись означает: Найти Y, являющийся родителем X, который, в свою очередь, является родителем Ярослава. Запятая в прологе идентична союзу "И" или конъюнкции. В ответ на такой запрос Пролог выдаст следующий ответ:

X = святослав

Y = малуша

Можно выдать следующий запрос:

? parent(ольга, _ ).

Теперь анонимная переменная использована в качестве второго аргумента.

Этот запрос можно прочитать следующим образом: Есть ли у Ольги дети?

Пролог выдаст ответ: Yes.

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

Таким образом, программа на Прологе состоит из предикатов.

Программа на Прологе и база знаний - синонимы. Цель формулируется также в виде предикатов. Выполнение программы на Прологе – это резолюция цели.