Декларативные Языки Программирования

 
 

 

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

 

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

 

            Если база данных "знает" просмотрена интерпретатором, то можно написать, к примеру, такой запрос к ней:

            ¦ ?— знает (мэри, боб) .

 

Это означает вопрос: "Знает ли Мэри Боба?''. Интерпретатор найдет соответствующий факт в базе данных и ответит:

            да

 

Данный ответ можно трактован, так: "Да, Мэри знает Боба".

 

Запросы с константами

 

            Если в запрос не входят переменные, то интерпретатор выдает один из двух ответов:

            да

или

            нет

Ответ да свидетельствует о том, что интерпретатор смог доказать истинность запроса в соответствии с множеством фраз, загруженным в данный момент времени. Ответ нет означает, что интерпретатор оказался не в состоянии доказать истинность запроса.

 

Запросы с переменными

 

            Переменная — это вид терма, который записывается как слово, начинающееся с большой буквы, к примеру, X или «Кто». Если в запрос входят переменные, то интерпретатор попытается отыскать такие их значения, при которых запрос будет истинным. Запрос

            ¦ ? - знает (мэри, Кто).

означает: "Кого знает Мэри?"

 

Квалификация переменной в запросе

 

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

            Существует ли хотя бы один человек, которого знает Мэри?

Этот запрос будет истинным, если такое лицо будет найдено в текущей базе данных "знает".

Выполнение запроса

 

            Интерпретатор пытается унифицировать (т.е. согласовать) аргументы запроса с аргументами фактов, входящих в базу данных "знает". В рассматриваемом случае запрос окажется успешным при сопоставлении запроса с первым же фактом, поскольку атом "мэри" в запросе унифицируется с атомом "мэри" в этом факте, а переменная "Кто" унифицируется с атомом "боб", входящим в факт. В результате данного процесса переменная « Кто » примет значение атома "боб", и интерпретатор ответит:

            Кто = боб

 

Конкретизация

 

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

 

Более чем один ответ

 

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

            ¦?-знает (А, Б).

            А = мэри

            Б = боб;

Ввод символа ; после первого ответа означает отказ от ответа. Это побуждает интерпретатор приступить к поиску другого ответа:

            А = сэм Б = боб :

            А = сэм

            Б = патриция  ;

            нет

Интерпретатор нашел три ответа на запрос. Последний ответ — нет — означает, что интерпретатор достиг конца базы данных "знает" и оказался больше не в состоянии отыскать еще какие-либо ответы.

 

Порядок выдачи ответов

 

Заметьте, что интерпретатор находит ответы в базе данных "знает"; точно в том порядке, в каком факты вводились в базу. После отыскания первого ответа на запрос интерпретатор запоминает положение этого ответа в базе данных "знает". Если пользователь введет символ ; , то интерпретатор начнет поиск нового ответа со следующей фразы "знает". Но если пользователь нажмет клавишу возврата каретки (return), то интерпретатор "забудет" положение последнего ответа в базе данных "знает" и вернется к сообщению-подсказке верхнего уровня, ¦ ?—.

 

Продолжительность существования переменных

 

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

 

Составные запросы

 

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

            ¦ ? — знает (мэри, А), знает (сэм, А).

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

            А = боб ;

            нет

Первый ответ, А = боб, показывает, что Боба знают одновременно и Мэри, и Сэм. Второй ответ, нет, свидетельствует о том, что Боб — это единственный их общий знакомый.

 

Аргументы как входные и выходные параметры

 

            Выдача запроса — это единственный способ дать команду интерпретатору Пролога на выполнение программы. Использование константы в качестве аргумента запроса (скажем, констант "мэри" или "сэм" в последнем примере) эквивалентно заданию входного параметра программы. Любой положительный ответ должен унифицироваться с константой. Использование переменной в качестве аргумента запроса (скажем, переменной А в последнем примере) эквивалентно требованию получить от программы выходные данные.

 

Переменная _

 

            Символ подчеркивания _ выступает в качестве анонимной переменной, которая предписывает интерпретатору проигнорировать значение аргумента. Анонимная переменная унифицируется с чем угодно, но не обеспечивает выдачу на терминал выходных данных. Каждая переменная _, входящая в запрос, отличается от всех других переменных этого запроса.

            Посмотрим, к примеру, что произойдет, если ввести запрос:

            ¦ ?-знает(Б, _).

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

            Б = мэри;

            Б = сэм;

            Б = сэм;

            нет

Вверх

Назад

 

 
 


Web-дизайн  © Лыгин К.И.

Hosted by uCoz