
1.5. Язык логического программирования
Среди языков программирования, используемых для компьютерной реализации описаний окружающего мира на основе исчисления предикатов, наибольшее распространение получил язык логического программирования PROLOG (Programming in Logic). Программа, написанная на этом языке, представляет собой набор спецификаций из логики предикатов первого порядка, описывающих объекты и отношения между ними в предметной области задачи. Такой набор называется базой данных и может легко пополняться и модифицироваться при каких-либо изменениях в окружающем мире. Применение теории предикатов в языке программирования обеспечивает прозрачный интерфейс и хорошо определенную семантику.
PROLOG относится к классу интерпретируемых языков, работающих в интерактивном режиме. Интерпретатор в диалоговом режиме ищет ответ на запрос пользователя, касающийся элементов базы данных, выполняя поиск в базе в глубину слева направо и определяя, является ли данный запрос логическим следствием содержимого базы данных. Запросы представляют собой шаблоны, выполненные в том же логическом синтаксисе, что и записи в базе. Следует отметить, что существуют версии языка, позволяющие проводить компиляцию набора спецификаций для ускорения выполнения программы.
В качестве примера рассмотрим описание «Мир симпатий и антипатий Вани, Тани и Оли», используя единственный предикат – любит (кто, что/кого). База данных для такой задачи может иметь следующий вид:
любит (ваня, таня)
любит (таня, оля)
любит (ваня, мороженное)
любит (оля, мороженное)
любит (таня, кофе)
любит (оля, кофе).
После занесения этих записей в базу данных, интерпретатору можно задавать вопросы и получать ответы:
? – любит(ваня, таня); ответ – да
? – любит(оля, Х); ответ– Х = мороженное, Х = кофе
? – любит(ваня, кофе); ответ – нет.
Как видно, при вводе запроса с конкретными значениями термов интерпретатор отвечает да, если находит в базе запись, совпадающую с запросом, или нет, если такая запись отсутствует. В ответ на запрос с переменной Х выводятся все записи, в которых подстановка констант из области определения переменной Х приводит к отображению в true.
При обработке запросов язык PROLOG опирается на допущение о замкнутости мира, которое подразумевает, что любое выражение считается ложным, если нельзя доказать истинность его отрицания. Это допущение приводит к некоторым трудностям, т.к. фактически означает ложность любого факта, который не включен в базу данных. Например, ответ на запрос ? – любит(ваня, пиво) будет – нет, хотя информация о таком факте просто отсутствует в базе.
В базу данных языка PROLOG можно записать не только спецификации фактов, но и спецификации правил, описывающих взаимосвязи между фактами путем использования логических операций. В различных диалектах языка PROLOG в качестве условных обозначений логических операций используются разные символы. В первом стандарте языка C-PROLOG, разработанном в 1975 – 1980 годах на кафедре искусственного интеллекта университета Эдинбурга Дэвидом Уорреном и Фернандо Перейрой, логическое И (and) обозначалось запятой, ИЛИ (or) – точкой с запятой, а логическая импликация – двоеточием с тире. Например, спецификацию, определяющую понятие друзья, как логическую импликацию результата логического И двух термов любит, можно представить с использованием этих обозначений так: друзья(Х, Y) : – любит(X, Y) , любит(Y, Z).
Если к набору спецификаций из примера «Мир симпатий и антипатий» добавить правило друзья, то интерпретатору можно задать вопрос ? – друзья(ваня, оля). В данном случае переменные в правиле соответствуют X = ваня, Y = оля. Вначале интерпретатор ищет значение переменной Z, при которой любит(ваня, Z) истинно. Первая удовлетворяющая этому условию запись – любит (ваня, таня), т.е. Z = таня. Далее интерпретатор пытается найти запись вида – любит(оля, таня), не находит ее, т.к. любит(таня, оля) формально не соответствует искомому условию, и возвращается к поиску другого Z в записи любит(ваня, Z). Следующее значение Z, для которой запись существует в базе данных, мороженное. Дальнейший поиск записи вида любит (оля, мороженное) заканчивается успехом, что подтверждает истинность запроса. Таким образом, интерпретатор установил, что Ваня и Оля являются друзьями, на почве обоюдной любви к мороженному.
Следует отметить, что, как видно из этого примера, в языке PROLOG, организован поиск в глубину с возвратами, подробно описанный в следующем разделе, причем последовательность просмотра записей определяется их порядком в базе данных.