我最初尝试使用修改功能,但它没有做任何事情只是打印错误,我不知道我做错了什么。
我用过
(modify ?tv (v ?x))
它没有用。 然后我用
(retract ?tv)
(assert (v ?x))
相反,这是有效的。
但是,每次我想要修改一个事实时,我都不想输入它,所以我为我做了一个不足之处,但是
(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
在我看来,它说我实际上无法实现这个功能,因为我不能用变量的值来断言事实。我怎样才能让它发挥作用?
答案 0 :(得分:0)
修改仅适用于具有与插槽定义的关联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>
使用assert命令时,事实的第一个字段必须是符号。如果必须绕过此限制,可以使用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>