2014-11-05 2 views
0

У меня проблема с использованием клипов. Я пытаюсь сделать систему обнаружения-сбой для автомобиля. У меня есть эта функция, которая позволяет мне задавать вопрос с предопределенными ответами и сохранять ответ в переменной. Моя проблема в том, что я вхожу в первое правило, задаю первый вопрос, но, что бы я ни делал, не могу заставить его войти во второе правило (tipo-передача), чтобы я мог продолжить последовательность, help pls.Не удается ввести правило в клипе

;;----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

Ваша стратегия присвоения ценностей факту carro неясна. Вы по умолчанию передаете значение слота передачи в automatica и слот falla для механики. Оба правила tipo-falla и tipo-трансляции присваивают значения слотам передачи и 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))) 
Смежные вопросы