A CLOS class may be replaced by a structure for increased speed when all the power of CLOS is not needed. Within the rule interpreter the structure behaves like a CLOS class which:
initform
of nil
for each slotA KnowledgeWorks structure is defined by the macro
(def-kb-struct <class-spec> <slot-spec>*)
where the arguments are the same as for defstruct
except that in <class-spec>
only the options :include
and :print-function
are allowed. A structure may only be included in a KnowledgeWorks structure if it too is a KnowledgeWorks structure defined by def-kb-struct
. All the functions normally provided by defstruct
(accessors, a predicate etc.) are generated. An instance of the structure class may be created by the generic function
(make-instance <class-name>
{<slot-specifier> <value>}*)
where <slot-specifier>
is the keyword version of the slot name, as with any structures, and <value>
is the value the slot is to take , otherwise defaulting to the value specified in the def-kb-struct
form. If created from Lisp by any means other than make-instance
(for example, by the automatically defined make-<structure-name>
constructor), the inference engine will not know about the structure.
Once created, structures must not be modified directly from Lisp as this will corrupt the state of the forward chaining inference engine. For example:
(def-kb-struct train position speed)
(def-kb-struct signal position colour)
(make-instance 'train :position 0 :speed 80)
(make-instance 'signal :position 10 :colour 'red)
defines KnowledgeWorks structures for trains and signals and makes an instance of each. Note that they are not fully-fledged CLOS objects but are analogous to working memory elements in OPS5.