我在使用剪辑时遇到了问题。 我正在尝试为车辆进行检测失败系统。 我有这个功能,让我用预定义的答案问一个问题,并将答案保存到变量中。 我的问题是,我进入第一个规则,被问到第一个问题但是,无论我做什么,都不能让它进入第二个规则(tipo-transmision)所以我可以继续顺序,帮助请。 / p>
;;----DEFFUNCTION----------
(deffunction pregunta (?pregunta $?respuestas-posibles)
(printout t ?pregunta)
(bind ?respuesta (read))
(if (lexemep ?respuesta)
then (bind ?respuesta (lowcase ?respuesta)))
(while (not (member ?respuesta ?respuestas-posibles)) do
(printout t ?pregunta)
(bind ?respuesta (read))
(if (lexemep ?respuesta)
then (bind ?respuesta (lowcase ?respuesta))))
?respuesta)
;; ----DEFTEMPLATE--------
(deftemplate carro
(slot falla (type SYMBOL)
(allowed-values electrica mecanica)
(default mecanica)
)
(slot transmision (type SYMBOL)
(allowed-values automatica manual)
(default automatica)
)
(multislot sintoma)
(multislot compostura)
)
;;----------DEFFACTS--------
(deffacts inicia
(carro))
;;---------DEFRULES---------
(defrule tipo-falla ""
?A <- (carro (compostura) )
=>
(bind ?resp (pregunta "Tipo de Falla (electrica/mecanica)? " electrica mecanica)
)
(if (eq ?resp electrica)
then (modify ?A (falla electrica)
(transmision automatica)
(compostura)
(sintoma)
)
else (modify ?A (falla mecanica)
(transmision automatica)
(compostura)
(sintoma))
)
)
;;-------------------------------------------------------
(defrule tipo-transmision ""
?A <- (carro (transmision automatica) (compostura) (sintoma))
=>
(bind ?resp (pregunta
"Tipo de Transmision (automatica/manual)? " automatica manual)
)
(if (eq ?resp automatica)
then (modify ?A (transmision automatica)
(falla electrica)
(sintoma cortocircuito)
)
else (modify ?A (transmision manual)
)
)
)
;;--------------------------------------------------------
(defrule tipo-sintoma ""
?A <- (carro (falla electrica) (transmision automatica) (sintoma cortocircuito)(compostura) )
=>
(bind ?resp (pregunta "Tipo de Sintoma (desajustesensor/cortocircuito/interruptorposicionralentia? " desajustesensor cortocircuito interruptorposicionralentia) )
(modify ?A (sintoma ?resp ))
)
;;----------------------------------
(defrule diagnostico1 ""
?A <- (carro (falla mecanica) (transmision automatica) (sintoma desajustesensor cortocircuito interruptorposicionralentia)(compostura) )
=>
(modify ?A (falla mecanica)
(transmision automatica)
(sintoma desajustesensor cortocircuito interruptorposicionralentia)
(compostura "DAÑADO EL SENSOR DE LA MARIPOSA DE GASES")
)
)
;;---------------------------------
(defrule nada ""
(declare (salience -10))
?A <- (carro (compostura))
=>
(modify ?A (compostura "Llevalo al mecanico.")))
;;----------RESULTADOS--------------------
(defrule inicia
(declare (salience 1))
=>
(printout t crlf crlf)
(printout t "Sistema de Detección de Fallas de Un Vehiculo")
(printout t crlf crlf))
(defrule resultados
(declare (salience -1))
(carro (falla ?A) (transmision ?T) (sintoma ?S) (compostura ?C))
=>
(printout t "La falla es " ?A crlf)
(printout t "La transmision es " ?T crlf)
(printout t "El sintoma es " ?S crlf)
(printout t "Se sugiere de reparacion que:")
(printout t crlf crlf)
(format t " %s%n%n%n" ?C))
答案 0 :(得分:0)
您为carro事实分配价值的策略尚不清楚。您将transmision槽值默认为automatica,将falla槽默认为mechanica。 tipo-falla和tipo-transmision规则都为传输和falla插槽赋值,因此即使tipo-falla规则本身没有循环,你也会遇到这两个规则相互作用的问题。
如果为插槽分配了一个表示未指定的值,则可以在规则中使用此值来确定是否已分配值并阻止规则重新触发。
(deftemplate carro
(slot falla
(type SYMBOL)
(allowed-values electrica mecanica nespecificat)
(default nespecificat))
(slot transmision
(type SYMBOL)
(allowed-values automatica manual nespecificat)
(default nespecificat))
(multislot sintoma)
(multislot compostura))
(defrule tipo-falla ""
?A <- (carro (falla nespecificat))
=>
(bind ?resp (pregunta "Tipo de Falla (electrica/mecanica)? " electrica mecanica))
(modify ?A (falla ?resp)))