почему отозванный шаблон факта по-прежнему доступен? - PullRequest
0 голосов
/ 30 декабря 2018

Я пытаюсь изменить факт факт-шаблона в клипах с помощью ClipsPY.Следующий код убирает и подтверждает этот факт.Почему после отмены факта значение интервала s_2 не равно nil при повторном утверждении?

run.py

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

;; 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)
    )

Вывод:

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 - это не ноль, а предыдущее установленное значение v_2, которое было установлено до того, как факт был отозван.

1 Ответ

0 голосов
/ 30 декабря 2018

Утверждение и удаление факта не изменяет его.Он просто добавляет / удаляет его из базы знаний движка.

Вы можете видеть deftemplate как класс и fact, созданный из него как объект.Вы можете расширить базу знаний движка, добавляя и удаляя факты из API или с помощью правил.

# 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))'
...