Как убрать факт используя 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()
Другие вопросы по тегам