我正在尝试构建一个模板来存储我计算的一些结果,所以我将其用于初始化:
(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]语法错误:检查适当的defrule语法。” ,所以我不知道出了什么问题,或者我走错了路。
答案 0 :(得分: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))
)
; (/ ) What's this for?
(modify ?tmpA (nota-media-total (/ ?suma ?i)))
(assert (calcula-nota-media ok))
)