rootgoal ::= "(" make-root-goal ")" agent-name ::= symbol ::= letter[{}] goal-description ::= "(" list [] ")" goal-rest ::= | | goal-name ::= string ::= """[{}]""" goal-type ::= goal-url ::= consequent :== | "(" list {} ")" applicablestatement ::= "(" applicable-operator ")" admissiblestatement ::= "(" admissible-operator ")" goalnameorvar ::= | ::= ::= "?" op-name ::= ::= "(" {} ")" stringvar ::= | assignmentstatement ::= "(" assignment "}" assignment ::= "(" list ")" inputs ::= "(" inputs "(" {} ")" ")" contingencies ::= "(" contingencies "(" { "(" [{}] ")" } ")" ")" subgoalstatement ::= "(" subgoal ")" goalpreference ::= "(" prefer-goal ")" operatorpreference ::= "(" prefer-operator "(" ")" "(" ")" ")" opnameorvar :== | reduxrulehead ::= | | | goal-preference | operatorpreference | inputs | contingencies reduxrule ::= "(" <= reduxrulehead {} ")" ::= "(" { | | } ")" ================= Some common examples of conditions are: (REDUX "Goal-Type" ?goal "plan-service")) (REDUX "consequent" ?goal ("curent-state" ?state)) If these two conditions occur in a rule, then ?goal will unify only with those goals that of goal-type "plan-service" and have a matching consequent; e.g., ("current-state" "s0"). The opname should be the same in at least one pair of applicability and admissibility statements: this defines an operator. One such pair should unify with each goal initially defined. At least one subgoal or one assignment statement should be associated with each operator defined. The assignment and subgoals should be for an op-name for which admissibility is defined: otherwise they will be useless. The paramenters must similarly be consistent between an admissibility statement and the associated assignment and subgoal pairs. (The same is true for the less-frequently used contingency and input statements.) Any opname or goalname mentioned in a preference should match a defined operator or goal. A good editor would detect mismatches and alert the developer.