在Jess中结合确定性因子时出错

时间:2017-05-12 15:56:40

标签: clips expert-system jess

我正在建立一个小型专家系统来诊断汽车问题,以推荐合适的解决方案。

由于汽车可能存在许多问题(作为事实插入),专家系统必须结合确定性因素来阐明冗余事实。

一旦系统检测到两个相似的事实(两者都具有相同的设备名称但具有不同的确定性因子),它应该调用使用等式在一个事实中组合两者的函数(在下图中) )结合CFs: equations of combining two certainty factors

这是我的代码(用Jess编写):

(deffunction combine-cf (?cf1 ?cf2)
; it has been done with minimum condition :)
((if (> (* ?cf1 ?cf2) 0); both have the same sign
    then
        (if (> ?cf1 0) then (bind ?op +) else (bind ?op -))
        (bind ?cf1 (+ ?cf1 (* ?cf2 (?op 1 ?cf1))))
    else
        (bind ?cf1 (+ ?cf1 (/ ?cf2 (- 1 (min (abs ?cf1)(abs ?cf2))))))
        ) 
(retract ?cf2)); end of function's body
?cf1)

执行时,会报告以下错误:

  

错误消息:找不到类。   嵌套异常是:   +

我会感激你的每一个帮助。

1 个答案:

答案 0 :(得分:0)

在变量中存储函数名称(" +"," - ")当然是可能的,但这并不意味着您可以使用它来调用通过变量的功能。在这个简单的情况下,最好计算if函数中的总和或差异:

(bind ?sod (if (> ?cf1 0) then (+ 1 ?cf1) else (- 1 ?cf1)))

并使用?sod

如果您的心脏确实通过变量使用函数,那么您必须调查evallambda但这肯定会有点过分。

解释错误消息:您已经遇到了catch-all语法模式,即省略了keyowrd的call函数:

([call] <java object> | <class-name> <method-name> <argument>*)

因此变量(!)?op不是函数名,因此它必须是Java对象引用,它不是;最后是最后的手段:尝试一个可见的类名。