




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.