Как я могу использовать deftemplate для хранения результатов в CLIPS? - PullRequest
0 голосов
/ 14 декабря 2011

Я пытался создать шаблон для хранения некоторых результатов, которые я вычисляю, поэтому я сделал это для инициализации:

(deftemplate tempAlumne
    (slot nota-media-total)
    (slot nota-media-obligatorias)
    (slot nota-media-optativas)
    (slot nota-media-ales)
)

(deffacts tempAlumneFacts
    (tempAlumne 
        (nota-media-total -1)
        (nota-media-obligatorias -1)
        (nota-media-optativas -1)
        (nota-media-ales -1)
    )
)

И затем я пытаюсь использовать эту структуру для хранения значений, ноМне нужно, чтобы это было доступно из многих правил, поэтому я решил сделать его глобальным.Поэтому я попытался сохранить значения следующим образом:

(defrule calcula-nota-media ""
    (not calcula-nota-media ok)
    ?*tmpA* <- (tempAlumne )

    =>
    (bind ?llista_convocs (send ?*alumne* get-IConvocatoria))
    (bind ?suma 0)
    (bind ?i 0) 
    (while(< ?i (length$ ?llista_convocs)) do
        (bind ?convoc_actual (nth$ ?i ?llista_convocs))
        (bind ?suma (+ ?suma (send ?convoc_actual get-Nota)))
        (bind ?i (+ ?i 1))
    )   
    (/ )    
    (modify (?*tmpA* (nota-media-total (/ ?suma ?i))
    (assert calcula-nota-media ok)
)

, потому что я хочу, чтобы? * TmpA * имел начальные значения, а затем присваивал каждому из них модификацию (здесь я назначаю nota-media-total), ноговорит "Синтаксическая ошибка [PRNTUTIL2]: проверьте соответствующий синтаксис для дефруляции.", поэтому я не знаю, что не так, или если я иду по неправильному пути.

1 Ответ

1 голос
/ 16 марта 2012

Было бы полезно прочитать руководство пользователя, поскольку оно охватывает основной синтаксис.Я исправил некоторые из ваших ошибок:

(defrule calcula-nota-media ""
    (not (calcula-nota-media ok))
    ?tmpA <- (tempAlumne)
    =>
    (bind ?llista_convocs (send ?*alumne* get-IConvocatoria))
    (bind ?suma 0)
    (bind ?i 0) 
    (while(< ?i (length$ ?llista_convocs)) do
        (bind ?convoc_actual (nth$ ?i ?llista_convocs))
        (bind ?suma (+ ?suma (send ?convoc_actual get-Nota)))
        (bind ?i (+ ?i 1))
    )   
    ; (/ )  What's this for?  
    (modify ?tmpA (nota-media-total (/ ?suma ?i)))
    (assert (calcula-nota-media ok))
)
...