如何在CLIPS deffunction中断言事实?

时间:2015-09-26 01:05:19

标签: clips

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

我用过

(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

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

1 个答案:

答案 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> 
相关问题