2015-09-26 82 views
0

我最初嘗試使用修改功能,但它不會做任何事情,只是打印假,我不知道我在做什麼錯。如何在CLIPS deffunction中聲明事實?

我用

(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

修改只適用於具有相關聯的自定義模板與時隙定義的事實:

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> 
+0

謝謝!不幸的是,我已經完成了所有的縮進工作,並單獨提出了斷言,這很粗糙。我一定會在下一次任務中使用它! –