我如何在 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>
我最初尝试使用修改功能,但它什么也没做,只是打印错误,我不知道我做错了什么。
我用过
(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>