我正在建立一个小型专家系统来诊断汽车问题,以推荐合适的解决方案。
由于汽车可能存在许多问题(作为事实插入),专家系统必须结合确定性因素来阐明冗余事实。
一旦系统检测到两个相似的事实(两者都具有相同的设备名称但具有不同的确定性因子),它应该调用使用等式在一个事实中组合两者的函数(在下图中) )结合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)
执行时,会报告以下错误:
错误消息:找不到类。 嵌套异常是: +
我会感激你的每一个帮助。
答案 0 :(得分:0)
在变量中存储函数名称(" +"," - ")当然是可能的,但这并不意味着您可以使用它来调用通过变量的功能。在这个简单的情况下,最好计算if函数中的总和或差异:
(bind ?sod (if (> ?cf1 0) then (+ 1 ?cf1) else (- 1 ?cf1)))
并使用?sod
。
如果您的心脏确实通过变量使用函数,那么您必须调查eval
和lambda
但这肯定会有点过分。
解释错误消息:您已经遇到了catch-all语法模式,即省略了keyowrd的call
函数:
([call] <java object> | <class-name> <method-name> <argument>*)
因此变量(!)?op
不是函数名,因此它必须是Java对象引用,它不是;最后是最后的手段:尝试一个可见的类名。