如何使用clipspy撤消事实

时间:2018-12-28 13:46:42

标签: python clips clipspy

如何使用clipspy从python功能撤回CLIPS中的事实。 我尝试使用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)

(事实一)未收回。似乎?p不包含事实标识符,而是整个事实本身。过去,我曾以这种方式使用PyCLIPS,但它确实有效。可以使用ClipsPy撤消事实吗?

1 个答案:

答案 0 :(得分:1)

clipspy中,environment.build method与CLIPS C API EnvBuild类似,它允许在引擎内将诸如deftemplates和rule之类的结构构建为字符串。

clips_env.build("(deftemplate foo (slot bar) (slot baz))")

如果您想撤消事实,只需致电its method

def py_retract(p, q):
    p.retract()