0

如何使用 ClipsPy 在 CLIPS 中修改模板的事实。

我已经尝试过重新分配插槽值并在clips.build例程中发送修改(请参阅py_modify下面的功能),但它不起作用。

这是 .clp 文件

;; KB.clp
(deftemplate t
    (slot s_1 (type SYMBOL)))

(defrule main-intent
    (initial-fact)
    =>
    (assert (t (s_1 v_1)))
)

(defrule rule_1
    ?p<-(t (s_1 ?v))
    =>
    (printout t"BEFORE"crlf) (py_pfact)
    (py_modify ?p)
    (printout t"AFTER"crlf) (py_pfact)
)

这是python文件..

# run.py
import clips

clips_env = clips.Environment()

def py_pfact():
    for fact in clips_env.facts():
        print(fact)

def py_modify(p):
    print("--modifying",p["s_1"])
    p["s_1"] = "v_2"  # Try 1
    clips.build("(modify "+str(p.index)+ " (s_1 v_2)") #Try 2

clips_env.define_function(py_pfact)
clips_env.define_function(py_modify)

clips_env.load("KB.clp")
clips_env.reset()
clips_env.run()

输出是

 BEFORE
(initial-fact)
(t (s_1 v_1))
--modifying v_1
AFTER
(initial-fact)
(t (s_1 v_1))

我希望s_1将 slot 修改为v_2from v_1,但事实并非如此。

4

1 回答 1

2

environment.build方法用于在引擎中构建构造(defruledeftemplate等)。要执行 CLIPS 代码,您需要使用environment.eval.

在 CLIPS 6.30 中,一旦断言就不可能更改事实(6.40 为此添加了 API)。这样做的唯一方法是收回旧的并用更新的值断言新的。

def modify_fact(fact):
    """Modify a template fact."""
    fact.retract()

    new_fact = fact.template.new_fact()
    new_fact.update(dict(fact))  # copy over old fact slot values

    new_fact["s_1"] = clips.Symbol("v_2") 

    new_fact.assertit()

CLIPS 提供了modify完全相同的命令:收回事实并用新值断言它。然而,它不能通过 API 使用,environment.eval因为事实索引不能通过 API 使用。如果要修改规则中的事实,最好modify直接使用命令。

(defrule rule_1
  ?p <- (t (s_1 ?v))
  =>
  (modify ?p (s_1 v_2)))
于 2018-12-30T13:59:06.667 回答