Программирование на языке Clips

Автор: Пользователь скрыл имя, 04 Марта 2013 в 18:15, курсовая работа

Краткое описание

Название языка CLIPS – аббревиатура от C Language Integrated Production System. Язык был разработан в центре космических исследований NASA
{NASA’s Johnson Space Center} в середине 1980-х годов и во многом сходен с языками , созданными на базе LIPS, в частности OPS5 и ART. Использование C в качестве языка реализации объясняется тем, что компилятор LISP не поддерживается частью распространенных платформ, а также сложностью интеграции LISP-кода в приложения, которые используют отличный от LIPS язык программирования.

Оглавление

А.1. Краткая история CLIPS 3

А.2. Правила и функции в CLIPS 3

А.3. Обектно-ориентированные средства в CLIPS 10

А.4. Задача «Правдолюбцы и лжецы» 15

А.5 Стиль программирования на языке CLIPS 66

Файлы: 1 файл

ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ CLIPS.doc

— 351.50 Кб (Скачать)

(defmessage-handler pistol fire ()

        (if (and

             (eq (dynamic-get chamber) 1)

             (eq (dynamic-get safety) off)

         )

         then (printout t crlf “BANG!” t crlf)

                  TRUE

         else (printout t crlf “click” t crlf)

         FALSE

         )

)

Пусть вас не смущает, что в обработчике сообщения анализируется условие, которое уже было проанализировано правилом, отославшим сообщение (в данном случае речь идет об условии safety off). Дело в том, что одно и тоже сообщение может отсылаться разными правилами и нет никакой гарантии, что в каждом из них будет проверяться это условие.

После завершения стрельбы пистолет нужно вновь вернуть  в положение «по-походному». Начинается это с того, что пистолет устанавливается  на предохранитель, для чего используется ранее разработанный обработчик сообщения safety.

(defrule unready

        (object (name [PPK]) (safety off))

        (range-test (fired yes))

=>

        (send [PPK] safety on)

)

Следующая операция –  вынуть обойму. Обратите внимание, что  в нем мы вновь обращаемся к  обработчику сообщения drop.

(defrule drop

       (object (name [PPK]) (safety on))

       (range-test (fired yes))

=>

       (send [PPK] drop)

)

Последнее правило выбрасывает  патрон из патронника, вызывая обработчик сообщения clear.

(defrule unload

       (object (name [PPK]) (safety on) (magazine out))

       range-test (fired yes))

=>

       (send [PPK] clear)

)

В этом приемре было продемонстрировано, как в рамках единой CLIPS программы “уживаются” правила и объекты. Правила управляют ходом вычислений, но некоторые операции объекты выполняют и самостоятельно, получив “указание” (сообщение) от правил. Объекты не являютя резидентами рабочей памяти, но члены левой части правил (условий) могут быть сопоставлены с содержимым их слотов. Состояние объектов может измениться и вследствие побочных эффектов активизации правил, но я считаю, что лучше предоставить объектам возможность самостоятельно выполнять манипуляции с хранящимися в них данными в ответ на поступающие от правил сообщения. Объекты не могут самостоятельно активизировать правила, но их обработчики сообщения могут “возвращать” определенную информацию о результатах, которая используется для управления логикой выполнения действий в правой части правил.

А.4. ЗАДАЧА “ПРАВДОЛЮБЦЫ И ЛЖЕЦЫ”

 

Для того, чтобы продемонстрировать вам возможности языка CLIPS, я выбрал головоломку, а не задачу из практики применения экспертных систем. В головоломке решается одна из задач, возникающих на острове, населенном обитателями двух категорий: одни всегда говорят правду (назовем их правдолюбцами), а другие всегда лгут ( их, естественно, назовем лжецами). Множество подобных головоломок вы можете встретить на страницах занимательной книги Раймонда Смуляна «What is the Name of this Book?». Ниже приведены разные задачи из этой серии.

Р1. Встречаются два  человека, А и В , один из которых правдолюбец, а другой – лжец. А говорит: «Либо я лжец, либо В правдолюбец». Кто из этих двоих правдолюбец, а кто лжец?

Р2. Встречаются три  человека, А, В и С. А и говорит: «Все мы лжецы», а В отвечает: «Только  один из нас правдолюбец». Кто из этих троих правдолюбец, а кто лжец?

Р3. Встречаются три  человека, А, В и С. Четвертый проходя  мимо, спрашивает А: «Сколько правдолюбцев среди вас?» А отвечает неопределенно, а В отвечает: «А сказал, что среди  нас есть один правдолюбец». Тут  в разговор вступает С и добавляет: «В врет!» кем по-вашему являются В и С?

В программе, решающей проблемы подобного класса, будут использованы широкие возможности средств  программирования правил в языке CLIPS и продемонстрированы некоторые интересные приемы, например использование контекстов и обратного прослеживания. Мы также покажем, как конструировать и тестировать прототипы, которые приблизительно воспроизводят поведение окончательной программы. Как отмечалось в основном материале книги, технология построения экспертных систем с использованием прототипов – одна из самых распространенных в настоящее время.

 

А.4.1. Анализ проблемы

 

Первым этапом любого программного проекта является анализ решаемой проблемы. Эксперт должен уметь решить проблему, а инженер по знаниям должен разобраться, как именно было получено решение. При решении нашей задачи вам придется выступить в обеих ипостасях.

