2015-12-17 2 views
0

excusez mon anglais, je suis espagnol. J'ai un problème avec les configurations de mon ordinateur système expert dans CLIPS.règle qui ne fonctionne pas

Ma règle "preciogamingoc" ne fonctionne pas, j'ai essayé de mille façons mais ne fonctionne pas.

Je laisse le code ici. Je ne sais pas comment le mettre mieux, désolé pour cela.

;;****TEMPLATES***** 

(deftemplate pc 
(slot tipo) 
(slot oc) 
(multislot procesador) 
(multislot ram) 
(multislot placabase) 
(multislot discoduro) 
(multislot grafica) 
(multislot fuente) 
(slot precio)) 

;;****FUNCTIONS***** 

(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) 

(deffunction sino (?pregunta) 
    (bind ?respuesta (pregunta ?pregunta si no s n)) 
    (if (or (eq ?respuesta si) (eq ?respuesta s)) 
     then TRUE 
     else FALSE)) 

(deffunction tipo (?pregunta) 
    (bind ?respuesta (pregunta ?pregunta g d o)) 
    (switch ?respuesta 
     (case g then (return g)) 
     (case d then (return d)) 
     (case o then (return o)) 
     )) 


;;******FACTS******* 

(deffacts inicia 
    (pc)) 


;;******RULES******* 


(defrule tipopc 
?A <- (pc (procesador)(ram)(placabase)(discoduro)(grafica)(fuente)) 
=> 
(switch (tipo "Tipo (juegos:g/diseño:d/otros:o)? ") 
    (case g then (modify ?A (tipo g)(oc nose)(procesador "i5 4690_Intel") 
    (ram "2x4GB 2133 cl9") 
    (placabase "Gigabyte_H97M-HD3 ejemplo") 
    (discoduro "1Tb") 
    (grafica "GTX 960") 
    (fuente "700W+ silver") 
    (precio 550))) 
    (case d then (modify ?A (tipo d)(oc nose)(procesador "i7 4790_Intel") 
    (ram "2x8GB 2133 cl9") 
    (placabase "Gigabyte_H97M-HD3 ejemplo") 
    (discoduro "1Tb HDD + 120gb SSD") 
    (grafica "kuadro k620") 
    (fuente "700W+ silver") 
    (precio 700))) 
    (case o then (modify ?A (tipo o)(oc nose)(procesador "i3 6100_Intel") 
    (ram "2x4GB 2400 cl12 DDR4") 
    (placabase "Msi H110M PRO-VH") 
    (discoduro "1Tb") 
    (grafica "no incluida") 
    (fuente "450W+ bronze") 
    (precio 300))))) 

(defrule oc 
    ?A <- (pc(tipo g)(oc nose)) 
    => 
    (if (sino "Hará overclock al procesador (si/no)?: ") 
    then (modify ?A (oc si))) 
) 

(defrule preciogamingoc 
?A <- (pc (tipo g) (oc si) (procesador) (ram) (placabase) (discoduro) (grafica) (fuente)) 
=> 
    (printout t "Veo que su sistema será destinado a juegos y que además se le podrá hacer overclock." crlf 
    "Ahora debe introducir el presupuesto medio para que podamos darle una configuración mas concreta." crlf 
    "Introduzca su presupuesto de referencia(>= 750): ") 
    (bind ?precio (read)) 
    (if (and(>= ?precio 750)(< ?precio 850)) 
    ;;then ((printout t "bien"crlf)) 
    then (modify ?A (procesador "i5 4690K_Intel") 
    (ram "2x8GB 2133 cl9") 
    (placabase "Gigabyte_Z97X gaming 3 ejemplo") 
    (discoduro "1Tb") 
    (grafica "GTX 970") 
    (fuente "700W+ silver") 
    (precio 750))) 
    ;;(else (if (>= ?precio 850) 
    ;;then (modify ?C (procesador "i7 4790K_Intel") 
    ;;(ram "2x8GB 2133 cl9") 
    ;;(placabase "Gigabyte_Z97X gaming 5 ejemplo") 
    ;;(discoduro "1Tb HDD") 
    ;;(grafica "GTX 970") 
    ;;(fuente "700W+ silver") 
    ;(precio 850)))) 
) 


;;*******MAIN******* 

(defrule inicio 
    (declare (salience 1)) 
    => 
    (printout t crlf) 
    (printout t "Sistema Experto de Configuracion de Ordenadores") 
    (printout t crlf crlf)) 

    (defrule presupuesto 
    (declare (salience -1)) 
    (pc (procesador ?A)(ram ?F)(placabase ?B)(discoduro ?M)(grafica ?G)(fuente ?P)(precio ?O)) 
    => 
    (printout t crlf crlf "-.PRESUPUESTO.-" crlf crlf) 
    (printout t "PROCESADOR: " ?A crlf) 
    (printout t "RAM: " ?F crlf) 
    (printout t "PLACA BASE: " ?B crlf) 
    (printout t "DISCO DURO:" ?M crlf) 
    (printout t "GRAFICA: " ?G crlf) 
    (printout t "FUENTE: " ?P crlf crlf) 
    (printout t "PRECIO: " ?O crlf) 
    ) 

