Скачиваний:
201
Добавлен:
17.06.2016
Размер:
2.69 Mб
Скачать

Как переменные получают свои значения

Вы могли заметить, что Пролог не имеет оператора присваивания, что

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

Переменные в Прологе получают свои значения в результате сопоставления

констант в фактах и правилах.

До тех пор, пока переменная не получила какого-либо значения, она

называется "свободной". Когда же переменная примет значение - она стано-

вится "связанной". Однако она остается связанной только в течение време-

ни, необходимого для получения одного ответа на запрос; после этого Про-

лог "развязывает" ее, возвращается и ищет альтернативные решения.

Это очень важный момент: вы не можете хранить информацию, задавая

значения переменным. Переменные служат частью процесса "сопоставления об-

разцов", а не "хранилищем" информации какого-либо типа.

Рассмотрим следующий пример, использующий программу CH03EX03.PRO для

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

/*Программа CH03EX03.PRO*/

predicates

likes (symbol, symbol)

clauses

likes (ellen, reading).

likes (john, computers).

likes (john, badminton).

likes (leonard, badminton).

likes (eric, swimming).

likes (eric, reading).

Составим запрос: есть ли люди, которым нравится и чтение, и плавание

(reading и swimming)?

likes (Person, reading) and likes (Person, swimming).

Пролог будет решать обе части этого запроса, просматривая предложе-

ния программы сверху вниз. В первой части запроса

likes (Person, reading)

переменная Person свободна; ее значение неизвестно перед попыткой

Пролога найти решение. С другой стороны второй аргумент (reading) - из-

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

факт программы

likes (ellen, reading)

подходит ("reading" в этом факте сопоставляется с "reading" в запросе),

поэтому Пролог связывает свободную переменную Person со значением

"ellen", соответствующим значению факта. В то же самое время Пролог фик-

сирует указатель в списке фактов, индицируя им насколько глубоко опусти-

лась процедура поиска.

Далее, для полного разрешения запроса (поиска человека, которому

нравится и чтение (reading), и плавание (swimming)) должна быть решена

вторая часть запроса. Т.к. переменная Person теперь связана с "ellen", то

Пролог должен найти факт

likes (ellen, swimming)

Пролог ищет этот факт с самого начала программы, но не находит его,

т.к. соответствующего факта просто нет. Таким образом, если Person равно

"ellen", то вторая часть запроса - ложна.

Тогда Пролог "развязывает" переменную Person и пытается найти другое

решение первой части запроса при условии, что Person вновь свободна. По-

иск следующего факта, удовлетворяющего первой части запроса, начинается с

указателя в списке фактов. (Этот возврат на последнее отмеченное место

известен под термином "поиск с возвратом", который описывается в Гла-

ве 5.)

Пролог ищет следующего человека , которому нравится чтение, и нахо-

дит факт likes (eric, reading). Теперь Person связывается с "eric" и Про-

лог вновь пытается разрешить вторую часть запроса, но на этот раз он ищет

в программе факт

likes (eric, swimming).

Теперь Пролог находит то, что ищет (последнее предложение програм-

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

Person=eric

1 Solution

Соседние файлы в папке Документация