Запросы (вопросы, цели)

Чтобы программа, написанная на языке Пролог, начала работу, к ней нужно обратиться с запросом.

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

Очень часто оказывается необходимым формулировать запросы, относящиеся к некоторой группе предметов. Для построения таких запросов используют логические переменные, которые служат для обозначения неопределенных предметов. Запрос с переменной ?А(Х), смысл которого передается фразой «Существует ли такое значение X, что А(Х) истинно?», рассматривается как утверждение о существовании такого значения X = а, при котором А(а) истинно. В логике подобные утверждения записываются с помощью кванторов существования.

Однако в логическом программировании кванторы существования обычно не пишутся, но подразумеваются.

Предикаты

Предикат — это имя свойства или отношения между объектами с последовательностью аргументов.

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

Например, факт

black (cat).

записан с использованием предиката black, имеющего один аргумент.

Факт

railway (novosibirsk, omsk).

записан с использованием предиката railway, имеющего два аргумента.

Число аргументов предиката называется арностью предиката и обозначается black/1 (предикат black имеет один аргумент, его арность равна единице). Предикаты могут не иметь аргументов, арность таких предикатов равна 0.

Переменные

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

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

Пример:

First_list

X

Person

City

Переменная, не имеющая значения, называется свободной, переменная, имеющая значение — конкретизированной.

В Прологе нет оператора присваивания, его роль выполняет оператор равенства «=».

Если записать следующую цель:

..., Х=5, ...

то как эта цель будет рассматриваться, как сравнение или как присваивание, зависит от того, получила ли какое-либо значение переменная X к моменту доказательства этой цели. Если переменная X имеет значение (например, равное 6), то оператор равенства работает как оператор сравнения. Если же переменная X свободна (не имеет никакого значения), то оператор равенства работает как оператор присваивания. При этом совершенно неважно, слева или справа от знака равенства находится имя переменной. Главное, чтобы она была свободной. С точки зрения программы на Прологе следующие две строки совершенно одинаковы:

...> х = 5, ...

. .., 5 = X, ...

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

..X = X + 5, ...

В любом случае такая цель будет ошибочной. Действительно, если переменная X имеет, например, значение, равное 10, то предыдущая цель сводится к доказательству цели:

..., 10 = 10 + 5, ...

что, естественно, доказать нельзя.

Если же переменная X свободна, то нельзя к переменной, не имеющей никакого значения, прибавить 5, и присвоить эту неопределенность той же самой переменной. Как же тогда быть, если нужно изменить значение переменной? Ответ один — использовать новое имя, поскольку переменная, которая появляется в тексте программы впервые, считается свободной, и может быть конкретизирована некоторым значением:

..., Y = X + 5, ...

При этом опять же не важен порядок записи. Такая цель также будет правильной, и будет выполнять присваивание (конечно, если переменная X конкретизирована некоторым числом):

..X + 5 = Y, ...

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

Рассмотрим пример:

parent («Владимир», «Михаил»).

parent («Владимир», «Светлана»).

parent («Анна», «Михаил»), parent («Анна «, « Светлана»).

Факты описывают родителей и их детей (первый аргумент — имя родителя, второй — имя ребенка). Теперь, если нужно узнать только имена родителей, но не нужны имена детей, к программе можно обратиться с внешним запросом, использовав анонимную переменную:

Goal: parent (Person, _).

Решение в данном случае будет избыточным, поскольку есть четыре факта.

Person = Владимир Person = Владимир Person = Анна Person = Анна 4 Solutions

Сравните, если использовать запрос:

Goal: parent (Person, Child).

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

Person = Владимир, Child = Михаил Person = Владимир, Child = Светлана Person = Анна, Child = Михаил Person = Анна, Child = Светлана 4 Solutions

 
Посмотреть оригинал
< Пред   СОДЕРЖАНИЕ   ОРИГИНАЛ     След >