Программирование на языке пролог
ModernLib.Net / Программирование / Клоксин У. / Программирование на языке пролог - Чтение
(стр. 2)
Автор:
|
Клоксин У. |
Жанр:
|
Программирование |
-
Читать книгу полностью
(715 Кб)
- Скачать в формате fb2
(716 Кб)
- Скачать в формате doc
(1 Кб)
- Скачать в формате txt
(1 Кб)
- Скачать в формате html
(503 Кб)
- Страницы:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24
|
|
Имена такого типа называются
переменными.Переменная в Прологе может иметь либо не иметь конкретное значение. Переменная конкретизирована, если имеется объект, который обозначает эта переменная. Переменная не конкретизирована, если еще не известно, что именно она обозначает. В Прологе используется соглашение, позволяющее отличать переменные от имен конкретных объектов –
каждое имя, начинающееся с прописной буквы, рассматривается как переменная.
При поиске ответа на вопрос Пролог организует просмотр всех фактов в базе данных, чтобы обнаружить объект, который эта переменная могла бы обозначать. Так, когда мы спрашиваем
«Нравится ли Джону X?»,Пролог просматривает все известные ему факты для обнаружения тех вещей, которые нравятся Джону.
Такая переменная, как
X, сама по себе не является именем какого-то конкретного объекта, но она может быть использована для обозначения объектов, которым мы не можем дать имя. Например, мы не можем
чему-то, что нравится Джону,дать имя как объекту, поэтому для выражения подобных вопросов вместо вопросов вида
?- нравится(джон,
Что-то, что любит Джон).
Пролог позволяет использовать переменные и задавать вопросы в виде
?- нравится(джон,Х).
При желании можно давать переменным более длинные имена. Следующий вопрос вполне приемлем в Прологе:
?- нравится(джон, Что-точтонравитсяджону).
Почему? Потому что переменной может быть любое имя, начинающееся с прописной буквы. Рассмотрим следующую базу данных и запрос к Прологу:
нравится (джон,цветы).
нравится (джон,мэри).
нравится(поль,мэри).
?- нравится(джон,Х).
В вопросе спрашивается:
Существует ли что-нибудь, что нравится Джону?В ответ Пролог напечатает:
Х=цветы
а затем будет ждать дальнейших приказов; это мы вкратце обсудим далее. Как это произойдет? При поступлении такого вопроса в Пролог-систему переменная, входящая в вопрос, изначально является неконкретизированной. Пролог просматривает базу данных в поисках факта,
сопоставимогос вопросом. Если неконкретизированная переменная появляется в качестве аргумента, то Пролог считает, что такой аргумент сопоставим с
любымдругим аргументом, находящимся в той же самой позиции факта. В нашем примере Пролог ищет любой факт с предикатом
нравитсяи первым аргументом
джон.
Второйаргумент в этом случае может быть каким угодно, так как в вопросе вторым аргументом является неконкретизированная переменная. При обнаружении такого факта переменная
Xстановится конкретизированной, обозначая объект, являющийся вторым аргументом найденного факта, каким бы этот аргумент ни был. Пролог просматривает факты базы данных в том порядке, в каком они вводились (на печатной странице это соответствует просмотру сверху вниз), поэтому факт
нравится(джон, цветы)найден первым. С этого момента переменная
Xобозначает объект
цветыили, говоря другими словами, переменная
Xконкретизируется значением
цветы. Пролог с помощью специального
маркераотмечает место в базе данных, в котором произошло сопоставление. Обсудим кратко причины, по которым оказалось необходимым использование такого маркера.
Обнаружив факт, соответствующий вопросу, Пролог печатает имена объектов, которые теперь обозначают переменные. В нашем примере есть только одна переменная
X, которой соответствует объект
цветы. Затем Пролог ждет дальнейших указаний, как об этом говорилось выше. Если в этой ситуации нажать на терминале клавишу
RETURN, указывая тем самым, что вы удовлетворены полученным ответом, то Пролог прекратит дальнейший поиск в базе данных. Если вместо этого нажать клавишу
;(и вслед за ней клавишу
RETURN), то Пролог продолжит поиск в базе данных,
начиная с места, отмеченного маркером.В такой ситуации, когда Пролог начинает поиск не с начала базы данных, а с места, отмеченного маркером, мы говорим, что Пролог пытается заново согласовать вопрос.
Предположим, что в ответ на первое найденное Прологом соответствие (
Х=цветы) мы предлагаем системе продолжить поиск (введя
;). Это значит, что мы хотим согласовать вопрос иначе; мы хотим найти другой объект, который могла бы обозначать переменная
X. Это также значит, что Пролог должен «забыть» о том, что переменная
Xобозначает
цветы, и снова продолжить поиск с неконкретизированной переменной
X. Так как мы ищем альтернативное решение, то поиск продолжается с места, отмеченного маркером. Следующий найденный системой факт, соответствующий вопросу, есть
нравится(джон,мэри).Переменная
Xвновь становится конкретизированной, обозначая
мэри,а Пролог отмечает маркером факт
нравится(джон,мэри).Пролог напечатает
Х=мэрии будет ожидать дальнейших команд. Если мы вновь введем точку с запятой, то Пролог продолжит поиск. В нашем примере нет больше ничего, что нравится Джону. Поэтому Пролог завершит поиск и предоставит нам возможность сделать новые запросы или ввести новые факты.
Что произойдет, если, имея те же факты, что и ранее, мы зададим вопрос:
?- нравится(Х,мэри).
В этом вопросе спрашивается:
«Существует ли объект, которому нравится Мэри?».Теперь вы сами можете понять, что в примере объектами, которые нравятся Мэри, являются
джони
поль. Опять, если бы мы хотели увидеть все варианты, мы должны были бы вводить; после каждого ответа, выдаваемого Прологом:
?-
нравится(Х, мэри).
наш вопрос
Х=джон;
первый ответ. Мы вводим
;
Х=поль;
второй ответ. Вновь вводим
;.
нет
больше ответов нет.
1.4. Конъюнкции
Предположим, что мы хотим получать ответы на вопросы о более сложных отношениях, таких как:
«Нравятся ли Джон и Мэри друг другу?».Один из способов сделать это – узнать сначала, нравится ли Джону Мэри, и если Пролог ответит да, то спросить, нравится ли Мэри Джон. Таким образом, эта задача состоит из двух «целевых утверждений» (или целей), которые Пролог должен согласовать. Ввиду того что подобная комбинация часто используется при программировании на Прологе, для нее имеется специальное обозначение. Предположим, мы имеем следующую базу данных:
нравится(мэри,пища).
нравится(мэри,вино).
нравится(джон,вино).
нравится(джон,мэри).
Мы хотим узнать, нравятся ли Джон и Мэри друг другу. Для этого мы спрашиваем:
«Нравится ли Джон Мэрии
нравится ли Мэри Джон?».Связка
ивыражает тот факт, что нас интересует конъюнкция двух указанных целей – мы хотим последовательно согласовать с базой данных обе цели. Мы выражаем это в вопросе, записывая обе цели через запятую:
?- нравится(джон,мэри),нравится(мэри,джон).
Запятая читается как «и» и используется для разделения произвольного числа различных целей, которые должны быть согласованы с базой данных для того, чтобы ответить положительно на вопрос. Если задана последовательность целей (разделенных запятыми), то Пролог пытается согласовать каждую цель по очереди, просматривая базу данных в поисках сопоставимых фактов. Чтобы согласовать с базой данных последовательность целей, необходимо согласовать все отдельные цели. Что должен напечатать Пролог в ответ на приведенный выше вопрос? Ответ будет
нет. Действительно, так как имеет место факт, что Джону нравится Мэри, то первая цель согласуется с базой данных. Однако вторая цель не согласуется с базой данных, так как в ней отсутствует факт
нравится(мэри,джон). Учитывая, что мы хотели знать, нравятся ли они
обадруг другу, окончательным ответом на вопрос является
нет.
Сочетая возможности конъюнкции и использования переменных, можно строить достаточно содержательные вопросы. Теперь, когда мы знаем, что нельзя выяснить, нравятся ли Джон и Мэри друг другу, мы спрашиваем:
«Существует ли что-нибудь такое, что нравится обоим-
Джону и Мэри?».Этот вопрос также содержит две цели:
• Существует ли такой объект
X, который нравится Мэри.
• Нравится ли Джону найденное значение
X.
В Прологе два указанных целевых утверждения следует объединить, используя конъюнкцию, как показано ниже:
?- нравится(мэри,Х), нравится(джон,X).
Пролог отвечает на вопрос, пытаясь подобрать соответствие для первой цели. Если в базе данных есть факт, соответствующий целевому высказыванию, то Пролог отметит найденное место и попытается согласовать вторую цель. Если и она достигнута, то Пролог также отмечает в базе данных соответствующее ей место, и таким образом находится решение, удовлетворяющее обеим целям.
Важно помнить, что каждая цель имеет свой собственный маркер для указания места в базе данных,
гденайдены соответствующие им факты. Если, однако, вторая цель не согласуется с базой данных, то Пролог попытается найти новое соответствие для предыдущей цели (в данном случае для первой цели). Помните, что Пролог полностью просматривает базу данных для каждой из целей. Если случится так, что некоторый факт в базе данных можно сопоставить с заданной целью, то Пролог отметит это место в базе данных на случай, если впоследствии он будет вынужден снова искать для этой цели другое соответствие. И когда возникнет необходимость найти для цели другое соответствие, Пролог начнет поиск не с начала базы данных, а с места, отмеченного маркером, соответствующим этой цели. Наш предыдущий вопрос:
«Существует ли что-нибудь, что нравится и Мэри и Джону?»иллюстрирует пример такого поиска с возвратом («бектрекинга»). Пролог выполняет следующую последовательность действий:
1. База данных просматривается в попытке согласовать первую цель. Так как второй аргумент
(X)неконкретизирован, то ему может соответствовать все что угодно. Первый факт, сопоставимый с целью, в приведенной выше базе данных есть
нравится(мэри, пища).С этого момента
каждомупоявлению переменной
Xв вопросе соответствует значение
пища.Пролог отмечает в базе данных то место, где был обнаружен соответствующий факт, так что при необходимости найти другой способ согласования цели с фактами он может вернуться в эту точку и продолжить поиск. Более того, следует помнить, что переменная
Xбыла конкретизирована в этой точке и Пролог может «забыть» найденное для
Xзначение в случае необходимости найти новое соответствие в фактах для рассматриваемой цели.
2. Теперь в базе данных ищется факт
нравится(джон,пища),так как следующая цель – это
нравится (джон,X), а переменная
Xтеперь имеет значение
пища.Как можно видеть, база данных такого факта не содержит, так что эта цель с базой данных не согласуется. В этой ситуации мы должны попытаться найти новое соответствие в фактах для предыдущей цели. Поэтому Пролог предпринимает попытку найти новое соответствие для
нравится(мэри,X), при этом поиск в базе данных начинается с отмеченного маркером места. Но сначала необходимо «расконкретизировать» переменную
Xтак, чтобы
Xопять могла быть сопоставлена с любым объектом.
3. Отмеченным маркером местом является факт
нравится(мэри, пища).Поэтому Пролог начинает поиск со следующего непосредственно за ним факта. Так как мы еще не достигли конца базы данных, то мы не исчерпали всех объектов, которые нравятся Мэри. Следующим сопоставимым фактом является
нравится(мэри, вино).Теперь переменная
Xпринимает значение
вино,и Пролог отмечает это место на случай, если потребуется найти новое соответствие для того, что нравится Мэри.
4. Как и ранее, Пролог пытается теперь согласовать с фактами вторую цель в вопросе, осуществляя поиск в базе данных факта
нравится(джон,вино).Пролог не пытается при этом использовать механизм поиска нового соответствия для этой цели. Это новая цель, которую он выбирает, продвигаясь, как и раньше, слева направо по списку целей в исходном вопросе, поэтому он должен начать поиск с начала базы данных. Когда после недолгого поиска будет найден сопоставимый факт, Пролог выдает надлежащее сообщение. Как только вторая цель согласована, Пролог отмечает соответствующий ей факт в базе данных на случай, если вдруг потребуется найти для нее новое соответствие. Для каждой цели, которую Пролог пытается согласовать, в базе данных имеется свой маркер, указывающий факт, поставленный в соответствие этой цели.
5. Теперь обе цели согласованы. Переменная
Xобозначает имя
вино.Маркер первого целевого утверждения отмечает в базе данных факт
нравится(мэри,вино),а маркер второго целевого утверждения отмечает факт
нравится(джон,вино).
Как и в случае других запросов, как только Пролог находит ответ, он прекращает поиск и ожидает дальнейших указаний.
Если ввести
;, то Пролог продолжит поиск объектов, которые нравятся одновременно Джону и Мэри. Теперь мы знаем, что все последующие попытки поиска новых ответов на вопрос с двумя целями начинаются с мест, отмеченных маркерами, которые оставили эти цели на предыдущем этапе.
Подводя итог, можно представить конъюнкцию целей в вопросе как список целей, упорядоченных слева направо и разделенных запятыми. Каждая цель может иметь соседа слева и соседа справа. Ясно, что цели, занимающие в списке крайнее левое и крайнее правое положения, не будут иметь соседей соответственно слева и справа. Обрабатывая конъюнкцию целей, Пролог пытается по очереди согласовать с базой данных каждую цель, просматривая вопрос слева направо. Если обнаруживается факт, сопоставимый с целью, то Пролог оставляет в этом месте базы данных маркер, связанный
сцелью. Это можно наглядно представить с помощью стрелки, ведущей от цели к некоторому месту в базе данных, где находится соответствующий факт. Кроме того, некоторые ранее неконкретизированные переменные могут при этом быть конкретизированы, как это имело место выше на шаге 1. Если некоторая переменная конкретизируется, то конкретизируются и все вхождения этой переменной в вопрос. Далее Пролог пытается удовлетворить правого соседа этой цели, начиная поиск с вершины базы данных (наполнение базы данных в Прологе осуществляется сверху вниз, так что вершина – это факт, внесенный в базу данных первым). Как и любая другая цель, для которой найдено соответствие, она оставляет после себя в базе данных маркер (проводит еще одну стрелку от этой новой цели к соответствующему ей факту), на случай если впоследствии возникнет необходимость найти для цели другое соответствие. Каждый раз, когда целевое утверждение не выполняется (нельзя найти сопоставимого факта), Пролог возвращается и пытается найти новое соответствие для соседа
слеваданной цели, начиная поиск с места, отмеченного соответствующим ему маркером. Кроме того, Пролог должен сначала расконкретизировать все переменные, которые были конкретизированы при достижении этой цели. Другими словами, когда Пролог ищет новое соответствие для цели, он должен «уничтожить» старое значение этих переменных. Если для цели, к рассмотрению которой был возврат справа, нельзя найти новое соответствие, то Пролог перейдет еще левее, постепенно приближаясь к левой границе конъюнкции. Если не удается найти новое соответствие для крайней слева цели, которая уже не имеет соседа слева, то в этом случае считается несогласуемой с базой данных вся конъюнкция целей в вопросе к Прологу. Такое поведение, когда Пролог неоднократно пытается согласовать (и вновь согласовать) цели, входящие в вопрос-конъюнкцию, называется поиском с возвратом (бектрекингом). В следующей главе дается краткое описание механизма возврата, а в гл. 4 проводится более полное и детальное рассмотрение этого процесса.
Разбирая примеры, полезно записывать под каждой переменной, входящей в целевое утверждение, значение (имя объекта), которое было присвоено этой переменной при установлении согласованности цели с базой данных. Следует также изображать стрелки, идущие от цели к соответствующему ей маркеру в базе данных. На рис. 1.1 приведен пример такой иллюстрации на бумаге работы Пролога, состоящий из четырех «мгновенных снимков» процесса поиска в приведенном выше примере. На каждом снимке показаны полная база данных и вопрос, а также пронумерованная последовательность комментариев. На рисунке цели, для которых найдены соответствия, заключены в прямоугольник.
На протяжении всей книги мы постараемся показать, где в рассматриваемых примерах имеет место возврат и какую роль он играет в решении задачи. Значение механизма возврата при поиске настолько велико, что ему полностью посвящена гл. 4.
Упражнение 1.1.Продолжить разбор рассмотренного выше примера с помощью карандаша и бумаги, предположив, что вы ввели точку с запятой;, инициируя возврат для того, чтобы определить, существует ли еще что-нибудь, что нравится одновременно Джону и Мэри.
Рис. 1.1.
1.5. Правила
Предположим, мы хотим сформулировать утверждение, что Джону нравятся все люди. Один из способов сделать это заключается в записи для каждого человека, упоминаемого в базе данных, отдельного факта:
нравится(джон,альфред).
нравится(джон,бертран).
нравится(джон,чарлз).
нравится(джон,дейвид).
* * *
Это было бы очень утомительным, особенно если в нашей программе на Прологе упоминается несколько сот человек. Другой способ выразить факт, что Джону нравятся все люди, - это сказать
Джону нравится любой объект при условии, что этот объект является человеком.Здесь этот факт представлен в форме
правиладля определения того, что нравится Джону, а не прямого перечисления всех людей, которые ему нравятся. В ситуации, когда Джону мог бы нравиться любой человек, представление утверждения в виде правила является значительно более компактным, чем список фактов.
В Прологе правила используются в том случае, когда необходимо сказать, что некоторый факт
зависитот группы других фактов. В естественном языке для выражения правила мы можем использовать слово
если.Например:
•
Я пользуюсь зонтом, если идет дождь.
•
Джон покупает вино, если оно дешевле, чем пиво.
Правила используются также для выражения определений, например:
Xявляется птицей, если:
Xявляется живым существом и
Xимеет перья.
или
Xявляется сестрой
Y, если:
Xявляется женщино и
Xи
Yимеют одних и тех же родителей.
В последних примерах мы использовали переменные
Xи
Y. Важно помнить, что каждое вхождение переменной в правило обозначает один и тот же объект. Иначе мы разрушили бы саму суть определения. Например, используя приведенное выше определение птицы, мы не смогли бы показать, что Фред является птицей на основании того, что Фидо – это живое существо, а Мэри имеет перья. Этот принцип согласованной интерпретации переменных справедлив также и для правил в Прологе.
Правило – это некоторое
общее утверждение об объектах и об отношениях между ними.Например, мы можем сказать, что Фред является птицей, если Фред является живым существом и Фред имеет перья, мы можем также сказать, что Бертрам является птицей, если Бертрам является живым существом и Бертрам имеет перья. Таким образом, мы допускаем, что при каждом новом
использованииправила переменная обозначает новый, отличный от прежнего объект. Конечно, в рамках конкретного использования правила переменные интерпретируются согласованно, как на это указывалось выше.
Рассмотрим несколько примеров, начав с правила, содержащего одну переменную и конъюнкцию:
Джону нравится любой, кому нравится вино,или,
другими словами,
Джону нравится что-то, если чему-то нравится вино,
или, используя переменные,
Джону нравится
X, если
Xнравится вино.
В Прологе правило состоит из
заголовкаи
телаправила. Заголовок и тело соединяются с помощью символа :-, который состоит из двоеточия
:и тире
-. Символ ':-' читается
если.
Предыдущий пример записывается на Прологе следующим образом:
нравится(джон,X):- нравится(Х,вино).
Отметим, что правила также заканчиваются точкой. Заголовком этого правила является нравится(джон,Х). Заголовок правила описывает факт, для определения которого предназначено это правило. Тело правила, в данном случае нравится(Х,вино), описывает конъюнкцию целей, которые должны быть последовательно согласованы с базой данных, для того чтобы заголовок правила был истинным. Например, мы можем сделать Джона более разборчивым в выборе тех, кто ему нравится, просто добавив к телу правила еще несколько целевых утверждений, разделив их запятыми:
нравится(джон,X):- нравится(Х,вино), нравится(X,пища).
или, другими словами,
Джону нравится любой, кому нравятся вино и пища.Или, предположим, что Джону нравится любая женщина, которой нравится вино:
нравится(джон,Х):- женщина(Х), нравится(Х,вино).
Всякий раз, когда мы имеем дело с правилом в Прологе, необходимо отмечать все вхождения переменных. В последнем примере переменная
Xиспользована три раза. Всякий раз, как переменная X конкретизируется некоторым объектом (ей присваивается значение), все вхождения
Xв пределах
области действия этой переменнойстановятся конкретизированными. При каждом употреблении правила
область действияпеременной
X– это все правило, начиная с заголовка и до точки '.' в конце этого правила. Так, если в приведенном выше правиле переменная X оказалась конкретизированной, принимая значение
мэри,то Пролог попытается согласовать с базой данных целевые утверждения
женщина(мэри)и
нравится(мэри,вино).
Теперь, чтобы продемонстрировать правило, использующее более одной переменной, рассмотрим базу данных, содержащую факты о семействе королевы Виктории. Мы будем использовать предикат
родители,имеющий три аргумента.
родители(Х, Y, Z)означает:
Родителями
X
являются
Y
и
Z. Переменная
Yобозначает мать, а переменная
Zобозначает отца. Кроме того, мы будем использовать предикаты
женщинаи
мужчинав их очевидном значении. Некоторая часть этой базы данных могла бы выглядеть следующим образом:
мужчина(альберт).
мужчина(эдуард).
женщина(алиса).
женщина(виктория).
родители(эдуард,виктория,альберт).
родители(алиса,виктория,альберт).
Здесь мы воспользуемся описанным ранее правилом
является_сестрой.Правило определяет предикат
является_сестрой, имеющий два аргумента, таким образом, что
является_сестрой(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становятся конкретизированными.
4. Так как переменная
Yпока неизвестна, то третьей целью будет
родители(Y,виктория,альберт),и она сопоставляется с
родители(эдуард, виктория,альберт).Переменная
Yконкретизируется значением
эдуард.
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24
|
|