无法在剪辑中输入规则

时间:2014-11-05 01:55:13

标签: system clips

我在使用剪辑时遇到了问题。 我正在尝试为车辆进行检测失败系统。 我有这个功能,让我用预定义的答案问一个问题,并将答案保存到变量中。 我的问题是,我进入第一个规则,被问到第一个问题但是,无论我做什么,都不能让它进入第二个规则(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))

1 个答案:

答案 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)))