Ingeniería del Conocimiento Ingeniería Electrónica Práctica 2 - Sistemas Expertos y Jess 1) (Jess) Considere las siguientes reglas para aconsejar las actividades a una persona: R1: vacaciones ˄ examen = no → Tiempo_libre R2: dinero → Actividad = compras R3: Tiempo_libre ˄ dinero → Actividad = viaje R4: examen = si → Actividad = estudio R5: desocupado → Tiempo_libre a) Se desea determinar cuál será la actividad de Juan utilizando Jess, sabiendo que está desocupado y tiene dinero. b) Ahora suponga Pedro tiene vacaciones, no rinde examen, tiene dinero. 2) (Jess) Dadas las siguientes reglas para diagnóstico y tratamiento de enfermedades simples: Si temperatura alta Entonces fiebre Si fiebre y dolores en el cuerpo y dolor de garganta Entonces gripe Si dolor de garganta y estornudos Entonces resfrío Si fiebre y gangleos inflamados Entonces infección Si resfrío Entonces aspirina y abrigarse Si gripe Entonces paracetamol y acostarse Si infección Entonces antibióticos a) Crear en Jess los objetos necesarios y sus slots correspondientes para poder representar estructuradamente las variables del sistema. b) Implementar las reglas dadas y probar el sistema. c) Inferir un diagnóstico y un tratamiento para un conjunto de síntomas ingresado por teclado. ; Ayuda para posible solución: ; Considerar que una persona tiene un nombre y puede sentir determinados ; síntomas. La medicina trata de deducir diagnósticos a partir de ciertos síntomas. 1 ; En general, una vez determinado un diagnóstico, se recetan indicaciones. ; Con este razonamiento, un ejemplo de cómo se puede estructurar la información es el siguiente: (deftemplate persona (slot nombre) (multislot sintomas)) (deftemplate medicina (multislot sintomas) (slot diagnostico)) (deftemplate tratamiento (slot diagnostico) (multislot indicaciones)) (deffunction ingreso () (printout t "Ingrese el nombre de la persona:" crlf) (assert (persona (nombre (read)))) ) (defrule ingresoR ?t <- (persona (sintomas $?l)) ;(bind ?nom (read)) => (printout t "Cargar síntoma? s/n" crlf) (bind ?var (read)) (if (eq ?var s) then (modify ?t (sintomas ?l (read))))) ; ; ; ; ; El objetivo consiste en conseguir indicaciones médicas para una persona que padece ciertos síntomas. Es decir, la entrada al sistema será una persona con determinados síntomas y la salida, un conjunto de indicaciones. En este caso, las reglas asociarán personas con diagnósticos y diagnósticos con indicaciones. Por ejemplo: (defrule M1 ?m <- (medicina (sintomas dolor-garganta estornudos)) => (modify ?m (diagnostico resfrio))) (defrule T1 ?t <- (tratamiento (diagnostico resfrio)) => (modify ?t (indicaciones aspirina abrigarse))) ; Posteriormente, se deberá conectar los síntomas de las personas con los síntomas de la medicina ; y los diagnósticos médicos con los diagnósticos de los tratamientos: (defrule PM (persona (sintomas $?v)) => (assert (medicina (sintomas ?v)))) (defrule MT (medicina (diagnostico ?v)) => (assert (tratamiento (diagnostico ?v)))) ; Entonces, una vez encadenadas las acciones, nos interesan las indicaciones recomendadas. (defrule imprime (tratamiento (indicaciones $?lista&:(<> (length$ $?lista) 0))) => (printout t "Tratamiento: " ?lista crlf)) ; Por último, se lanza el sistema: (reset) (ingreso) (run) 2 3) (Jess) Dadas las siguientes reglas para diagnosticar problemas típicos en el uso de PCs: Si programa falla Entonces programa erróneo Si programa erróneo Entonces bug en el código Si año de compra >= 2007 Entonces PC nueva Si año de compra < 2007 Entonces PC vieja Si programa lento y PC nueva Entonces memoria insuficiente Si programa lento y PC vieja Entonces PC obsoleta Si PC obsoleta Entonces renovar PC Si memoria insuficiente Entonces memoria saturada Si programa se tilda Entonces conflictos Si conflictos o memoria saturada Entonces sistema operativo sobrecargado Si bug en el codigo Entonces corregir fuentes Si sistema operativo sobrecargado Entonces reiniciar PC a) Crear en Jess templates de hechos ordenados para poder representar las variables del sistema. b) Implementar las reglas. c) ¿Qué acción se debe tomar si el programa funciona lentamente en una PC 2008? 4) (Java (reglas en Jess)). Dada la siguiente clase Java: /****************************** archivo Complejo.java ******************************/ package compl; public class Complejo { private double real; 3 private double imag; public Complejo(double real, double imag) { this.real = real; this.imag = imag; } public double getReal() { return real; } public double getImag() { return imag; } } Diseñar un programa en java que pida el ingreso de un complejo por teclado y determine a qué cuadrante pertenece mediante el uso de reglas jess. Solución: La clase Cuadrantes copiada a continuación posee un método main que toma por teclado la parte real y la parte imaginaria de un complejo c y ejecuta un motor de inferencia para determinar a qué cuadrante pertenece el complejo c. /****************************** archivo Cuadrantes.java ******************************/ package compl; import jess.JessException; import java.io.*; public class Cuadrantes { public static void main(String[] args) throws JessException, IOException { Motor m = new Motor(); System.out.println("Ingrese la parte real: "); double a = leeDouble(); System.out.println("Ingrese la parte imaginaria: "); double b = leeDouble(); m.comenzar(new Complejo(a, b)); } public static String leeLinea() throws IOException { BufferedReader d = new BufferedReader(new InputStreamReader (System.in)); return d.readLine(); } public static double leeDouble() throws IOException { return Double.valueOf(leeLinea()).doubleValue(); } } La clase Motor posee un único campo miembro llamado motor de tipo Rete. El constructor de la clase carga el archivo "cuadrantes.clp". Este archivo jess permite crear complejos a partir de la clase java, y contiene las reglas para determinar el cuadrante de un complejo dado. 4 La clase Motor posee además, un método comenzar, que envía el complejo ingresado por teclado a la base de datos del motor y lanza su ejecución. /****************************** archivo Motor.java ******************************/ package compl; import jess.JessException; import jess.Rete; public class Motor { private Rete motor; public Motor() throws JessException { motor = new Rete(); motor.reset(); motor.batch("cuadrantes.clp"); } public void comenzar (Complejo z) throws JessException { motor.add(z); motor.run(); } } ; archivo cuadrantes.clp (import compl.*) (deftemplate Complejo (declare (from-class Complejo))) (defrule RA (Complejo (real ?a&:(>= ?a 0)) (imag ?b&:(>= ?b 0))) => (printout t "Z = " ?a " + " ?b "i -> Cuadrante I " crlf)) (defrule RB (Complejo (real ?a&:(< ?a 0)) (imag ?b&:(>= ?b 0))) => (printout t "Z = " ?a " + " ?b "i -> Cuadrante II " crlf)) (defrule RC (Complejo (real ?a&:(< ?a 0)) (imag ?b&:(< ?b 0))) => (printout t "Z = " ?a " + " ?b "i -> Cuadrante III " crlf)) (defrule RD (Complejo (real ?a&:(>= ?a 0)) (imag ?b&:(< ?b 0))) => (printout t "Z = " ?a " + " ?b "i -> Cuadrante IV " crlf)) Nota: Recordar que para que se pueda ejecutar jess desde java se deben haber seguido los siguientes pasos: a) Seleccionar el proyecto y hacer click derecho. 5 b) Seleccionar propiedades. c) Seleccionar Java Build Path -> Libraries -> Add External JARs... d) Seleccionar jess.jar (buscarlo en la carpeta ...\Jess71p2\Jess71p2\lib) 5) (Java (reglas en Jess)). Si los clientes tienen entre 15 y 25 años, les agrada el rock, y prefieren las bandas nacionales es conveniente recomendarles “Circo Beat” de Fito Páez. Si en cambio prefieren las bandas de rock extranjeras, la mejor opción es “Pop” de U2. Si el género preferido es el folklore, lo más adecuado es “Tarefero de mis pagos” de Chango Spasiuk. Para los clientes de más de 25 años que se inclinan por el rock, y prefieren las bandas nacionales, aconsejar “Almendra (1969)” de Almendra, si en cambio se inclinan por las bandas extranjeras, conviene recomendar el “Álbum Blanco” de Los Beatles. En caso de que prefieran el folklore, la mejor opción es “Luna Tucumana” de Atahualpa Yupanqui. a) Representar utilizando la estructura de objetos de Java el conocimiento del dominio presentado, de forma de implementar un sistema capaz de recomendar un CD de música. Utilizar las reglas generadas y el motor de Jess para acceder a las conclusiones. b) Pruebe el sistema en los siguientes casos ingresando los siguientes datos por teclado: - El cliente es Juan que tiene 20 años, le encanta el rock y prefiere la música nacional. - El cliente es Susana, de 37 años que prefiere el folklore. 6) (Jess) a) Diseñar un programa en Jess que resuelva el siguiente Sudoku de tamaño 4: 1 4 2 3 1 4 7) (Jess) Elección de monitor para PC Los monitores para PC pueden clasificarse de acuerdo a su resolución. Los monitores de baja resolución, pequeños, monocromáticos, aconsejables para aplicaciones de línea tales como cajeros de supermercados. Los monitores estándar y los de resolución mejorada, aconsejables para aplicaciones hogareñas o de oficina. En estas últimas aplicaciones, si el monitor se utilizará durante períodos prolongados, se sugiere el de resolución mejorada aunque por supuesto es más caro. Finalmente están los monitores profesionales cuyo dot pitch es menor o igual a 0.28 pulgadas. Estos monitores profesionales se aconsejan para aplicaciones específicas que requieren diferentes características: • Para diseño asistido por computadora (CAD) se requiere un manejo aceptable del color, pero muy bajo nivel de distorsión y se aconseja pantalla plana. • Para diseño gráfico, es fundamental un muy buen manejo del color. • Para aplicaciones médicas, se aconseja monitor monocromático, pero con una excelente escala de grises y relación de tamaño invertida (monitor vertical). a) Educir las reglas de este sistema en lenguaje natural y representarlas en Jess. 6 b) Implementar en Jess un menú de opciones para seleccionar el uso que el cliente le dará al monitor exponiendo una lista con las posibles aplicaciones. Sólo en caso de ser necesario activar preguntas adicionales. c) Determinar el monitor que se aconseja adquirir utilizando las reglas del sistema e imprimirlo en pantalla. 8) Problema ejemplo para entregar en grupo (utilizar esta situación o una similar) Lo siguiente es lo que respondió un experto en placas de video para PCs de escritorio, cuando se le preguntó sobre las características principales a tener en cuenta a la hora de seleccionar una placa de video para incorporarle a una computadora: “A la hora de seleccionar una placa de video, se tienen que tener en cuenta algunos factores fundamentales, que son compatibilidad, velocidad, y precio. En general las placas de video de marca Nvidia son más compatibles con gran variedad de sistemas operativos, ya que están fabricadas con componentes estándar y además la empresa permite la descarga de actualizaciones de drivers desde Internet. Las placas de marca ATI son buenas placas, y veloces, pero funcionan correctamente sólo bajo Windows, quitándose responsabilidad el fabricante si el usuario desea instalar algún otro sistema operativo. Los modelos más nuevos de Nvidia son bastante más rápidos que sus antecesores, pero todo en detrimento del precio. Comparando modelos de Nvidia y ATI lanzados al mercado en fechas similares, se puede observar que el modelo de ATI correspondiente es un poco más veloz, aunque el de Nvidia es más barato, salvo que se tome el mismo modelo de Nvidia pero con más memoria interna, en cuyo caso el precio aumenta, pero las prestaciones son claramente superiores. Ahora bien, todo esto se tiene que tener en cuenta si el usuario desea la computadora para algo más que utilización cotidiana de escritorio e Internet, es decir, básicamente para juegos y diseño en 3 dimensiones. Si el usuario solamente utilizará la computadora para escribir en algún procesador de textos, navegar por Internet, o incluso ver películas en CD o DVD, le bastará con una placa de video que venga incorporada en el motherboard de la computadora. Una ventaja adicional es que las placas de video integradas son mas baratas que el modelo correspondiente de una placa no integrada, probablemente porque el fabricante se ahorra componentes en la memoria interna de la placa. En este caso, la memoria que se le asignará a la placa de video puede ser variable (ya que se utiliza la memoria del sistema, no memoria interna de la placa), pero lo que si hay que tener en cuenta son las marcas de las placas de video integradas, por las mismas cuestiones de compatibilidad que se enunciaron previamente. Las motherboard marca Intel tienen integradas placas de video marca Nvidia, en cambio las motherboard marca Asus, tienen integradas placas de video marca ATI. Las placas de video integrada no ofrecen la posibilidad de tener salida a TV (característica bastante útil cuando el cliente piensa ver películas con su computadora), en cambio cuando se compra una placa de video no integrada, es posible por un poco de diferencia de precio comprar el modelo que tiene salida a TV. Lo que se le suele preguntar al cliente cuando viene a comprar una computadora es para qué tiene pensado usarla, como para ver que background tiene y si va a necesitar algo específico o se le puede dar lo estándar con el objetivo de ahorrar dinero. Obviamente para esto se tiene en cuenta el presupuesto disponible por el cliente, y los conocimientos de computación que pueda llegar a tener, para ver si luego él mismo podrá modificar la configuración de su computadora (bajándose actualizaciones, instalando nuevo hardware, o probando su nueva adquisición con diferentes sistemas operativos, programas y/o juegos).” Se pide: a) Representar el dominio del problema y estructurarlo utilizando Jess y/o Java. 7 b) Obtener del texto un grupo de entre 10 y 15 reglas implícitas y enunciarlas en lenguaje natural. c) Implementar un mini sistema experto, que le ayude a una persona que tiene pensado comprarse una computadora a decidir qué placa de video incorporar en su futura máquina. Proveer una interface adecuada. d) Escribir un pequeño informe, explicitando el desarrollo realizado, qué ventajas y desventajas tiene, y qué mejoras podrían hacerle. e) Entregar el trabajo en formato impreso y electrónico a ingcon@fceia.unr.edu.ar (nombrar los archivos con los apellidos de los autores). 8