CLIPSPY を使用して、python からファクト テンプレートを変更しようとしています。初めてスロットを変更するため、奇妙な動作をしますが、次のスロットでは、以前に変更されたスロット値を別のものに再変更することさえありません!!
これがパイソンファイルです。
# run.py
import clips
clips_env = clips.Environment()
def py_modify_s1(p):
p.retract()
p["s_1"] = clips.Symbol("ABC")
p.assertit()
def py_modify_s2(p):
p.retract()
p["s_2"] = clips.Symbol("DEF")
p.assertit()
clips_env.define_function(py_modify_s1)
clips_env.define_function(py_modify_s2)
clips_env.load("KB.clp")
clips_env.reset()
clips_env.run()
これが clp ファイルです。
(deftemplate t
(slot s_1 (type SYMBOL) (default none))
(slot s_2 (type SYMBOL) (default none))
)
(defrule rule_0
(initial-fact)
=>
(assert (t))
)
(defrule rule_1
?p<-(t (s_1 none) (s_2 none))
=>
(py_modify_s1 ?p)
(facts)
)
(defrule rule_2
?p <- (t (s_1 ?x&~none) (s_2 none))
=>
(py_modify_s2 ?p)
(facts)
)
(defrule rule_3
?p <- (t (s_1 ?x&~none) (s_2 ?y&~none))
=>
(printout t "All set")
(facts)
)
同じクリップ ファイルを CLIPS シェルで実行すると (py_modify を に置き換えます(modify ?p (s_1,ABC)))、期待どおりの結果が得られます。しかし、clippy から実行すると、次のようになります。
f-0 (initial-fact)
f-2 (t (s_1 ABC) (s_2 none))
For a total of 2 facts.
f-0 (initial-fact)
f-2 (t (s_1 ▒▒▒3wU) (s_2 none))
For a total of 2 facts.
s_1の発火後にガベージ値が含まれていることに注意してください。変更されているだけではありませんrule_2。s_2その結果、rule_3解雇されることはありません。