私は CLIPS を初めて使用し、既存の解決済みの問題を最初に調べて、逆算しようと考えました。Giarratano-Riley: Expert Systems and Programming 3rd edition には次の問題があり、次のように述べられています。
火災は主な燃える物質によって分類されます。次の情報を、火災クラスを決定するためのルールに変換します。
タイプ A の火災には、紙、木材、布などの通常の可燃物が含まれます。
タイプ B の火災には、可燃性および可燃性の液体 (石油やガスなど)、グリース、および類似の物質が含まれます。
タイプ C の火災は、通電中の電気機器が関係しています。
タイプ D の火災には、マグネシウム、ナトリウム、カリウムなどの可燃性金属が含まれます。火災時に使用する消火器の種類は、火災クラスによって異なります。次の情報をルールに変換します。
クラス A の火災は、水または水ベースの液体および乾燥化学物質などの熱吸収または燃焼遅延消火器で消火する必要があります。
クラス B の火災は、空気を遮断するか、可燃性蒸気の放出を抑制するか、または燃焼連鎖反応を中断することによって消火する必要があります。消火剤には、粉末化学薬品、二酸化炭素、泡、およびブロモトリフルオロメタンが含まれます。
クラス C の火災は、短絡を防ぐために非導電性の薬剤で消火する必要があります。可能であれば、電源を切る必要があります。消火剤には、粉末化学薬品、二酸化炭素、およびブロモトリフルオロメタンが含まれます。
クラス D の火災は、燃焼金属と反応しない窒息性および熱吸収性の化学薬品 > で消火する必要があります。このような化学物質には、トリメトキシボロキシンや選別された黒鉛化コークスが含まれます。
規則で使用される事実を説明します。プログラムへの入力は、燃焼物質のタイプを事実としてアサートすることによって行う必要があります。出力は、使用できる消火器と、電源を切るなどの他のアクションを示す必要があります。あなたのプログラムがそれぞれの発火クラスの 1 つの材料フォームに対して機能することを示してください。
その後、Berkely によって解決され、コードは次のようになります。私の質問は、これらのルールをどのように呼び出してプログラムを機能させるかです。バッファをロードし、リセットして実行すると、ルールがコマンドラインにロードされるだけです。
; Define templates used in rules
(deftemplate fire (slot burning-material))
(deftemplate extinguisher-system (multislot function) (multislot extinguisher))
(deftemplate response (multislot actions))
(deftemplate fire-class (slot class))
; Define rules for determining fire classes
(defrule class-A-fire
(fire (burning-material paper | wood | cloth | other-ordinary-combustibles)) =>
(assert (fire-class (class A))))
(defrule class-B-fire
(fire (burning-material oil | gas | greases | other-flammable-combustible-liquids)) =>
(assert (fire-class (class B))))
(defrule class-C-fire
(fire (burning-material energized-electrical-equipment)) =>
(assert (fire-class (class C))))
(defrule class-D-fire
(fire (burning-material magnesium | sodium | potassium | other-combustible-metals)) =>
(assert (fire-class (class D))))
; Define rules for determining the type of extinguisher that should be used on a fire
(defrule class-A-emergency
(fire-class (class A))
=>
(assert (response (actions activate-extinguisher-A)))
(assert (extinguisher-system (function heat-absorbing combustion-retarding) (extinguisher water water-based-liquids dry-chemicals))))
(defrule class-B-emergency
(fire-class (class B))
=>
(assert (response (actions activate-extinguisher-B)))
(assert (extinguisher-system (function excluding-air inhibiting-release-of-combustible-vapors interrupting-combustion-chain-reaction) (extinguisher dry-chemicals carbon-dioxide foam bromotrifluoromethane))))
(defrule class-C-emergency
(fire-class (class C))
=>
(assert (response (actions activate-extinguisher-C power-cut)))
(assert (extinguisher-system (function nonconducting-agent) (extinguisher dry-chemicals carbon-dioxide bromotrifluoromethoane))))
(defrule class-D-emergency
(fire-class (class D))
=>
(assert (response (actions activate-extinguisher-D)))
(assert (extinguisher-system (function smothering-heatabsorbing-chemicals) (extinguisher trimethoxyboroxine screened-graphitized-coke))))