プロダクションシステム
ワーキングメモリ(WM): 項の配列(集合)
ルールベース(RB): ルールの連想配列(一般オブジェクト)
但し
項: [ 述語, 対象, … ] (配列)
述語・対象: 文字列
ルール: { condition: 条件, action: 動作 }
条件: [ 項, … ] (項の配列(集合))
動作: [ 項, … ] (項の配列(集合))
(cf. term_set.js)
例1: 積木の世界 (前向き推論の例)
(cf. forward_reasoning.js)
WM要素
["on-table", X] : 積木Xがテーブルの上に(接して)のっている
["on", X, Y] : 積木Xが積木Yの上に積まれている
["clear", X] : 積木Xの上には何も積まれていない
初期状態
C
A B
-------
[["on-table", "a"], ["on", "c", "a"], ["clear", "c"], ["on-table", "b"], ["clear", "b"]]
目標状態
A
B
C
-----
[["on-table", "c"], ["on", "b", "c"], ["on", "a", "b"], ["clear", "a"]]
ルールベース
sXY --- X を Y に積む
sab: { condition: [["on-table", "a"], ["clear", "a"], ["clear", "b"]],
action: [["clear", "a"], ["on", "a", "b"]]},
sac: { condition: [["on-table", "a"], ["clear", "a"], ["clear", "c"]],
action: [["clear", "a"], ["on", "a", "c"]]},
sbc: { condition: [["on-table", "b"], ["clear", "b"], ["clear", "c"]],
action: [["clear", "b"], ["on", "b", "c"]]},
sba: { condition: [["on-table", "b"], ["clear", "b"], ["clear", "a"]],
action: [["clear", "b"], ["on", "b", "a"]]},
sca: { condition: [["on-table", "c"], ["clear", "c"], ["clear", "a"]],
action: [["clear", "c"], ["on", "c", "a"]]},
scb: { condition: [["on-table", "c"], ["clear", "c"], ["clear", "b"]],
action: [["clear", "c"], ["on", "c", "b"]]},
dXY --- X を Y から下ろす
dab: { condition: [["clear", "a"], ["on", "a", "b"]],
action: [["on-table", "a"], ["clear", "a"], ["clear", "b"]]},
dac: { condition: [["clear", "a"], ["on", "a", "c"]],
action: [["on-table", "a"], ["clear", "a"], ["clear", "c"]]},
dbc: { condition: [["clear", "b"], ["on", "b", "c"]],
action: [["on-table", "b"], ["clear", "b"], ["clear", "c"]]},
dba: { condition: [["clear", "b"], ["on", "b", "a"]],
action: [["on-table", "b"], ["clear", "b"], ["clear", "a"]]},
dca: { condition: [["clear", "c"], ["on", "c", "a"]],
action: [["on-table", "c"], ["clear", "c"], ["clear", "a"]]},
dcb: { condition: [["clear", "c"], ["on", "c", "b"]],
action: [["on-table", "c"], ["clear", "c"], ["clear", "b"]]}
例2: 旅行案内 (後向き推論の例)
概要
後向き推論の木を深さ優先探索する (バックトラックあり)
節点: ワーキングメモリのプロパティ backtrace に適用ルール(の名前)のリスト(配列)を与えたもの
根節点: 目標状態の WM に,プロパティ backtrace として [] を与えたもの
子節点: 親節点のワーキングメモリにルールを逆向きに適用して得られる WM
プロパティ backtrace のリスト(配列)には,使用されたルール(の名前)が(前から)追加される
(cf. backward_reasoning.js)
ルールベース
旅行先決定ルール
r1: { condition: [["usa"], ["english"]], action: [["honolulu"]] },
r2: { condition: [["europe"], ["france"]], action: [["paris"]] },
r3: { condition: [["usa"], ["continent"]], action: [["losange"]] },
r4: { condition: [["island"], ["equator"]], action: [["honolulu"]] },
r5: { condition: [["asia"], ["equator"]], action: [["singapore"]] },
r6: { condition: [["island"], ["micronesia"]], action: [["guam"]] },
r7: { condition: [["swimming"]], action: [["equator"]] },
旅行先決定時ルール
rg1: { condition: [["honolulu"]], action: [["honolulu"], ["ok"]] },
rg2: { condition: [["paris"]], action: [["paris"], ["ok"]] },
rg3: { condition: [["losange"]], action: [["losange"], ["ok"]] },
rg4: { condition: [["singapore"]], action: [["singapore"], ["ok"]] },
rg5: { condition: [["guam"]], action: [["guam"], ["ok"]] }
目標状態
[["ok"]]