Soar fires its rules in parallel, such that all those which can fire will do so. However, the actions of such rules do not directly make changes to working memory; they produce votes for changes in the form of preferences. For example, one value can be better than another, and a third can be best. Note that elements can have more than one preference associated with them.

Soar's preferences fall into five categories:

Feasibility: + (Accept) - (Reject)

Determine the candidates for the value of an augmentation. In order to be considered further, candidates must be acceptable, and hence this is the default should neither be given.

Example usage:

;; Propose eat.
sp {ht*propose-op*eat
  (state <s> ^ hungry-thirsty)
  (<s> ^hungry yes)
  (<s> ^operator <o>)
  (<o> ^name eat +)}

Exclusivity: & (Parallel)

Determine if more than one value for an attribute is allowed. If two or more candidates are indistinguishable in terms of preference, and have the parallel attribute, then all will become values of the augmentation.

Example usage:

sp {perform*initialise*state
  (state <s> ^name perform)
  (<s> ^task <t>)
	(<t> ^feature <f1> + <f1> &, <f2> + <f2> &)
	(<f1> ^fname effect ^fvalue launch)
	(<f2> ^fname arg1)}

Desirability: [> (best)] [<obj1> > <obj2> (better)] [= (indifferent)] [< (worst)] [<obj1> < <obj2> (worse)]

Compare and rank the candidates as to which should be selected.

Example usage:

;; Eat is better if you are hungry.
sp {ht*compare*eat*better*drink
  (state <s> ^desired <d> ^ hungry-thirsty)
  (<d> ^hungry no)
  (<s> ^operator <op-eat> +)
  (<op-eat> ^name eat)
  (<s> ^operator <op-drink> +)
  (<op-drink> ^name drink)
  (<s> ^operator <op-eat> > <op-drink>)}

Necessity: ! (Require) ~ (Prohibit)

Determine if a selection must or must not be made in order to achieve the goal.

Example usage:

Typically these are not used in simple programs, and work with them
     suggests that it is unwise to use them in many cases.

Termination: @ (Reconsider)

Terminates the element such that it no longer applies to its relevant context slot. Since it has been terminated, on the next cycle the candidate may be reconsidered for selection.

Example usage:

;; The reconsider preference effectively terminates the operator on 
;; the next decision cycle after it has done what its supposed to do.
sp {ht*terminate*eat
  (state <s> ^operator <o>)
  (<o> ^name eat)
  (<s> ^hungry no)
  (<s> ^operator <o> @)}

The semantics of the decision procedure are reasonably intuitive, at least in simple cases. For example, a single best wins. Should the candidates all be indifferent, then the indifferent-selection parameters can be used to define how selection takes place.

Click on BACK in your browser to return to where you were before this page.