Python 使用ClipsPy以编程方式修改事实槽

Python 使用ClipsPy以编程方式修改事实槽,python,clips,clipspy,Python,Clips,Clipspy,如何使用ClipsPy修改剪辑中模板的事实 我已尝试重新分配插槽值并在剪辑中发送修改。生成例程(请参阅下面的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_

如何使用ClipsPy修改剪辑中模板的事实

我已尝试重新分配插槽值并在
剪辑中发送修改。生成
例程(请参阅下面的
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)
)
输出是

 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
,但事实并非如此。

该方法用于在引擎中构建构件(
defrule
deftemplate
等)。要执行CLIPS代码,需要使用

在Clips6.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
命令,该命令的作用与此完全相同:收回事实并用新值断言它。然而,它不能通过
environment.eval使用,因为事实索引不能通过API使用。如果要修改规则中的事实,最好直接使用
modify
命令

(defrule rule_1
  ?p <- (t (s_1 ?v))
  =>
  (modify ?p (s_1 v_2)))
(定义规则1
P
(修改?p(s_1 v_2)))
该方法用于在引擎中构建构件(
defrule
deftemplate
等)。要执行CLIPS代码,需要使用

在Clips6.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
命令,该命令的作用与此完全相同:收回事实并用新值断言它。然而,它不能通过
environment.eval使用,因为事实索引不能通过API使用。如果要修改规则中的事实,最好直接使用
modify
命令

(defrule rule_1
  ?p <- (t (s_1 ?v))
  =>
  (modify ?p (s_1 v_2)))
(定义规则1
P
(修改?p(s_1 v_2)))

我们可以使用clipsPy发送根级别的命令吗?类似于SendCommand,因为如果我在Eval中发送modify语句,Eval将引发错误。
clipspy
不支持此类功能。在Python中评估CLIPS命令没有什么意义,因为您可以在规则中以本机方式执行它们。
eval
方法应该真正用于极端情况,因为它非常慢。对于我的用例,我需要分析用户输入,以确定模板的哪个插槽需要修改/断言/收回,或者处理一些特殊情况。不确定,但可能是SendCommand在特殊情况下会有所帮助。(我还在学习剪辑。我已经试用过同时支持Eval和SendCommand的PyCLIPS)我建议你用一个更广泛的问题来解释你想要达到的目标。说明你想做什么。到目前为止,您做了些什么?您面临的挑战是什么。您也可以使用CLIPS论坛提出开放式问题和建议。我们可以使用clipsPy发送根级别的命令吗?类似于SendCommand,因为如果我在Eval中发送modify语句,Eval将引发错误。
clipspy
不支持此类功能。在Python中评估CLIPS命令没有什么意义,因为您可以在规则中以本机方式执行它们。
eval
方法应该真正用于极端情况,因为它非常慢。对于我的用例,我需要分析用户输入,以确定模板的哪个插槽需要修改/断言/收回,或者处理一些特殊情况。不确定,但可能是SendCommand在特殊情况下会有所帮助。(我还在学习剪辑。我已经试用过同时支持Eval和SendCommand的PyCLIPS)我建议你用一个更广泛的问题来解释你想要达到的目标。说明你想做什么。到目前为止,您做了什么?您面临的挑战是什么。您也可以使用CLIPS论坛提出开放式问题和建议。无需在没有其他条件的情况下将初始事实添加到规则中;它会自动添加到版本6.3之前的剪辑版本中。最初的事实功能在6.3版本中被弃用;它仍然由重置断言,但无条件的规则不再依赖它。在6.4版本中,初始事实不再被断言,因此显式匹配此事实的规则将不再被激活。无需将初始事实添加到没有其他条件的规则中;它会自动添加到版本6.3之前的剪辑版本中。最初的事实功能在6.3版本中被弃用;它仍然由重置断言,但无条件的规则不再依赖它。在6.4版本中,初始事实不再被断言,因此显式匹配此事实的规则将不再被激活。