Normally, any change to a slot of an instance will be considered as a change to the instance for purposes of pattern-matching. However, it is possible to indicate that changes to a slot of an instance should not cause pattern-matching. The reactive facet specifies that changes to a slot trigger patternmatching, and this is the default. The non-reactive facet specifies that changes to a slot do not affect pattern-matching.
Example
CLIPS> (clear)
CLIPS>
(defclass A (is-a USER)
(role concrete)
(pattern-match reactive)
(slot foo (create-accessor write)
(pattern-match non-reactive)))
CLIPS>
(defclass B (is-a USER)
(role concrete)
(pattern-match reactive)
(slot foo (create-accessor write)
(pattern-match reactive)))
CLIPS>
(defrule Create
?ins<-(object (is-a A | B))
=>
(printout t "Create " (instance-name ?ins) crlf))
CLIPS>
(defrule Foo-Access
?ins<-(object (is-a A | B) (foo ?))
=>
(printout t "Foo-Access " (instance-name ?ins) crlf))
CLIPS> (make-instance a of A)
[a]
CLIPS> (make-instance b of B)
[b]
CLIPS> (run)
Create [b]
Foo-Access [b]
Create [a]
CLIPS> (send [a] put-foo 1)
1
CLIPS> (send [b] put-foo 1)
1
CLIPS> (run)
Foo-Access [b]
CLIPS>