Язык Prolog. Термы и объекты. Факты и элементарные вопросы
Термы и объекты
В Прологе объекты (т.е. элементы) универсума рассуждения представляются с помощью термов так же, как в логике. В силу того, что язык эти термы не интерпретирует, объекты сами являются термами - синтаксическими объектами одной из следующих категорий:
· индивидные константы (атомы)
· переменные
· функции (функциональные термы), состоящие из имени функции и списка аргументов-термов
Синтаксис различает атомы, переменные и функции. Используемые соглашения сообразны конкретным применениям. Здесь мы используем синтаксис Си-Пролога. Однако выбор конкретной версии языка Пролог не влияет на различие между переменной (именем нарицательным) и константой (именем собственным).
· Атом записывается тремя способами:
- как идентификатор, начинающийся со строчной буквы жаклин генрих_4 (допускается использование подчёркивания)
- как число 123 1.23
- как произвольную последовательность символов, расположенную между апострофами `Что Вы говорите' `Больше нечего сказать'
· Переменная - это идентификатор, начинающийся с прописной буквы Х Имя Король_Франции
· Функция - это имя функции, за которым следует список термов, помещённых в скобки и разделённых запятыми. Имя функции - это нечисловой атом.
автор(книга, 1987) f(X) `Что ты говоришь?'(штука)
На практике прологовская программа представляет собой некую действительность, а термы - реальные объекты. Например, при описании библиотеки атомами будут имена авторов и/или издателей, годы издания, названия и т.д., а функциями - издательства и/или книги:
издат(дюно, 1987) книга(жюль_верн, мишель_строгофф, издат(этцель, 1876))
Каждый атом - это отдельный объект, считающийся элементарным. Предпочтительны мнемонические идентификаторы, а не анонимные (вроде х2 и bb). То же относится и к функциональным термам: лучше взять издат(_,_), а не и(_,_). Отметим, что в программе на Прологе функциональный терм является структурой данных, сложным объектом, который можно эффективно построить или анализировать. Это не функция, сопоставляющая результат набору аргументов.
Данные (константы) Пролога - это термы, не имеющие переменных. В логике они называются индивидными термами (а также константными термами). Числовые атомы - это константы для программирования численных расчётов.
Факты и элементарные вопросы
Простые предикаты (атомарные формулы и/или предикатные формы) формальной логики, такие, как Автор(Эрнани,Гюго)принимают значения И или Л. Почти то же самое имеет место для фактов и вопросов Пролога, не содержащих переменных. Простой предикат Пролога записывается в виде функционального терма, например:
автор(эрнани.гюго) дифф(Х,Х,1) Предикат от функции отличают по контексту. Простые предикаты являются составляющими базы фактов и вопросов. Приведём пример небольшой программы, представляющей собой множество фактов:
/* библио*/
книга(грэм, `рассуждать, чтобы программировать' ,издат(дюно,1986)).
книга(кондиляк, `пролог', издат(дюно,1986)).
книга(дьедонне, `математика', издат(эрман,1986)).
книга(гюго, `отверженные', издат(пош,1984)).
книга(гюго, `эрнани', издат(галлимар,1974)).
книга(хартман, `параллельный паскаль', издат(шпрингер,1977)).
библиотекарь(эмиль).
начальник(эмиль, анри).
начальник(жозев, анри).
идёт_дождь.
Точка, стоящая после предиката, указывает на то, что рассматриваемое выражение является фактом. Первая строка - это комментарий: любая последовательность символов, записанная между парой ограничителей /* и */, при выполнении игнорируется. Каждый факт, содержащийся в программе, имеет соответствующее значение истинности и порождает (определяет) отношение между термами. Например, двухместное отношение (предикат) начальник установлено между термами эмиль и анри, а трёхместное отношение книга - для 6 троек термов и т.д. Последний факт в приведённом примере - идёт дождь - является нульместным отношением (не имеющим аргументов).
Множество фактов можно рассматривать как реляционную БД. Впрочем, мы употребляем понятие базы данных для обозначения множества фактов и правил некой программы.
Из простых предикатов строят также вопросы, например: ? - начальник(эмиль, анри).
Это выражение нового факта не устанавливает, но «система запрашивает о том, установлен или нет данный факт. Значение вопроса (т.е. ответ) зависит от БД. В нашем примере вопрос простой, переменные и правила отсутствуют. Значение есть И, если в БД содержится факт с предикатом вопроса. В противном случае значение есть Л. Всё это интуитивно ясно. На практике задаётся последовательность «вопрос - ответ»:
? - начальник(эмиль, анри).
- - > да
Таким образом, простейшие программы на Прологе регистрируют элементарные факты в БД и отвечают на вопросы, связанные с этими фактами. Сама же БД определяет некие расширения содержащихся в ней отношений. Например: идёт_дождь, начальник(_,_), библиотекарь(_) и книга(_,_,_). Простые вопросы, не содержащие никаких переменных, называются да-нет-вопросами. Они допускают лишь два возможных ответа в соответствии с тем, имеется или отсутствует подходящий факт в БД. Семантика вопроса определяется состоянием БД при поиске ответа. Для БД библио имеем:
? - книга(грэм, `рассуждать, чтобы программировать' ,издат(дюно,1986)).
- - - > да
? - книга( `рассуждать, чтобы программировать' ,издат(дюно,1986)).
- - - > нет
? - начальник(эмиль, генри).
- - - > нет
? - идёт_дождь(сейчас)
- - - > нет
Так как в Прологе нет объявления и контроля типов, то нет и ошибок программирования. Неверно написанное пользователем имя для системы является новым атомом: анри и генри - два атома, которые не имеют ничего общего. Бинарное отношение не годится в качестве тернарного, зато тернарное отношение задаёт три бинарных отношения с одинаковыми именами - для трёх пар из трёх аргументов: отношения книга(_,_) и книга(_,_,_) для системы различны, чем и обусловлен ответ на второй приведённый выше вопрос.
Друзья! Приглашаем вас к обсуждению. Если у вас есть своё мнение, напишите нам в комментарии.