使用 ClipsPy 以编程方式修改事实槽
Programmatically modify a fact slot using ClipsPy
如何使用 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
插槽从 v_1
修改为 v_2
,但事实并非如此。
environment.build
method is for building constructs (defrule
, deftemplate
, etc.) within the engine. To execute CLIPS code, you need to use environment.eval
.
在 CLIPS 6.30 中,一旦断言就无法更改事实(6.40 为此添加了 APIs)。这样做的唯一方法是收回旧的并声明具有更新值的新的。
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
命令,它做的完全一样:撤回事实并用新值断言它。然而,它不能通过 environment.eval
使用,因为事实索引不能通过 API 使用。如果要修改规则内的事实,最好直接使用modify
命令。
(defrule rule_1
?p <- (t (s_1 ?v))
=>
(modify ?p (s_1 v_2)))
如何使用 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
插槽从 v_1
修改为 v_2
,但事实并非如此。
environment.build
method is for building constructs (defrule
, deftemplate
, etc.) within the engine. To execute CLIPS code, you need to use environment.eval
.
在 CLIPS 6.30 中,一旦断言就无法更改事实(6.40 为此添加了 APIs)。这样做的唯一方法是收回旧的并声明具有更新值的新的。
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
命令,它做的完全一样:撤回事实并用新值断言它。然而,它不能通过 environment.eval
使用,因为事实索引不能通过 API 使用。如果要修改规则内的事实,最好直接使用modify
命令。
(defrule rule_1
?p <- (t (s_1 ?v))
=>
(modify ?p (s_1 v_2)))