Répondre

0

La règle preciogamingoc correspond à un fait de PC, de sorte que vous pouvez exécuter le programme, vérifiez quelles sont les règles d'exécuter et d'examiner le fait de pc pour voir quelles valeurs ont été assignés:

CLIPS> (reset) 
CLIPS> (watch rules) 
CLIPS> (run) 
FIRE 1 inicio: * 

Sistema Experto de Configuracion de Ordenadores 

FIRE 2 tipopc: f-1 
Tipo (juegos:g/diseño:d/otros:o)? g 
FIRE 3 oc: f-2 
Hará overclock al procesador (si/no)?: si 
FIRE 4 presupuesto: f-3 


-.PRESUPUESTO.- 

PROCESADOR: i5 4690_Intel 
RAM: 2x4GB 2133 cl9 
PLACA BASE: Gigabyte_H97M-HD3 ejemplo 
DISCO DURO:1Tb 
GRAFICA: GTX 960 
FUENTE: 700W+ silver 

PRECIO: 550 
CLIPS> (facts) 
f-0  (initial-fact) 
f-3  (pc (tipo g) (oc si) (procesador "i5 4690_Intel") (ram "2x4GB 2133 cl9") (placabase "Gigabyte_H97M-HD3 ejemplo") (discoduro "1Tb") (grafica "GTX 960") (fuente "700W+ silver") (precio 550)) 
For a total of 2 facts. 
CLIPS> (ppfact 3) 
(pc 
    (tipo g) 
    (oc si) 
    (procesador "i5 4690_Intel") 
    (ram "2x4GB 2133 cl9") 
    (placabase "Gigabyte_H97M-HD3 ejemplo") 
    (discoduro "1Tb") 
    (grafica "GTX 960") 
    (fuente "700W+ silver") 
    (precio 550)) 
CLIPS> 

le motif de la règle de preciogamingoc est:

?A <- (pc (tipo g) 
      (oc si) 
      (procesador) 
      (ram) 
      (placabase) 
      (discoduro) 
      (grafica) 
      (fuente)) 

les valeurs d'information pour le tipo et des fentes oc correspondent au modèle, mais les valeurs pour le processeur, la RAM, placabase, discoduro, grafica, et f Les fentes uente ne le font pas. Ces emplacements peuvent avoir zéro ou plusieurs valeurs. Le fait a une valeur unique pour chacun, mais votre modèle spécifie que chacun de ces emplacements est vide afin que le modèle ne soit pas apparié.

Vous devez supprimer ces emplacements du motif ou vérifier des valeurs spécifiques. Vous devez également empêcher l'exécution de la règle une fois que le fait PC a été modifié dans les actions de la règle (peut-être en changeant la valeur de oc à si-actualizado pour indiquer que la règle a été appliquée):

(defrule preciogamingoc 
    ?A <- (pc (tipo g) (oc si)) 
    => 
    (printout t "Veo que su sistema será destinado a juegos y que además se le podrá hacer overclock." crlf 
       "Ahora debe introducir el presupuesto medio para que podamos darle una configuración mas concreta." crlf 
       "Introduzca su presupuesto de referencia(>= 750): ") 
    (bind ?precio (read)) 
    (if (and (>= ?precio 750)(< ?precio 850)) 
     then 
     (modify ?A (oc si-actualizado) 
       (procesador "i5 4690K_Intel") 
       (ram "2x8GB 2133 cl9") 
       (placabase "Gigabyte_Z97X gaming 3 ejemplo") 
       (discoduro "1Tb") 
       (grafica "GTX 970") 
       (fuente "700W+ silver") 
       (precio 750)))) 
(defrule preciogamingoc 
    ?A <- (pc (tipo g) (oc si)) 
    => 
    (printout t "Veo que su sistema será destinado a juegos y que además se le podrá hacer overclock." crlf 
       "Ahora debe introducir el presupuesto medio para que podamos darle una configuración mas concreta." crlf 
       "Introduzca su presupuesto de referencia(>= 750): ") 
    (bind ?precio (read)) 
    (if (and (>= ?precio 750)(< ?precio 850)) 
     then 
     (modify ?A (oc si-actualizado) 
       (procesador "i5 4690K_Intel") 
       (ram "2x8GB 2133 cl9") 
       (placabase "Gigabyte_Z97X gaming 3 ejemplo") 
       (discoduro "1Tb") 
       (grafica "GTX 970") 
       (fuente "700W+ silver") 
       (precio 750))))