» » »

Язык Prolog. Термы и объекты. Факты и элементарные вопросы.

  Язык Prolog. Термы и объекты. Факты и элементарные вопросы

Термы и объекты

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

· индивидные константы (атомы)

· переменные

· функции (функциональные термы), состоящие из имени функции и списка аргументов-термов

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

· Атом записывается тремя способами:

- как идентификатор, начинающийся со строчной буквы жаклин генрих_4 (допускается использование подчёркивания)

- как число 123 1.23

- как произвольную последовательность символов, расположенную между апострофами `Что Вы говорите' `Больше нечего сказать'

· Переменная - это идентификатор, начинающийся с прописной буквы Х Имя Король_Франции

· Функция - это имя функции, за которым следует список термов, помещённых в скобки и разделённых запятыми. Имя функции - это нечисловой атом.

автор(книга, 1987) f(X) `Что ты говоришь?'(штука)

На практике прологовская программа представляет собой некую действительность, а термы - реальные объекты. Например, при описании библиотеки атомами будут имена авторов и/или издателей, годы издания, названия и т.д., а функциями - издательства и/или книги:

издат(дюно, 1987) книга(жюль_верн, мишель_строгофф, издат(этцель, 1876))

Каждый атом - это отдельный объект, считающийся элементарным. Предпочтительны мнемонические идентификаторы, а не анонимные (вроде х2 и bb). То же относится и к функциональным термам: лучше взять издат(_,_), а не и(_,_). Отметим, что в программе на Прологе функциональный терм является структурой данных, сложным объектом, который можно эффективно построить или анализировать. Это не функция, сопоставляющая результат набору аргументов.

Данные (константы) Пролога - это термы, не имеющие переменных. В логике они называются индивидными термами (а также константными термами). Числовые атомы - это константы для программирования численных расчётов.

Факты и элементарные вопросы

Простые предикаты (атомарные формулы и/или предикатные формы) формальной логики, такие, как Автор(Эрнани,Гюго)принимают значения И или Л. Почти то же самое имеет место для фактов и вопросов Пролога, не содержащих переменных. Простой предикат Пролога записывается в виде функционального терма, например:

автор(эрнани.гюго) дифф(Х,Х,1) Предикат от функции отличают по контексту. Простые предикаты являются составляющими базы фактов и вопросов. Приведём пример небольшой программы, представляющей собой множество фактов:

/* библио*/

книга(грэм, `рассуждать, чтобы программировать' ,издат(дюно,1986)).

книга(кондиляк, `пролог', издат(дюно,1986)).

книга(дьедонне, `математика', издат(эрман,1986)).

книга(гюго, `отверженные', издат(пош,1984)).

книга(гюго, `эрнани', издат(галлимар,1974)).

книга(хартман, `параллельный паскаль', издат(шпрингер,1977)).

библиотекарь(эмиль).

начальник(эмиль, анри).

начальник(жозев, анри).

идёт_дождь.

Точка, стоящая после предиката, указывает на то, что рассматриваемое выражение является фактом. Первая строка - это комментарий: любая последовательность символов, записанная между парой ограничителей /* и */, при выполнении игнорируется. Каждый факт, содержащийся в программе, имеет соответствующее значение истинности и порождает (определяет) отношение между термами. Например, двухместное отношение (предикат) начальник установлено между термами эмиль и анри, а трёхместное отношение книга - для 6 троек термов и т.д. Последний факт в приведённом примере - идёт дождь - является нульместным отношением (не имеющим аргументов).

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

Из простых предикатов строят также вопросы, например: ? - начальник(эмиль, анри).

Это выражение нового факта не устанавливает, но «система запрашивает о том, установлен или нет данный факт. Значение вопроса (т.е. ответ) зависит от БД. В нашем примере вопрос простой, переменные и правила отсутствуют. Значение есть И, если в БД содержится факт с предикатом вопроса. В противном случае значение есть Л. Всё это интуитивно ясно. На практике задаётся последовательность «вопрос - ответ»:

? - начальник(эмиль, анри).

- - > да

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

? - книга(грэм, `рассуждать, чтобы программировать' ,издат(дюно,1986)).

- - - > да

? - книга( `рассуждать, чтобы программировать' ,издат(дюно,1986)).

- - - > нет

? - начальник(эмиль, генри).

- - - > нет

? - идёт_дождь(сейчас)

- - - > нет

Так как в Прологе нет объявления и контроля типов, то нет и ошибок программирования. Неверно написанное пользователем имя для системы является новым атомом: анри и генри - два атома, которые не имеют ничего общего. Бинарное отношение не годится в качестве тернарного, зато тернарное отношение задаёт три бинарных отношения с одинаковыми именами - для трёх пар из трёх аргументов: отношения книга(_,_) и книга(_,_,_) для системы различны, чем и обусловлен ответ на второй приведённый выше вопрос.


Друзья! Приглашаем вас к обсуждению. Если у вас есть своё мнение, напишите нам в комментарии.