Материал: Терёхин В. В. Turbo Prolog

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

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

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

Бет любит это, если Мэри любит это

потому, что вы не знаете, что обозначает местоимение "это".

Но, если вы опять посмотрите на предпосылки, то обнаружите, что

Мэри любит яблоки

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

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

любит Мэри яблоки любит Бет это (яблоки), если Мэри любит это (яблоки)

Теперь может быть получен новый факт: Бет любит яблоки. Выше этот факт был получен с использованием только семантики русского языка. В следующем разделе рассматривается, как этот же способ логического вывода используется в логике предикатов.

2.2.2 Пролог и логика предикатов

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

Вам уже встречалась следующая конструкция:

Отношение

Объект

Объект

Любит

Мэри

яблоки

Отношение "любит" связывает объекты "Мэри" и "яблоки" в конструкцию, обладающую определенным смыслом. Отношение "любит" может

быть также названо предикатом:

 

Предикат

Объект

Объект

любит

Мэри

яблоки

16

То же самое может быть записано в виде

предикат(объект1,объект2)

или

любит (Мэри, яблоки)

Эта синтаксическая форма очень близка к синтаксису Турбо-Пролога. Но слова, начинающиеся с прописных букв, являются переменными языка Пролог. Объекты с известными или постоянными значениями должны начинаться со строчных букв, если они не являются числами. (Строго говоря, существуют исключения из этого правила; в последующих главах это будет объяснено). Тогда, используя синтаксис Турбо-Пролога, этот факт будет иметь вид:

любит(мэри, яблоки).

Заметьте, что это выражение заканчивается точкой. Точка означает: "Здесь конец части информации".

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

Второе предложение с использованием синтаксиса Турбо-Пролога имеет вид:

отношение(объект1,объект2) условие отношение(объект1,объект2)

любит (бет, X) если любит (мэри, X) Это предложение является правилом по терминологии Турбо-

Пролога. Само название подразумевает, что правило используется Прологом для проверки условия вывода нового факта. Все известные отношения, касающиеся Мэри, Бет и яблок с использованием синтаксиса Турбо-Пролога имеют вид:

любит(мэри, яблоки).

любит(бет, X) если любит (мэри, X).

Эти знания включают один факт "Мэри любит яблоки" и одно правило "Бет любит это, если Мэри любит это". Вы знаете, по крайней мере, одно значение для переменной X (или слова "это"), так как известен факт, что Мэри любит яблоки. Местоимение "это" обозначает "яблоки", так что переменная X имеет значение "яблоки".

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

17

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

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

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

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

2.3 Управление программой

Теперь вы знаете, что Турбо-Пролог строит заключения на основе логических соотношений, определенных в программе. В этом разделе объясняется, каким образом входные данные и логические связи программы совместно используются для генерации выходного результата.

Предикатная конструкция, называющаяся целью, используется для запуска процесса выполнения программы. Турбо-Пролог пытается сопоставить цель с фактами и правилами программы. Если цель является фактом, таким как "любит(мэри, яблоки)", то Турбо-Пролог отвечает True (истина) или False (ложь); если цель содержит переменные, то Турбо-Пролог выдает либо те их значения, которые приводят к решению, если оно существует, либо сообщение No solutions (решений нет).

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

18

2.3.1 Цели программы

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

После того, как Турбо-Пролог запущен, он не выполняет ничего полезного до тех пор, пока ему не встретится оператор цели. Цель состоит из взаимосвязанных предикатов. Ее структура точно такая же как у правила или факта. В примере с Мэри, Бет и яблоками отношением (символом предиката) является "любит". Тот же самый символ "любит" может быть использован как цель. Предикат цели сопоставляется с предикатами в программе, так что цель в этом примере будет иметь объект, как и предикат "любит", рассмотренный ранее. Цель будет иметь вид:

любит(бет,яблоки).

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

2.3.2 Решение задачи

Пусть программа на Турбо-Прологе содержит факт

likes(mary, apples).

/* Мэри любит яблоки */

и правило

 

likes(beth, X) if likes(mary,X). /* Бет любит это, если Мэри любит это */

Предположим также, что программа уже запущена и запросила вас ввести

цель. Вы ввели

 

likes(beth,apples).

/* бет любит яблоки */

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

Первое сопоставление выполняется с фактом likes(mary,apples).

Очевидно, что терм предиката цели, likes, сопоставим с таким же термом в факте. Так как предикаты likes сопоставимы, Турбо-Пролог попытается сопоставить первый объект цели beth с первым объектом факта mary. Турбо-Пролог пытается сопоставлять термы слева направо до тех пор, пока очередное сопоставление окажется неуспешным. Сравним цель и факт:

likes(beth, apples). likes(mary, apples).

Первые объекты beth и mary несопоставимы. Следовательно, вся попытка сопоставить цель и факт будет неуспешной. Турбо-Пролог не бу-

19

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

likes(beth,X) if likes(mary,X).

Первая часть этого правила likes(beth,X) называется головой правила. Пролог пытается сопоставить цель с головой правила точно также, как он сопоставляет цель с фактом. Если Турбо-Пролог сможет сопоставить предикат и все его объекты, то он попытается выполнить часть правила, которая следует за условием if (эта часть называется телом правила).

Сейчас Турбо-Пролог пытается сопоставить цель likes(beth, apples) и голову правила likes(beth, X) :

likes(beth, apples). likes(beth, X).

Цель и голова правила имеют сопоставимые предикатные термы и первые объекты. Строго говоря, apples и X не сопоставимы. Но прежде чем заключить, что сопоставление опять неуспешно, вспомните, что X работает как местоимение "это". Являясь переменной, X, может быть сопоставлен с чем угодно.

В русском языке значение для "это" определяется контекстом. Всякий раз, когда Турбо-Пролог встречает переменную, пытаясь сопоставить объекты, он присваивает переменной значение, полученное из контекста для этой переменной. Так как позиция объекта X в голове правила точно такая же, как позиция apples в цели, то Турбо-Пролог присваивает значение apples переменной X. Теперь X и apples означают для Турбо-Пролога одно и то же. Это связывание используется до тех пор, пока либо цель не будет вычислена, либо нельзя будет выполнить никакого другого сопоставления с учетом этого связывания.

Так как теперь X имеет значение apples, то предикат likes(beth, X) имеет "значение" likes(beth, apples). Турбо-Пролог успешно сопоставил голову правила и цель, присвоив значение apples переменной X.

Теперь Турбо-Пролог пытается выполнить условие if likes(mary, X). Так как переменной X присвоено значение aplles, то Турбо-Пролог должен доказать или опровергнуть условие "если Мэри любит яблоки" для того, чтобы доказать действительно ли истинна голова правила "Бет любит яблоки". Таким образом, новая задача состоит в том, что бы проверить, что Мэри любит яблоки. Эта "подзадача", или подцель, была создана самим ТурбоПрологом как шаг, направленный на решение задачи, содержащейся в цели. Подцелью теперь является

likes(mary, aplles).

Турбо-Пролог пытается выполнить эту подцель для того, чтобы доказать или опровергнуть условие головы правила likes(beth, apples).

Анализируя факты и правила программы, Турбо-Пролог находит факт likes(mary, apples).

и пытается сопоставить его слева направо с целью likes(mary,apples).

20