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