А.4.2.
Онтологический анализ и представление знаний
Следующий
этап — определить, с какими видами данных нам придется иметь дело при решении
этого класса головоломок. Какие объекты представляют интерес в мире правдолюбцев
и лжецов и какими атрибутами эти объекты характеризуются?
По-видимому,
для решения задач этого класса нам придется иметь дело со следующими объектами.
Немного поразмыслив,
мы придем к выводу, что существуют еще и другие объекты, которые необходимо
учитывать при решении задач этого класса.
Естественно,
что эти объекты можно представлять в программе по-разному. Онтологический анализ
практически никогда не приводит к единственному способу представления. Для первой
версии CLIPS-программы я выбрал следующее представление описанных объектов:
;;Объект statement (высказывание) связан с определенным
;;персонажем (поле speaker).
;;Высказывание содержит утверждение (поле claim).
;;Высказывание имеет основание - причину (поле reason),
;;по которой ему можно доверять,
;;и тэг (tag) - это может быть произвольный
;;идентификатор,
(deftemplate statement
(field speaker (type SYMBOL))
(multifield claim (type SYMBOL))
(multifield reason (type INTEGER) (default 0))
(field
tag (type INTEGER) (default 1)) )
Вместо того
чтобы фокусировать внимание на персонаже, во главу угла я ставлю произносимую
им реплику (высказывание), а персонаж отношу к атрибутам высказывания. Я хочу
обеспечить возможность представить определенную головоломку в виде экземпляра
шаблона, приведенного ниже.
(statement
(speaker A) (claim F A))
Этот шаблон
можно перевести на "человеческий" язык следующим образом: "Существует
высказывание, сделанное персонажем А, в котором утверждается, что А лжец и тэг
этого высказывания по умолчанию получает значение 1". Обратите внимание
на то, что в поле reason также будет установлено значение по умолчанию (это
значение равно 0), т.е. мы можем предположить, что никаких предшествующих высказываний,
которые могли бы подтвердить данное, в этой задаче не было.
Обратите внимание,
что поля claim и reason имеют квалификатор multifield, поскольку они могут содержать
несколько элементов данных (более подробно об этом рассказано в Руководстве
пользователя).
Однако недостаточно
только представить в программе высказывания персонажей — нам понадобится также
выявить суть содержащихся в них утверждений. Далее, приняв определенное предположение
о правдивости или лживости персонажа, которому принадлежит высказывание, можно
построить гипотезу об истинности или лживости этого утверждения. С каждым таким
утверждением свяжем уникальный числовой идентификатор.
Утверждение,
смысл которого, например, состоит в следующем, ;;Т А ... означает, что А правдолюбец;
;;F А ... означает, что А лжец. ;;Утверждение может иметь под собой ;;основание
(reason) - обычно это тэг ;;высказывания (объекта statement) или тэг ;;другого
утверждения (объекта claim). ;;Утверждение также характеризуется признаком scope,
;;который может принимать значение "истина" или "ложь",
(deftemplate claim
(multifield
content (type SYMBOL))
(multifield
reason (type INTEGER) (default 0))
(field
scope (type SYMBOL)) )
Например,
раскрыв содержимое приведенного выше высказывания в предположении, что А говорит
правду, получим следующее утверждение (объект claim):
(claim
(content F A) (reason 1) (scope truth)).
Таким образом,
объект claim наследует содержимое от объекта statement. Последний становится
обоснованием (reason) данного утверждения. Поле scope объекта claim принимает
значение предположения о правдивости или лживости этого высказывания.
Еще нам потребуется
представление в программе того мира (world), в котором мы в настоящее
время находимся. Объекты world порождаются в момент, когда мы формируем определенные
предположения. Нужно иметь возможность различать разные множества предположений-
и идентифицировать их в программе в тот момент, когда процесс размышлений приводит
нас к противоречию. Например, противоречие между высказываниями Т(А) и
F(A) отсутствует, если они истинны в разных мирах, т.е. при разных предположениях.
Если у вас есть на сей счет сомнения, вернитесь вновь к примерам в самом начале
раздела А.4.
Миры будем
представлять в программе следующим образом:
;;Объект world представляет контекст,
;;сформированный определенными предположениями
;;о правдивости или лживости персонажей.
;;Объект имеет уникальный идентификатор в поле tag,
;;а смысл допущения - истинность или лживость -
;;фиксируется в поле scope,
(deftemplate
world
(field
tag (type INTEGER) (default 1))
(field
scope (type SYMBOL) (default truth)) )
Обратите внимание
на то, что при указанных в шаблоне значениях по умолчанию мы можем начинать
каждый процесс вычислений с объекта world, имеющего в поле значение 1, причем
этот "мир" можно заселить высказываниями персонажей, которых мы предположительно
считаем правдолюбцами. Таким образом можно инициализировать базу фактов the-facts
для задачи Р0 следующим образом:
;; Утверждение, что А лжец.
(deffacts
the-facts
(world)
(statement
(speaker A) (claim FA)) )
Если этот оператор deffacts будет включен в тот же файл, что и объявления шаблонов (а также правила, о которых речь пойдет ниже), то после загрузки этого файла в среду CLIPS нам понадобится для запуска программы дать только команду reset.