Предложенные головоломки  можно решить, систематически анализируя, что случится, если персонаж, произносящий реплику, является правдолюбцем, а что, если он – лжец. Обозначим через Т(А) факт, что А говорит правду, и следовательно, является правдолюбцем, а через F(А) – факт, что А лжет и, следовательно, является лжецом.

Рассмотрим сначала  головоломку Р1. Предположим, что  А говорит правду. Тогда из его реплики следует, что либо А лжец, либо В правдолюбец. Формально это можно представить в следующем виде:

Т(А) =>F(А) v Т(В)

Поскольку А не может  одновременно быть и лжецом, и правдолюбцем, то отсюда следует

Т(А) =>Т(В)

Аналогично можно записать и другой вариант. Предположим, что А лжет:

F(A)=>-(F(A) v Т(В)).

Упростим это выражение:

F(A)=>-F(A) ^-Т(В) или F(A)=> Т(А)^F(B).

Сравнивая оба варианта, нетрудно прийти к выводу, что толко  последний правильный, поскольку  в первом варианте мы пришли к выводу, противоречащему условиям ( не могут быть правдолюбцами одновременно А и В).

Таким образом, рассматриваемая  проблема относится к типу таких, решение которых находится в  результате анализа выводов, следующих  из определенных предположений, и поиска в них противоречий (или отсутствия таковых). Мы предполагаем, что определенный персонаж говорит правду, а затем смотрим, можно ли в этом случае так распределить «роли» остальных персонажей, что не будут нарушены условия, сформулированные в репликах. На жаргоне, принятом в математическое логике, предположение о правдивости или лживости множества высказываний называется интерпретацией, а вариант непротиворечивого присвоения значений истинности элементам множества – моделью.

Однако наши головоломки  включают и нечто, выходящее за рамки типовых проблем математической логики, поскольку реплики в них может произносить не один персонаж ( как в головоломке Р2), а на реплику одного персонажа может последовать ответная реплика другого (как в головоломке Р3). В исходной версии программы, которую мы рассмотрим ниже, это усложнение отсутствует, но в окончательной оно должно быть учтено. Мы покажем, что постепенное усложнение программы довольно хорошо согласуется с использованием правил.

На практике оказывается, что в первой версии программы удобнее всего воспользоваться «вырожденным» вариантом проблемы, т.е. постараться решить ее в тривиальном виде, который, тем не менее, несет в себе многие особенности реального случая. Вот как это выглядит в отношении наших правдолюбцев и лжецов.

Р0. А заявляет: «Я лжец». Кто же в действительности А –  лжец или правдолюбец?

Мы только что фактически процитировали хорошо известный Парадокс Лгуна. Если А лжец, то, значит, он врет, т.е. в действительности он правдолюбец. Но тогда мы приходим к противоречию. Если же А правдолюбец, т.е. говорит правду, то в действительности он лжец, а это опять противоречие. Таким образом, в этой головоломке не существует непротиворечивого варианта «распределения ролей», т.е. не существует модели в том смысле, который придается ей в математической логике.

Есть много достоинств в выборе для прототипа программы  варианта головоломки Р0.

  • В головоломке присутствует только один персонаж.
  • Выражение не содержит логических связок, таких как И или ИЛИ, или кванторов, вроде квантора общности (все) и прочих.
  • Отсутствует ответная реплика.

 

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

  • формировать альтернативные интерпретации высказываниям;
  • анализировать наличие противоречий.

 

Вы увидите, что для  выполнения этих двух задач потребуется  использовать механизм, очень близкий  к тем, которые мы рассматривали при описании систем обработки правдоподобия в главах 17 и 19.

 

А.4.2. Онтологический анализ и представление  знаний

 

Следующий этап – определить, с  какими видами данных нам придется иметь дело при решении этого  класса головоломок. Какие объекты представляют интерес в мире правдолюбцев и лжецов и какими атрибутами эти объекты характеризуются?

По-видимому, для решения  задач этого класса нам придется иметь дело со следующими объектами.

  • Персонажи, произносящие реплики. Произносимая реплика характеризует либо самого персонажа, либо прочих персонажей, либо и тех, и других. Персонаж может быть либо правдолюбцем, либо лжецом.
  • Утверждение, содержащееся в реплике. Это утверждение может быть либо целиком лживым, либо абсолютно правдивым (истинным).

Немного поразмыслив, мы придем к выводу, что существуют еще и другие объекты, которые необходимо учитывать при  решении задач этого класса.

  • существует среда (мир), которая характеризуется совокупностью наших предположений. Например, существует мир, в котором мы предположили, что А – правдолюбец, а следовательно, высказанное им утверждение (или утверждения) истинно. Это предположение влечет за собой разные следствия, которые образуют контекст данного гипотетического мира.
  • Существует еще нечто, что мы назовем причинами, или причинными связями (reasons), которые связывают высказывания о том или ином гипотетическом мире. Если А утверждает, что «В – лжец», и мы предполагаем, что А – правдолюбец, то это утверждение является причиной (основанием), по которой мы можем утверждать, что в данном гипотетическом мире В – лжец, а следовательно, все утверждения, которые содержатся в репликах, произносимых В, лживы. Отслеживая такие связи между высказываниями, можно восстановить исходное состояние проблемы, если в результате рассуждений мы придем к противоречию.

 

Естественно, что эти объекты  можно представлять в программе  по-разному. Онтологический анализ практически  никогда не приводит к единственному  способу представления. Для первой версии 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) – обычно это тэг

Информация о работе Программирование на языке Clips