как убрать факт используя clipspy - PullRequest
0 голосов
/ 28 декабря 2018

Как убрать факт из 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)
)

Запуск из python

# 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 Ответ

0 голосов
/ 28 декабря 2018

In 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()
...