RSS    

   Реферат: Программирование на языке CLIPS

(defrule fun

           “Better things to do on Sunday”

           (salience 100)

           (today is Sunday)

           (weather is warm)

=>

          (assert (drink beer))

          (assert (play guitar))

)

Поскольку предпосылки обоих правил одинаковы, то при выполнении оговоренных условий они будут «конкурировать» за внимание интерпретатора. Предпочтение будет отдано правилу, у которого параметр salience имеет более высокое значение, в данном случае – правилу fun. Параметру salience может быть присвоено любое целочисленное значение в диапазоне [-10000, 10000]. Если параметр salience в определении правила опущен, ему по умолчанию присваивается значение 0.

Обычно в определении правила присутствуют и переменные. Если, например, правило

(defrule pick-a-chore

             “Allocating chores to days”

             (today is ?day)

             (chore is ?job)

=>

             (assert (do ?job on ?day))

)

будет сопоставлено с фактами

(today is Sunday)

(chore is carwash)

то в случае активизации оно включит в базу новый факт

(do carwash on Sunday).

Аналогично, правило

(defrule drop-a-chore

             “Allocating chores to days”

             (today is ?day)

             ?chore <- (do ?job on ?day)

=>

            (retract ?chore)

)

отменит выполнение работ по дому (a chore). Обратите внимание на то, что оба экземпляра переменной ?day должны получить одно и то же значение. Переменная ?chore в результате сопоставления должна получить ссылку на факт, который мы собираемся исключить из базы. Таким образом, если это правило будет сопоставлено с базой фактов, в которой содержатся

(today is Sunday)

(do carwash on Sunday)

то при активизации правила из базы будет удален факт

(do carwash on Sunday)

С подробностями выполнения процесса сосоставления в интерпретаторе  CLIPS вы сможете познакомиться в Руководстве пользователя , а здесь только отметим, что факт

(do carwash on Sunday)

будет сопоставлен с любым из представленных ниже образцов

(do ? ? Sunday)

(do ? on ?)

(do ? on ?when)

(do $?)

(do $? Sunday)

(do ?chore $?when)

Учтите, что префикс $? является признаком сегментной переменной, которая будет связана с сегментом списка. Например, в приведенном выше примере переменная $?when будет связана с

(on Sunday)

Если за префиксами ? и $? не следует имя переменой , они рассматриваются как универсальные символы подстановки, которым соответственно может быть сопоставлен любой элемент или сегмент списка.

А.2.3. Наблюдение за процессом интерпретации

Теперь на простом примере познакомимся с возможностями, которые предоставляет среда разработки CLIPS в части отладки программы, состоящей из правил и фактов. Введите в текстовый файл правило, а затем загрузите этот файл в среду CLIPS.

(defrule start

          (initial-fact)

=>

          (printout t “hello, world” crlf)

)

Выполните команду reset. Для этого введите эту команду в командной строке интерпретатора

CLIPS> (reset)

Либо выберите в меню команду Execution=>Reset, либо нажмите <CTRL+U> (последних два варианта возможны в версии, которая работает под Windows).

Затем запустите интерпретатор. Для этого введите эту команду run в командную строку интерпретатора

CLIPS> (run)

Либо выберите в меню команду Execution=>Run, либо нажмите <CTRL+R> (последних два варианта возможны в версии, которая работает под Windows).

В ответ программа должна вывести сообщение hello, world, знакомое всем программистам мира. Для повторного запуска программы повторите команды reset и run.

Если в меню Execution=>Watch ранее был установлен флажок Rules или перед запуском программы на выполнение вы ввели в командную стоку команду watch rules, то на экране появиться результат транссировки процесса выполнения

CLIPS> (run)

FIRE 1 start: f-0

hello, world

В этом сообщении в строке, начинающейся с FIRE, выведена информация об активизированном правиле: start – это имя правила, а f-0 – имя факта, который «удовлетворил» условие в этом правиле. Команда watch позволяет организовать несколько разных режимов трассировки, с деталями которых вы можете познакомиться в Руководстве пользователя. Если перед запуском программы вы ввели

CLIPS> (dribble-on “dribble.dp”)

TRUE

То выведенный протокол трассировки будет сохранен в файле dribble.clp. Сохранение протокола прекратится после ввода команда

CLIPS> (dribble-off)

TRUE

Это очень удобная опция, особенно на этапе освоения языка.

 

А.2.4. Использование шаблонов

 

Для определения фактов можно использовать не только списочные структуры, но и шаблоны, которые напоминают простые записи. (Шаблоны в CLIPS не имеют ничего общего с шаблонами C++.) Шаблон выглядит примерно так:

(deftemplate student “a student record”

         (slot name (type STRING))

         (slot age (type NUMBER)  (default 18))

)

Каждое определение шаблона состоит из произвольного имени шаблона, необязательного комментария и некоторого количества определений слотов. Слот включает поле данных, например name, и тип данных, например STRING. Можно указать и значение по умолчанию, как в приведенном выше примере.

Если в программу включено приведенное выше определение шаблона, то выражение

(deffacts students

           (student (name fred))

           (student (name freda) (age 19))

)

приведет к тому, что в базу фактов после выполнения команды reset будет добавлено

(student (name fred) (age 18))

(student (name freda) (age 19))

А.2.5. Определение функций

В языке CLIPS функции конструируются примерно так же, как в языке LIPS. Существенное отличие состоит в том, что переменные должны иметь префикс ?, как это показано в приведенном ниже определении.

(deffunction hypotenuse (?a ?b)

      (sqrt (+ (* ?a ?a) (* ?b ?b))

)

Формат определения функции в CLIPS следующий:

(deffunction <имя функции> (<аргумент> …..<аргумент>)

          <выражение>

          …………….

         <выражение>

)

Функция возвращает результат последнего выражения в списке.

Иногда выполнение функции имеет побочные эффекты, как в приведенном ниже примере.

(deffunction init (?day)

       (reset)

       (assert (today is ?day))

)

В результате после запуска функции на выполнение командой

CLIPS> (init Sunday)

Будет выполнена команда reset и, следовательно, очищена база фактов, а затем в нее будет включен новый факт (today is Sunday).

А.3. ОБЪЕКТНО-ОРИЕНТИРОВАННЫЕ СРЕДСТВА В CLIPS 

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

Первым делом определим класс pistol, в котором будут перечислены свойства, необходимые для моделирования.

(defclass pistol

       (is-a USER)

       (role concrete)

       (pattern-match reactive)

       (slot safety (type SYMBOL) (create-accessor read-write))

       (slot slide (type SYMBOL) (create-accessor read-write))

      (slot hammer (type SYMBOL) (create-accessor read-write))

      (slot chamber (type INTEGER) (create-accessor read-write))

      (slot magazine (type SYMBOL) (create-accessor read-write))

      (slot rounds (type INTEGER) (create-accessor read-write))

)

Первые три слота – системные. Они нужны объектно-ориентированной надстройке CLIPS (COOL-CLIPS object-oriented language). Эти слоты COOL извещают о том, что

·            pistol – это пользовательский класс;

·            pistol является конкретным классом, т.е. возможно создание экземпляров этого класса (альтернативный тип – абстрактный класс, который играет ту же роль, что и виртуальный класс в C++);

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

Следующие пять слотов представляют свойства и члены данных класса:

·            слот safety (предохранитель) может содержать символ on или off;

·            слот slide (затвор) может содержать значение forward или back, т.е. хранит информацию о положении затвора;

·            слот hammer (курок) содержит информацию о состоянии курка , back или down;

·            слот chamber (патронник) содержит значение 1 или 0, в зависимости от того, есть ли патрон в патроннике;

·            слот magazine (обойма) может содержать значение in или out, в зависимости от того, вставлена ли обойма;

Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14


Новости


Быстрый поиск

Группа вКонтакте: новости

Пока нет

Новости в Twitter и Facebook

                   

Новости

© 2010.