Базу фактов в программе на языке Пролог составляют утверждения, описывающее факты предметной области в виде структур, функторами которых являются атомы - имена отношений (предикатные буквы), а компонентами - предметные константы.
Пример 1
Пусть необходимо составить на языке Пролог программу конструирования башен в чрезвычайно простой предметной области.
Башня представляет собой сооружение из крыши и поддерживающего ее ствола. Крыша может быть призматической высотой 4 м или плоской высотой 1 м. Ствол башни может состоять из 1, 2 или 3 блоков одинаковой формы. Цилиндрические блоки имеют высоту 5 и 3 м, а блоки в виде параллелепипеда — 4 и 2 м.
Тогда факты могут быть представлены в виде утверждений языка Пролог следующим образом.
roof(prizm, 4). /* 1 */
roof(plane, 1). /* 2 */
block(cyl, 5). /* 3 */
block(cyl, 3). /* 4 */
block(par, 4). /* 5 */
block(par, 2). /* 6 */
Здесь каждый факт представляет собой элементарную формулу (предикат) ИППП и является дизъюнктом Хорна, состоящим из одного (положительного) литерала.
Отметим, что согласно синтаксису языка Пролог каждое утверждение должно заканчиваться точкой, а символы, заключенные между /* и */, считаются комментарием. В нашем примере в качестве комментариев используются номера утверждении.
Подчеркнем, что при описании фактов переменные не используются.
Система программирования Пролог позволяет ставить запросы к базе фактов, касающиеся непосредственного ее содержимого. Простейшим видом запроса является запрос на проверку наличия в базе какого-либо факта, имеющий вид:
?-структура.
Здесь структура описывает необходимый факт. Пытаясь ответить на такой запрос, интерпретатор Пролога ищет факт, имеющий тот же функтор (предикатную букву), что и содержащийся в запросе, и далее попарно сопоставляет компоненты двух структур, выдавая ответ Yes или No в зависимости от результата сопоставления.
Пример 2
Ниже представлены запросы к нашей базе фактов (левая колонка символов) и ответы на них (правая колонка).
?-block(cyl, 3). Yes
?-roof(plane, 2). No
?-block(prizm, 4). No
?-roof(plane). No
?-base(strip, 1). No
Примечание 1
С точки зрения метода резолюции, реализованного в интерпретаторе Пролога, поиск ответа на запрос - это применение правила резолюции к отрицанию целевого утверждения (теоремы) и факту (представляющему собой простейший вид дизъюнкта Хорна) с целью вывода пустого дизъюнкта.
Более полезными с точки зрения пользователя и более сложными с точки зрения формирования ответа являются запросы, содержащие переменные в качестве компонент структуры. Поиск ответа на такой запрос связан с использованием механизма конкретизации переменных значениями в процессе сопоставления структур, представляющих собой запрос и факт. В рамках языка Пролог считается, что переменная, как компонента структуры, всегда сопоставима с компонентой (любым термом) другой структуры, находящейся в той же самой позиции, что и переменная (естественно, при условии, что функторы структур совпадают). Если переменная сопоставляется с константой или структурой, то значением переменной становится эта константа или структура. Случай сопоставления двух переменных (называемый связыванием) будет рассмотрен ниже. Ответом на запрос, содержащий переменные, служат значения этих переменных.
Пример 3
Ниже представлен фрагмент диалога пользователя с системой программирования Пролог, касающийся фактов об элементах строительных конструкций.
?-roof(prizm, H). H = 4
?-block(F, 3). F = cyl
?-block(F, H). F = cyl, H = 5
; F = cyl, H = 3
; F = par, H = 4
; F = par, H = 2
; No
Здесь слева приведены запросы пользователя, а справа - ответы на них. Первый запрос позволяет узнать высоту крыши призматической формы, второй - выяснить, какова форма блока, имеющего высоту 3. Третий запрос предназначен для вывода из базы фактов всей имеющейся информации о блоках.
Рассмотрим подробно процесс обработки интерпретатором последнего запроса в примере. Получив его, интерпретатор просматривает базу фактов, начиная с самого первого утверждения, пока не удастся сопоставить целевое утверждение с третьим фактом. Здесь интерпретатор выдает значения конкретизированных переменных запроса, устанавливает специальный маркер (указатель) на утверждение 3 и переходит в состояние ожидания реакции пользователя. Пользователь, желая продолжить просмотр базы фактов, вводит специальный символ ";" (точка с запятой), сигнализируя интерпретатору о продолжении поиска.
Интерпретатор а) расконкретизирует переменные, делая их опять неопределенными, и б) продолжает сопоставление, начиная с утверждения, непосредственно следующего за отмеченным маркером.
Приведенные выше запросы к базе фактов являются лишь частным случаем допустимых в языке Пролог целевых утверждений. Но прежде, чем рассмотреть их общий случай, необходимо ознакомиться с организацией арифметических вычислений в языке Пролог и с некоторыми встроенными в него предикатами.