Mycin rules are declared as follows:
Head cf CertaintyFactor :- Body.
The same considerations are applied as for Head :- Body Prolog clauses. CertaintyFactor must be a number between -1 and 1 which declares the certainty factor for that rule. For example:
risk(high) cf -0.3 :- market_status(defensive), imitation_time(short).
Rule bodies may contain a Prolog goal as well as a mycin goal in any number, but those goals will never fail since mycin goals always retrieve a certainty factor. For Prolog goals a certainty factor of -1 will be retrieved whenever they fail and +1 in other case.
Mycin goals may be derived from other rules inside the same source file or may be imported using a use_module/1 declaration, the same used to import Prolog predicates.
Note that rule bodies may also contain logical connectives as ;/2, ->/2 and +/2 (if/3 is not allowed), however their usage is discouraged. Meta-programming practiques are also strongly discouraged.
Some examples of mycin rulebases may be found along with this distribution at path mycin_rulebase/Examples.
Metarule heads differ from rule heads in the Certainty Factor, which must be a variable. Such variable should be further instantiated to a valid certainty factor at runtime. For example:
weather(Forecast) cf Certainty :- forecasting:weather_forecast(Forecast,Probability), Certainty is (Probability * 2) - 1.
Metarule bodies differ from rule bodies because they are treated as Prolog clause bodies, so they may fail. In such case a certainty factor of 0 will be used for that rule. Calling mycin goal from metarule bodies is not possible unless cf/2 predicate is used.
Metarules are supposed to retrieve a valid certainty factor, otherwise a certainty factor of 0 will be used, too. The programmer must take care of such constraint.
The porpouse of metarules is to provide a simple way to perform mycin inference from data or facts that may be stored in databases or other external resources.