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

Здесь мы воспользуемся описанным ранее правилом является_сестрой. Правило определяет предикат является_сестрой, имеющий два аргумента, таким образом, что является_сестрой(X, Y) истинно, если X является сестрой Y. Обратим внимание на использование в имени предиката символа подчеркивания '_'. Хотя до сих пор не было дано полных правил конструирования имен, отметим, что допускается использование подчеркивания в именах, а более подробно об этом будет сказано в следующей главе. Тогда X является сестрой Y, если:

X является женщиной,

X имеет мать М и отца F и

Y имеет тех же мать и отца, что и X.

Это можно записать в виде следующего правила Пролога:


является_сестрой(X,Y):- женщина(X), родители(X,M,P), родители(Y,M,P).


Мы используем переменные M и F для обозначения матери и отца, хотя при желании мы могли бы использовать имена Мать и Отец. Отметим, что мы употребляем переменные, которые не появляются в заголовке правила. Эти переменные, M и F, обрабатываются таким же образом, как и любая другая переменная. Когда Пролог использует это правило, переменные M и F изначально будут неконкретизированными. Этим переменным будет присвоено некоторое значение в момент установления соответствия для предиката родители(X,M,F). Однако, как только они конкретизируются, становятся конкретизированными и все вхождения переменных M и F

, соответствующие текущему использованию правила. Следующий пример должен помочь объяснить, как используются эти переменные. Давайте зададим вопрос:


?- является_сестрой(алиса,эдуард).


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

1. Сначала вопрос сопоставляется с единственным правилом для предиката является_сестрой, приведенным выше. При этом переменная X конкретизируется, принимая значение алиса, и переменная Y конкретизируется значением эдуард. Правило, с которым произошло сопоставление, отмечается маркером. Теперь Пролог пытается последовательно согласовать с базой данных три предиката, входящие в тело правила.

2. Так как на предыдущем шаге переменной X присвоено значение алиса, то первой целью является женщина(алиса). Истинность этого предиката следует из списка фактов, так что цель достигнута. Поскольку данная цель согласована, то Пролог отмечает соответствующее ей место в базе данных (третье утверждение в базе данных). При этом не произошло никаких присвоений значений переменным. Далее Пролог пытается согласовать следующую цель.

3. Теперь Пролог ищет соответствие для предиката родители(алиса,M,F), где переменные M и F сопоставимы с любыми аргументами, так как первоначально они неконкретизированы. Факт, с которым происходит сопоставление, есть родители(алиса, виктория,альберт), и тем самым вторая цель достигнута. Пролог отмечает маркером соответствующее место в базе данных (шестое утверждение сверху) и записывает, что M присвоено значение виктория, a F – значение альберт. (Если хотите, вы можете делать соответствующую запись над целевым утверждением в правиле.) Затем Пролог пытается найти соответствие для следующего предиката в правиле.

4. Теперь Пролог ищет в базе данных факт родители(эдуард,виктория,альберт), так как из запроса нам известно, что Y – это эдуард, а из предыдущего шага мы знаем, что M и F обозначают виктория и альберт. Эта цель достигается, поскольку найден подходящий факт (пятое утверждение сверху). Так как это последняя цель в конъюнкции, то и полное целевое утверждение является согласованным с базой данных, и тем самым доказано, что факт является_сестрой(алиса, эдуард)

является истинным, Пролог отвечает да.

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


?- является_сестрой(алиса,X).


В ответ на вопрос Пролог выполняет следующие действия:

1. Вопрос сопоставляется с заголовком единственного правила для предиката является_сестрой. Переменная X, входящая в это правило, конкретизируется значением алиса. Так как переменная X в запросе неконкретизирована, то и переменная Y в правиле также будет неконкретизированной. Однако эти две переменные теперь становятся сцепленными. Как только одной из переменных присваивается некоторое значение, другая переменная становится конкретизированной тем же самым значением. Конечно, в данный момент они неконкретизированы.

2. Первая цель – женщина(алиса), которая достигается так же, как и в предыдущем примере.

3. Вторая цель – родители(алиса,М,F). Эта цель сопоставляется с родители(алиса,виктория,альберт). Переменные M и F становятся конкретизированными.

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже