Иллюстрированный самоучитель по введению в экспертные системы


Объектно-ориентированные средствв CLIPS - часть 2


  • слот rounds (патроны) содержит текущее количество патронов в обойме.

  • Для того чтобы иметь возможность записывать в слот новое значение или считывать текущее, нужно разрешить формирование соответствующих функций доступа через фацет create-accessor. Теперь сформируем экземпляр класса pistol с помощью следующего выражения:

    (definstances pistols (РРК of pistol (safety on)

    (slide forward) (hammer down) (chamber 0) (magazine out) (rounds 6)

    Этот экземпляр, РРК, правильно уложен — обойма вынута из рукоятки, пистолет установлен на предохранитель, затвор в переднем положении, курок опущен, а патронник пуст. В обойме имеется 6 патронов.

    Теперь, имея в программе определение класса и сформировав экземпляр класса, разработаем правила и обработчики сообщений, с помощью которых можно описать отдельные операции обращения с пистолетом и стрельбы из него. Для этого сначала разработаем шаблон задачи. Желательно отслеживать две вещи:

    • есть ли патрон в патроннике;

    • произведен ли выстрел.

    Для этого можно использовать следующий шаблон:

    (deftemplate range-test

    (field check (type SYMBOL) (default no))

    (field fired (type SYMBOL) (default no)) )

    Первое правило будет устанавливать в рабочую память программы задачу range-test.

    (defrule start

    (initial-fact) =>

    (assert (range-test)) )

    При активизации этого правила в рабочую память будет добавлено (range-test (check no) (fired no))

    Следующие три правила будут проверять, правильно ли снаряжен пистолет.

    (defrule check

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

    ?T <- (range-test (check no)) =>

    (send [PPK] clear)

    (modify ?T (check yes) )

    Правило check заключается в том, что если пистолет стоит на предохранителе (safety on), обойма вынута (magazine out) и пистолет не был проверен, то нужно очистить патронник и проверить, нет ли в нем патрона. Обработчик сообщения clear для класса pistol будет выглядеть следующим образом:

    (defmessage-handler pistol clear ( )

    (dynamic-put chamber 0)

    (ppinstance) )



    Начало  Назад  Вперед



    Книжный магазин