首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么收回的事实模板仍然可用?

为什么收回的事实模板仍然可用?
EN

Stack Overflow用户
提问于 2018-12-30 23:35:18
回答 1查看 92关注 0票数 0

我正在尝试使用ClipsPY修改剪辑中事实模板的一个事实。下面的代码收回并重申了这一事实。为什么事实被撤销后,插槽值s_2在重新声明时不是nil

run.py

代码语言:javascript
复制
import clips

clips_env = clips.Environment()

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

def py_modify(p):
    print("\nfacts:")
    py_pfact()

    p.retract()
    print("\nfacts after retracted:")
    py_pfact()

    p["s_1"] = clips.Symbol("v_2") 
    p.assertit()
    print("\nfacts after re_assert:")
    py_pfact()

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

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

这是clp文件

代码语言:javascript
复制
;; KB.clp
(deftemplate t
            (slot s_1 (type SYMBOL))
            (slot s_2 (type SYMBOL))
    )

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

    (defrule rule_1
            ?p<-(t (s_1 ?v&~v_2))
            =>
            (py_modify ?p)
    )

输出为:

代码语言:javascript
复制
facts:
(initial-fact)
(t (s_1 v_1) (s_2 v_2))

facts after retracted:
(initial-fact)

facts after re_assert:
(initial-fact)
(t (s_1 v_2) (s_2 v_2))

我希望输出是(t (s_1 v_2) (s_2 nil)),但是s_2不是nil,而是之前设置的值v_2,它是在事实撤销之前设置的。

EN

回答 1

Stack Overflow用户

发布于 2018-12-31 01:04:00

断言和收回一个事实并不能修改它。它只是在引擎知识库中添加/删除它。

您可以将deftemplate看作是一个类,而将从它创建的fact看作是一个对象。您可以通过从API或通过规则添加和删除事实来扩展引擎知识库。

代码语言:javascript
复制
# define a fact template within the engine
environment.build('(deftemplate foo (slot bar) (slot baz))')
template = environment.find_template('foo')

# create a new fact and set its values
fact = template.new_fact()
fact['bar'] = 1
fact['baz'] = 1

# assert the fact within the engine
fact.assertit()

assert fact in environment.facts()

# retract it
fact.retract()

assert fact not in environment.facts()
assert fact is fact  # fact is the same object as before

fact['baz'] = 2

assert fact is fact  # still the same object

fact.assertit()

assert str(fact) == '(foo (bar 1) (baz 2))'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53978936

复制
相关文章

相似问题

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