1

如何使用 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 收回事实?

4

1 回答 1

1

方法类似于 CLIPS C API ,它允许在引擎中将诸如 deftemplates 和规则之类的构造构建为字符串clipspyenvironment.build EnvBuild

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

如果你想收回一个事实,你可以简单地调用它的方法

def py_retract(p, q):
    p.retract()
于 2018-12-28T14:54:28.043 回答