Ниже приведен программный код на языке CLIPS, в котором реализована описанная выше стратегия работы со множеством контекстов.
;; ШАБЛОНЫ
;; Fact представляет собой субъект с определенными
;; свойствами.
;; Поле "world" несет информацию о контексте,
(deftemplate fact
(field subj (type SYMBOL))
(field attr (type SYMBOL))
(field world (type INTEGER))
)
;; Act представляет действие с объектом.
;; Поле "world" несет информацию о контексте.
(deftemplate act
(field action (type SYMBOL))
(field object (type SYMBOL))
(field world (type INTEGER))
)
;; Context имеет статус либо OK ,
;; либо NG (no good - плохой).
(def template context
(field id (type INTEGER))
(field status (type SYMBOL))
)
;; Модель мира в исходном состоянии.
(def facts model
(context (id 1) (status OK))
(fact (subj weather) (attr sunny) (world 1))
)
; ; ПРАВИЛА
; ; Если дождя нет,
;; создать новый контекст, в котором можно
;; пропустить занятия.
(def rule skip
(fact (subj weather) (attr ?W&~rainy) (world ?C)) =>
(assert (act (action skip) (object class)
(world (+ ?C 1)))) (assert (context
((id (+ ?C 1)) (status OK)))
)
;; Если пропустить занятия,
;; то на экзамене вас ждет провал.
(defrule fail
(act (action skip) (object class) (world ?W)) =>
(assert (act (action fail) (object exam) (world (?W)))
)
;; Если контекст содержит действие fail,
;; пометить его маркером NG. (defrule poison
(act (action fail) (world ?W)) .
?C <- (context (id ?W) (status OK)) =>
(modify ?C (status NG))
)
Как только контекст будет помечен маркером NG, с ним можно будет выполнять операции, предусмотренные для отравленного контекста, например удалить все связанные с ним факты и действия (см. упр. 8 в конце главы).