Как убрать факт используя clipspy
Как убрать факт из CLIPS из функции Python с помощью clipspy. Я пытался с помощью build()
но факт все еще там.
;;--KB.clp--;;
(defrule main-intent
(initial-fact)
=>
(assert (fact one))
(assert (fact two))
)
(defrule rule_1
?p <- (fact one)
?q <- (fact two)
=>
(py_pfact)
(py_retract ?p ?q)
(py_pfact)
)
Беги из питона
# run.py
import clips
clips_env = clips.Environment()
def py_pfact():
for fact in clips_env.facts():
print(fact)
def py_retract(p, q):
clips_env.build('retract '+str(p))
clips_env.define_function(py_retract)
clips_env.define_function(py_pfact)
clips_env.load("KB.clp")
clips_env.reset()
clips_env.run()
Выход:
(initial-fact)
(fact one)
(fact two)
(initial-fact)
(fact one)
(fact two)
(факт один) не отозвался. Кажется, р содержит не идентификатор факта, а сам факт. В прошлом я использовал PyCLIPS таким образом, и он работал. Можно ли убрать факт, используя ClipsPy?
1 ответ
Решение
В clipspy
environment.build
метод аналогичен CLIPS C API EnvBuild
и это позволяет создавать такие конструкции, как deftemplates и rules как строки внутри движка.
clips_env.build("(deftemplate foo (slot bar) (slot baz))")
Если вы хотите отозвать факт, вы можете просто вызвать его метод.
def py_retract(p, q):
p.retract()