A conflict resolution strategy is a list of conflict resolution tactics. A conflict resolution tactic is a function which takes as arguments two rule instantiations, and returns t
if and only if the first is preferred to the second, otherwise NIL
. A conflict resolution tactic may be defined by
(deftactic <tactic-name> {<type>} <lambda-list> <body>)
where <tactic-name>
is the name of the tactic and of the function being defined which implements it, and <lambda-list>
is a two argument lambda-list. <type>
may be either :static
or :dynamic
, defaulting to :dynamic
. A dynamic tactic is one which looks into the objects which match the rule to make up the instantiation; a static one does not. For example, a tactic which prefers instantiations which match, say, truck objects to instantiations which do not could be defined as static. However, if it looks into the slot values of the truck object it should be defined as dynamic. Static tactics are treated more efficiently but wrongly declaring a tactic as static will lead to incorrect conflict resolution.
It is an absolute requirement that there exist no instantiations for which
(<tactic-name> <instantiation1> <instantiation2>)
(<tactic-name> <instantiation2> <instantiation1>)
both return t
. Consequently, for any single given instantiation
(<tactic-name> <instantiation> <instantiation>)
The function which defines a conflict resolution tactic should be computationally cheap as it is used repeatedly and frequently to compare many different pairs of instantiations.