首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ClipsPy以编程方式修改事实槽

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

Stack Overflow用户
提问于 2018-12-29 07:16:26
回答 1查看 672关注 0票数 0

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

我尝试过在clips.build例程中重新分配插槽值和发送修改(请参阅下面的py_modify函数),但没有工作。

这是.clp文件

代码语言:javascript
复制
;; 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文件。

代码语言:javascript
复制
# 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()

输出是

代码语言:javascript
复制
 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,但事实并非如此。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-30 13:59:06

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

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

代码语言:javascript
复制
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命令。

代码语言:javascript
复制
(defrule rule_1
  ?p <- (t (s_1 ?v))
  =>
  (modify ?p (s_1 v_2)))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53967519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档