Clips エキスパート システムのセマンティクスの理解を深めるために、事実のリストを集約してスロット値が最も高い事実を見つけるための簡単なルールを書き込もうとしています。私が使用している比喩は、食べるか寝るかを決定しようとしている単純なエージェントの比喩です。エージェントの状態を説明する事実は潜在的なアクションに展開され、ルールは最高の効用を持つ最終的なアクションを見つけようとします。
これは私のコードです:
(clear)
(deftemplate state
(slot name)
(slot level (type NUMBER))
)
(deftemplate action
(slot name)
(slot utility (type NUMBER))
(slot final (type INTEGER) (default 0))
)
(defrule eat-when-hungry ""
(state (name hungry) (level ?level))
=>
(assert (action (name eat) (utility ?level)))
)
(defrule sleep-when-sleepy ""
(state (name sleepy) (level ?level))
=>
(assert (action (name sleep) (utility ?level)))
)
(defrule find-final-action ""
?current_final <- (action (name ?current_final_action) (utility ?
current_final_utility) (final 1))
(action (name ?other_action) (utility ?other_utility) (final 0))
(neq ?current_final_action ?other_action)
(< ?current_final_action ?other_action)
=>
(modify ?current_final (name ?other_action) (utility ?
other_utility))
)
(assert (action (name none) (utility 0.0) (final 1)))
(assert (state (name hungry) (level 0.5)))
(assert (state (name sleepy) (level 0.1)))
(run)
(facts)
これを実行した後、最終的なアクションは次のようになると思います。
(action (name eat) (utility 0.5) (final 1))
ただし、Clips は次のように評価します。
(action (name none) (utility 0.0) (final 1))
find-final-action ルールがアクティブにならないことを示します。どうしてこれなの?ファクトのグループを反復処理して、最小/最大スロット値を持つものを見つけるにはどうすればよいでしょうか?