A ''production system'' describes a set of condition-action rules to be applied in given situations. At the simplest level this could just be a set of if-then commands, but usually implies a more complicated arrangement such as that employed in [Expert System] shells such as [CLIPS] which do pattern-matching and [unification] of pre-conditions written in a [predicate logic]-like language over a database of facts. [CLIPS] is a forward-chaining production system, whereas [Prolog] is a form of backward-chaining production system (i.e., it tries to reason backwards from a goal to find facts that support it, rather than reasoning from known facts to find their consequences). Here is a simple example of a production system for a game [Category AI%|%AI%|%] opponent [http://groups.google.com/group/comp.lang.tcl/msg/5aa88dd1eed4c617]: ====== set health 100 ;# Current health set range 100 ;# Maximum weapons range set nearest 50 ;# Distance of nearest enemy set target ... ;# Position of target set base ... ;# Position of base # etc ... plan Attack { when {$health < 40} do { goal Retreat } when {$nearest < $range} do { fire_at $target } otherwise { move_to $target } } plan Retreat { when {$health > 60} do { goal Attack } when {![at $base]} do { move_to $base } otherwise { repair } } goal Attack ====== This uses a form of [Reactive Planning] based on Teleo-Reactive programs [http://citeseer.ist.psu.edu/nilsson94teleoreactive.html]. The code that implements this simple production system is: ====== proc goal {name} { global GOAL set GOAL $name } proc plan {goal body} { global GOAL ACTIONS ELSE set GOAL $goal set ACTIONS($GOAL) [list] set ELSE($GOAL) "" uplevel #0 $args } proc when {cond _do_ action} { global ACTIONS GOAL lappend ACTIONS($GOAL) $cond $action } proc otherwise {action} { global ELSE GOAL set ELSE($GOAL) $action } # Typically, "run" would be incorporated into your game main-loop proc run {} { global ACTIONS GOAL ELSE while 1 { set fired 0 foreach {cond action} $ACTIONS($GOAL) { if {[uplevel #0 [list expr $cond]]} { uplevel #0 $action set fired 1 break; # Only first matching action fires } } if {!$fired} { uplevel #0 $ELSE($GOAL) } } } ====== <> Concept | AI