Я пытаюсь изменить факт факт-шаблона в клипах с помощью ClipsPY.Следующий код убирает и подтверждает этот факт.Почему после отмены факта значение интервала s_2
не равно nil
при повторном утверждении?
run.py
import clips
clips_env = clips.Environment()
def py_pfact():
for fact in clips_env.facts():
print(fact)
def py_modify(p):
print("\nfacts:")
py_pfact()
p.retract()
print("\nfacts after retracted:")
py_pfact()
p["s_1"] = clips.Symbol("v_2")
p.assertit()
print("\nfacts after re_assert:")
py_pfact()
clips_env.define_function(py_pfact)
clips_env.define_function(py_modify)
clips_env.load("KB.clp")
clips_env.reset()
clips_env.run()
Это файл clp
;; KB.clp
(deftemplate t
(slot s_1 (type SYMBOL))
(slot s_2 (type SYMBOL))
)
(defrule main-intent
(initial-fact)
=>
(assert (t (s_1 v_1) (s_2 v_2)))
)
(defrule rule_1
?p<-(t (s_1 ?v&~v_2))
=>
(py_modify ?p)
)
Вывод:
facts:
(initial-fact)
(t (s_1 v_1) (s_2 v_2))
facts after retracted:
(initial-fact)
facts after re_assert:
(initial-fact)
(t (s_1 v_2) (s_2 v_2))
Я ожидал, что вывод будет(t (s_1 v_2) (s_2 nil))
, однако s_2
- это не ноль, а предыдущее установленное значение v_2
, которое было установлено до того, как факт был отозван.