Клипы - динамическое добавление новых правил

CLIPS для меня в новинку - я уже 2 дня пытаюсь глубоко погрузиться в этот язык. У меня возник вопрос, а именно: как (если возможно) динамически создавать / добавлять новые правила? Я хотел бы сделать, например, что-то вроде этого:

(deftemplate action
 (slot prev)
 (slot curr)
)

(defrule test
   (action (prev ?p))
 =>
   (defrule test_inner
       (action (curr ?p))
     =>
       (printout t "Result of a newly created rule.")
    ) 
)

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

[EXPRNPSR3] Missing function declaration for defrule.

ERROR:
(defrule MAIN::test
   (action (prev ?p))
   =>
   (defrule

Это ошибка синтаксиса команды или я не могу определять новые правила "динамически"?


person tomek    schedule 10.11.2013    source источник


Ответы (1)


Сначала создайте строку, содержащую правило (или любую другую конструкцию), а затем используйте функцию сборки:

CLIPS> 
(deftemplate action
   (slot prev)
   (slot curr)
)
CLIPS> 
(defrule test
   (action (prev ?p))
=>
   (build (str-cat
            "(defrule test_inner
                (action (curr " ?p "))
                =>
                (printout t \"Result of a newly created rule.\")
             )"
          ) 
   )
)
CLIPS> (reset)
CLIPS> (assert (action (prev move)))
<Fact-1>
CLIPS> (agenda)
0      test: f-1
For a total of 1 activation.
CLIPS> (run)
CLIPS> (rules)
test
test_inner
For a total of 2 defrules.
CLIPS> (ppdefrule test_inner)
(defrule MAIN::test_inner
   (action (curr move))
   =>
   (printout t "Result of a newly created rule."))
CLIPS> 
person Gary Riley    schedule 10.11.2013