我如何在 CLIPS deffunction 中断言一个事实?

How do I assert a fact in a CLIPS deffunction?

我最初尝试使用修改功能,但它什么也没做,只是打印错误,我不知道我做错了什么。

我用过

(modify ?tv (v ?x))

没用。 然后我用了

    (retract ?tv)
    (assert (v ?x))

相反,它起作用了。 但是我不想每次我想修改一个事实时都输入它,所以我做了一个 deffunction 来帮我做,但是

(deffunction modfact(?index ?factname ?factvalue)
    (retract ?index)
    (assert (?factname ?factvalue))
)

在此它给出了一个语法错误:

[PRNTUTIL2] Syntax Error:  Check appropriate syntax for first field of a RHS pattern.

ERROR:
(deffunction MAIN::modfact
    (?index ?factname ?factvalue)
    (retract ?index)
    (assert (?factname

在我看来,它说我实际上无法实现此功能,因为我无法用变量值断言一个事实。我怎样才能让它工作?

修改仅适用于具有用插槽定义的关联 deftemplate 的事实:

CLIPS> 
(deftemplate task
   (slot id)
   (slot completed))
CLIPS> (watch facts)
CLIPS> (assert (task (id x) (completed no)))
==> f-1     (task (id x) (completed no))
<Fact-1>
CLIPS> 
(defrule modit
   ?f <- (task (completed ~yes))
   =>
   (modify ?f (completed yes)))
CLIPS> (run)
<== f-1     (task (id x) (completed no))
==> f-2     (task (id x) (completed yes))
CLIPS>

使用断言命令时,事实的第一个字段必须是一个符号。如果你必须绕过这个限制,你可以使用 str-assert 函数。

CLIPS> 
(deffunction modfact (?index ?factname ?factvalue)
   (retract ?index)
   (str-assert (str-cat "(" ?factname " " ?factvalue ")")))
CLIPS> (assert (v 3))
==> f-3     (v 3)
<Fact-3>
CLIPS> (modfact 3 v 4)
<== f-3     (v 3)
==> f-4     (v 4)
<Fact-4>
CLIPS>