【问题标题】:How do I assert a fact in a CLIPS deffunction?如何在 CLIPS deffunction 中断言一个事实?
【发布时间】:2015-09-26 01:05:19
【问题描述】:

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

我用过

(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

在我看来,这似乎是说我实际上无法创建此函数,因为我无法用变量的值断言事实。我怎样才能让它工作?

【问题讨论】:

    标签: clips


    【解决方案1】:

    Modify 仅适用于具有使用槽定义的关联 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> 
    

    【讨论】:

    • 谢谢!不幸的是,我已经完成了单独输入所有撤回和断言的事情,这很粗糙。不过,我肯定会在下一个作业中使用它!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多