如何使用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撤消事实?

最佳答案

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

关于python - 如何使用clipspy撤消事实,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53959559/

10-12 22:47