IINNTTEELLIIG GE EN NC CIIA AE EN NR REED DE ES SD DE EC CO OM MU UN NIIC CA AC CIIO ON NE ES S SISTEMA EXPERTO DE RECONOCIMIENTO DE EN PROLOG SETAS H Hééccttoorr PPéérreezz M Maarrttíínn LLaauurraa A Asseennjjoo M Maannzzaannoo SISTEMA EXPERTO DE RECONOCIMIENTO DE SETAS ÍNDICE ÍNDICE __________________________________________________________ 2 INTRODUCCIÓN______________________________________________________ 3 SISTEMA EXPERTO___________________________________________________ 3 BÚSQUEDA Y METODOS ______________________________________________ 4 ENTRENAMIENTO DEL SISTEMA______________________________________ 5 RESULTADOS ________________________________________________________ 7 Archivo preguntas.dat_________________________________________________________ 7 Archivo DBHechos.dat________________________________________________________ 8 Archivo DBReglas.dat ________________________________________________________ 8 MEJORAS PROPUESTAS ______________________________________________ 9 DISCUSION Y CONCLUSIÓN__________________________________________ 10 BIBLIOGRAFÍA ______________________________________________________ 12 CÓDIGO COMENTADO ______________________________________________ 13 2 INTRODUCCIÓN El sistema experto de reconocimiento de setas que se ha desarrollado, tiene como objetivo la identificación de éstas en base a características externas que presenta la seta u hongo a tipificar, dando como resultado su reconocimiento y obteniendo así su nombre en latín, los diferentes nombres comunes con los que podemos encontrarla descrita en libros de micología y su posible ‘comestibilidad’ (comestible, mortal, etc.), sistematizando para ello el conocimiento de uno o mas expertos en micología, generando una base de datos de conocimiento dinámica que pueda ser usada posteriormente. El sistema se encuentra desarrollado en el lenguaje PROLOG y hace uso de listas, bases de datos internas y dinámicas, técnicas de backtracking y recursividad así como medios de comunicación con el usuario; esta basado en procesos de pregunta y respuesta interactivos los cuales permiten la identificación de patrones (características o propiedades) conocidos por el sistema, la satisfacción plena de las características establecidas dan como resultado la respuesta por parte del sistema de la seta identificada. Este sistema experto tiene como base fundamental el conocimiento del experto y por tanto tiene como una característica principal el autoaprendizaje y la recursividad, por lo que es recomendable que la base de datos de conocimiento que se genere debe ser debidamente analizada antes de su implantación. SISTEMA EXPERTO Un SISTEMA EXPERTO es un sistema informático que incorpora, en forma operativa, el conocimiento de una o varias personas experimentadas, de forma que es capaz de proporcionar respuestas y explicar los mecanismos de razonamiento que ha utilizado para llegar hasta ellas, así como de modificar o ampliar su conocimiento. Elementos de un sistema experto: 1. Base del conocimiento En ella se almacena el conocimiento proporcionado por el experto humano en un área de la ciencia o el conocimiento humano. 2. Motor de inferencia. Se encarga de realizar las búsquedas en la base del conocimiento de acuerdo con los parámetros definidos en la heurística del sistema y que permitirá inferir la solución de un problema o llevar a cabo la toma de decisiones. 3. Subsistema de explicación Permite que el usuario no experto pueda entender los parámetros de funcionamiento del sistema sin necesidad de tener que ver más allá de la aplicación del mismo. 4. Adquisición del conocimiento Es la interfaz que permite al experto humano mantener actualizada la base del conocimiento. 5. Subsistema de aprendizaje Permite al sistema experto, mediante experiencias, realizar la adquisición automática del conocimiento. 3 BÚSQUEDA Y METODOS El sistema se encuentra desarrollado en el lenguaje de programación PROLOG haciendo uso de listas, bases de datos internas y dinámicas, técnicas de backtracking y recursividad así como medios de comunicación con el usuario y entornos de interacción. El sistema se basa en el empleo extensivo de tres bases de datos, archivos de texto plano: (Pregunta.dat, DBHechos.dat, DBReglas.dat). Las preguntas efectuadas por el sistema se encuentran contenidas en la base de datos de preguntas (Pregunta.dat) la misma que se puede visualizar desde el sistema. La elección de dichas preguntas es fundamental para un eficiente y correcto funcionamiento del sistema, deberán ser preguntas decisivas a la hora de catalogar una seta, por tanto será un experto el encargado de escribir este fichero. En un principio, no está previsto que el archivo de preguntas pueda crecer, de modo que el primer trabajo del experto será elegir unas preguntas que permitan identificar unívocamente cada una de las setas de nuestro dominio. La clasificación de las setas y hongos identificados por el sistema se encuentra contenida en la base de datos de Hechos (DBHechos.dat) la cual es cargada como base de datos dinámica toda vez que se inicia el entorno de preguntas con el usuario. Este fichero contendrá una línea por cada una de las setas de las que conoce su descripción: nombre en latín, nombres comunes con los que podemos conocerla y su comestibilidad. Las reglas que presentan las características identificativas de las diferentes setas reconocidos por el sistema se encuentran contenidas en la base de datos de reglas (DBReglas.dat) en forma de cadenas con nombre en latín de la correspondiente seta, las preguntas realizadas al usuario junto con las respuestas correspondientes con fines de filtro y selección. 4 El programa carga todas las características identificativas del archivo de reglas, convirtiéndolas en hechos usando assert. Así, al inicio de la ejecución, el sistema conoce todas las propiedades de cada una de las setas. Cuando el usuario responde a una pregunta del sistema, el sistema hace una búsqueda en todos los hechos conocidos, buscando las setas que contienen el hecho pregunta-respuesta introducido. Estas setas son identificadas positivamente; el programa se encarga después de eliminar las setas identificadas negativamente de la memoria, de forma que se reduce el ámbito de búsqueda y el uso de memoria. Si el sistema se queda con al menos una seta identificada positivamente, se continúa haciendo las siguientes preguntas (eliminando recursivamente el ámbito de búsqueda) para asegurarse de hacer una identificación correcta, reduciendo la posibilidad de emitir un falso positivo. Sin embargo se muestra al usuario el nombre de esa seta durante todo el proceso. Al responder a la última pregunta de la batería, se muestran los datos de la seta que se ha identificado. Al haber diseñado correctamente las preguntas, sólo se debería haber encontrado una coincidencia (no puede haber dos setas cuyas preguntas sean totalmente iguales). El programa considera esta seta como identificada y muestra los datos correspondientes a esa seta de la base de datos de hechos. Con la finalidad de proporcionar al sistema un mayor conocimiento, se le ha provisto de un mecanismo automático de aprendizaje cuyo proceso inicia su ejecución de forma automática toda vez que el propio sistema reconoce la inexistencia de información (en sus bases de datos de conocimiento) relacionada con las características proporcionadas por el usuario. El presente mecanismo de aprendizaje es permanente debido al registro en las correspondientes bases de datos de la información proporcionada por medio de preguntas-respuestas, asimismo dicho aprendizaje es dinámico estando disponible para su posterior identificación inmediatamente después de suministrar los datos de clasificación solicitados por el sistema. La nueva información aprendida se añade tanto al fichero DBHechos.dat como a DBReglas.dat. Para poder facilitar la identificación por parte del usuario, se ha añadido una carpeta con el nombre Imágenes, que contendrá las fotos de las diferentes setas que el sistema es capaz de reconocer inicialmente cuando sólo cuenta con el conocimiento proporcionado por el experto. Para poder localizar la foto asociada a la seta que ha sido identificada por el sistema, y que por tanto entre otras cosas contamos con su nombre en latín, hemos nombrado al archivo precisamente con el nombre en latín de la seta, así “agaricus campestris.jpg” contendrá una imagen del champiñón silvestre. Esta información extra puede ser utilizada en una posible mejora al añadir un interfaz gráfico al sistema. ENTRENAMIENTO DEL SISTEMA El primer paso a la hora de dotar al sistema de conocimientos fue el de escribir las preguntas que nuestro experto consideró importantes a la hora de clasificar una seta. Nos centraremos en las características macroscópicas ya que son más directas. Las preguntas que hizo el experto son las que se indican en la tabla. Anotamos también algunas respuestas posibles para las preguntas, ya que nuestro sistema permite introducir respuestas no booleanas. PREGUNTA ¿Tiene láminas? ¿Tiene poros? ¿Tiene sombrero? RESPUESTAS POSIBLES S, N S, N S, N 5 PREGUNTA ¿Tiene velo? ¿Tiene volva? ¿Tiene pie? ¿Con cutícula? ¿Tipo de láminas? ¿Color de las láminas? ¿Color del sombrero? ¿Forma del sombrero? ¿Forma del borde? ¿Pie con anillo? ¿Pie hueco? RESPUESTAS POSIBLES S, N S, N S, N S, N Libres, decurrentes, adnatas Blanco, rosa, verde, pardo... Pardo, blanco, rojo, verde... Convexo, cónico, globoso, plano, deprimido, umbonado, embudado, n/a Plano, curvado, convoluto, n/a S, N, n/a S, N, n/a Una vez diseñadas las preguntas, el experto introdujo un número de setas mediante el propio sistema de aprendizaje. Las setas elegidas por el experto fueron una combinación de setas comunes, prestando atención en introducir setas de la misma familia o setas fácilmente confundibles, para detectar posibles fallos en la elaboración de las preguntas. Se puede ver un ejemplo de introducción de una nueva seta en las siguientes capturas de pantalla: (1) Bases de Datos (2) Clasificador (3) Salir ==>2 ¿Tiene laminas? n Hay 4 setas encontradas. Piptoporus Betulinus, Langermannia Gigantea, Boletus Pinicola, Boletus Edulis. ¿Tiene poros? s Hay 3 setas encontradas. Piptoporus Betulinus, Boletus Pinicola, Boletus Edulis. ¿Tiene sombrero? s Hay 3 setas encontradas. Piptoporus Betulinus, Boletus Pinicola, Boletus Edulis. ¿Tiene velo? n Hay 3 setas encontradas. Piptoporus Betulinus, Boletus Pinicola, Boletus Edulis. ¿Tiene volva? n Hay 3 setas encontradas. Piptoporus Betulinus, Boletus Pinicola, Boletus Edulis. ¿Tiene pie? s Hay 2 setas encontradas. Boletus Pinicola, Boletus Edulis. El experto está introduciendo los datos correspondientes al Boletus Satanás, seta venenosa que se podría confundir con otros boletus. Como se ve en el último paso, se ha restringido el dominio de búsqueda a las setas de esta familia. ¿Tipo de laminas? n/a Hay 2 setas encontradas. Boletus Pinicola, Boletus Edulis. ¿Color de las laminas? naranja No hay setas que se correspondan con esta descripcion. Comenzamos proceso de aprendizaje... 6 Cuando se pregunta el color de las láminas (o de los poros, en este caso), el experto introduce la característica que diferencia este boleto de los otros, el sistema lo detecta, y nos informa de que va a pasar al modo de aprendizaje. En este modo se preguntan las características restantes de la seta directamente. ¿Color del sombrero? pálido ¿Forma del sombrero? convexo ¿Forma del borde? curvado ¿Pie con anillo? n ¿Pie hueco? n Una vez que el experto ha satisfecho las preguntas del programa, este le pide identificar manualmente la seta, dando sus datos específicos; ****** Seta no identificada ******* La seta no estaba en nuestros archivos. Por favor, introduzca los siguientes datos sobre la seta: Nombre latino : Boletus Satanas Nombre(s) comun(es): Boleto de Satanás Comestibilidad : Venenosa Tras esto, el programa guarda los nuevos conocimientos y vuelve al menú principal. RESULTADOS Tras el proceso de aprendizaje descrito arriba, se clasificaron 17 setas a modo de ejemplo. Este proceso rellenó los archivos preguntas.dat, DBHechos.dat y DBReglas.dat. Archivo preguntas.dat En este archivo quedaron registradas las preguntas que el experto consideró necesarias para la clasificación y su orden. Son la piedra angular del sistema, y podrían ser ampliadas si se detecta que no permiten la identificación unívoca de alguna seta. Estas preguntas son las que tiene que responder el usuario cuando quiera clasificar la seta. Hay que hacer hincapié en que estas preguntas sólo se pueden cambiar a mano, el programa no añadirá preguntas si detecta dos setas con idénticas características (en su lugar dará un falso positivo). Los contenidos del archivo son: Tiene laminas Tiene poros Tiene sombrero Tiene velo Tiene volva Tiene pie Con cuticula Tipo de laminas Color de las laminas Color del sombrero Forma del sombrero Forma del borde Pie con anillo Pie hueco 7 Archivo DBHechos.dat Este archivo es el resultado de la clasificación de cada seta, y es el que el programa usa para después mostrar la información sobre cada seta. La información para cada seta se guarda en forma de triplas (Nombre latín, Nombres comunes, Comestibilidad). Los contenidos alcanzados son: clasificacion("Macrolepiota Procera","Parasol, apagador, matacandil","Excelente") clasificacion("Cortinarius Odorifer","Cortinario perfumado","No comestible") clasificacion("Russula Cyanoxantha","Carbonera, Urretxa","Excelente") clasificacion("Lactarius Torminosus","Niscalo falso","Venenosa") clasificacion("Lactarius Deliciosus","N¡scalo, M¡zcalo","Exquisito") clasificacion("Piptoporus Betulinus","Yesquero del Abedul","No comestible") clasificacion("Langermannia Gigantea","Bej¡n gigante","Comestible") clasificacion("Pleurotus Eryngii","Seta de cardo","Excelente") clasificacion("Pleurotus Eryngii var. Nebrodensis","Seta de ca¤a","Excelente") clasificacion("Pleurotus Ostreatus","Orellana, oreja blanca, seta de chopo","Buena") clasificacion("Boletus Pinicola","Boleto de pino","Excelente") clasificacion("Boletus Edulis","Boleto comestible, sureny","Excelente") clasificacion("Boletus Satanas","Boleto de Satan s","Venenosa") clasificacion("Amanita Caesarea","Oronja, Ou de reig","Excelente") clasificacion("Amanita Muscaria","Matamoscas","Venenosa") clasificacion("Amanita Phalloides","Cicuta verde","Mortal") clasificacion("Agaricus campester","Champi¤¢n","Excelente") Archivo DBReglas.dat Este archivo es el resultado de la tipificación de cada seta introducida, y guarda las características de cada seta de forma que luego el programa pueda usar esos conocimientos adquiridos. El formato que sigue este fichero será: Línea 1 Nombre en latín de la seta Línea 2…k Pregunta1~Respuesta1, Pregunta2~Respuesta2,…, PreguntaN~RespuestaN Línea k+1 Nombre en latín de la seta ….. Los contenidos de este fichero se listan a continuación: Macrolepiota Procera Tiene laminas~S,Tiene poros~N,Tiene sombrero~S,Tiene velo~N,Tiene volva~S,Tiene pie~S,Con cuticula~S,Tipo de laminas~LIBRES,Color de las laminas~BLANCO,Color del sombrero~PARDO,Forma del sombrero~GLOBOSO,Forma del borde~CURVADO,Pie con anillo~S,Pie hueco~S, Cortinarius Odorifer Tiene laminas~S,Tiene poros~N,Tiene sombrero~S,Tiene velo~N,Tiene volva~N,Tiene pie~S,Con cuticula~N,Tipo de laminas~ADNATAS,Color de las laminas~AMARILLO,Color del sombrero~MARR¢N,Forma del sombrero~CONVEXO,Forma del borde~CURVADO,Pie con anillo~N,Pie hueco~N, Russula Cyanoxantha Tiene laminas~S,Tiene poros~N,Tiene sombrero~S,Tiene velo~N,Tiene volva~N,Tiene pie~S,Con cuticula~N,Tipo de laminas~ADNATAS,Color de las laminas~BLANCO,Color del sombrero~VIOLETA,Forma del sombrero~CONVEXO,Forma del borde~CURVADO,Pie con anillo~N,Pie hueco~N, Lactarius Torminosus Tiene laminas~S,Tiene poros~N,Tiene sombrero~S,Tiene velo~N,Tiene volva~N,Tiene pie~S,Con cuticula~S,Tipo de laminas~DECURRENTES,Color de las laminas~CARNE,Color del sombrero~OCRE,Forma del sombrero~EMBUDADO,Forma del borde~CONVOLUTO,Pie con anillo~N,Pie hueco~S, Lactarius Deliciosus Tiene laminas~S,Tiene poros~N,Tiene sombrero~S,Tiene velo~N,Tiene volva~N,Tiene pie~S,Con cuticula~S,Tipo de laminas~DECURRENTES,Color de las laminas~NARANJA,Color del sombrero~NARANJA,Forma del sombrero~DEPRIMIDO,Forma del borde~CONVOLUTO,Pie con anillo~N,Pie hueco~S, Piptoporus Betulinus Tiene laminas~N,Tiene poros~S,Tiene sombrero~S,Tiene velo~N,Tiene volva~N,Tiene pie~N,Con cuticula~S,Tipo de laminas~N/A,Color de las laminas~BLANCO,Color del sombrero~GRIS,Forma del sombrero~SEMICIRCULAR,Forma del borde~CURVADO,Pie con anillo~N/A,Pie hueco~N/A, 8 Langermannia Gigantea Tiene laminas~N,Tiene poros~N,Tiene sombrero~S,Tiene velo~N,Tiene volva~N,Tiene pie~N,Con cuticula~S,Tipo de laminas~N/A,Color de las laminas~ROSADO,Color del sombrero~BLANCO,Forma del sombrero~GLOBOSO,Forma del borde~N/A,Pie con anillo~N/A,Pie hueco~N/A, Pleurotus Eryngii Tiene laminas~S,Tiene poros~N,Tiene sombrero~S,Tiene velo~N,Tiene volva~N,Tiene pie~S,Con cuticula~S,Tipo de laminas~DECURRENTES,Color de las laminas~OCRE,Color del sombrero~MARR¢N,Forma del sombrero~APLANADO,Forma del borde~PLANO,Pie con anillo~N,Pie hueco~N, Pleurotus Eryngii var. Nebrodensis Tiene laminas~S,Tiene poros~N,Tiene sombrero~S,Tiene velo~N,Tiene volva~N,Tiene pie~S,Con cuticula~N,Tipo de laminas~DECURRENTES,Color de las laminas~BLANCO,Color del sombrero~BLANCO,Forma del sombrero~EMBUDADO,Forma del borde~CONVOLUTO,Pie con anillo~N,Pie hueco~N, Pleurotus Ostreatus Tiene laminas~S,Tiene poros~N,Tiene sombrero~S,Tiene velo~N,Tiene volva~N,Tiene pie~N,Con cuticula~N,Tipo de laminas~DECURRENTES,Color de las laminas~BLANCO,Color del sombrero~GRIS,Forma del sombrero~SEMICIRCULAR,Forma del borde~CONVOLUTO,Pie con anillo~N/A,Pie hueco~N/A, Boletus Pinicola Tiene laminas~N,Tiene poros~S,Tiene sombrero~S,Tiene velo~N,Tiene volva~N,Tiene pie~S,Con cuticula~S,Tipo de laminas~N/A,Color de las laminas~AMARILLO,Color del sombrero~ROJO,Forma del sombrero~CONVEXO,Forma del borde~CURVADO,Pie con anillo~N,Pie hueco~N, Boletus Edulis Tiene laminas~N,Tiene poros~S,Tiene sombrero~S,Tiene velo~N,Tiene volva~N,Tiene pie~S,Con cuticula~S,Tipo de laminas~N/A,Color de las laminas~AMARILLO,Color del sombrero~PARDO,Forma del sombrero~CONVEXO,Forma del borde~CURVADO,Pie con anillo~N,Pie hueco~N, Boletus Satanas Tiene laminas~N,Tiene poros~S,Tiene sombrero~S,Tiene velo~N,Tiene volva~N,Tiene pie~S,Con cuticula~S,Tipo de laminas~N/A,Color de las laminas~NARANJA,Color del sombrero~P LIDO,Forma del sombrero~CONVEXO,Forma del borde~CURVADO,Pie con anillo~N,Pie hueco~N, Amanita Caesarea Tiene laminas~S,Tiene poros~N,Tiene sombrero~S,Tiene velo~N,Tiene volva~S,Tiene pie~S,Con cuticula~S,Tipo de laminas~LIBRES,Color de las laminas~AMARILLO,Color del sombrero~NARANJA,Forma del sombrero~CONVEXO,Forma del borde~PLANO,Pie con anillo~S,Pie hueco~N, Amanita Muscaria Tiene laminas~S,Tiene poros~N,Tiene sombrero~S,Tiene velo~N,Tiene volva~S,Tiene pie~S,Con cuticula~S,Tipo de laminas~LIBRES,Color de las laminas~BLANCO,Color del sombrero~ROJO,Forma del sombrero~CONVEXO,Forma del borde~PLANO,Pie con anillo~S,Pie hueco~N, Amanita Phalloides Tiene laminas~S,Tiene poros~N,Tiene sombrero~S,Tiene velo~N,Tiene volva~S,Tiene pie~S,Con cuticula~S,Tipo de laminas~LIBRES,Color de las laminas~BLANCO,Color del sombrero~VERDOSO,Forma del sombrero~APLANADO,Forma del borde~PLANO,Pie con anillo~S,Pie hueco~N, Agaricus campester Tiene laminas~S,Tiene poros~N,Tiene sombrero~S,Tiene velo~N,Tiene volva~N,Tiene pie~S,Con cuticula~S,Tipo de laminas~LIBRES,Color de las laminas~ROSA,Color del sombrero~BLANCO,Forma del sombrero~APLANADO,Forma del borde~CURVADO,Pie con anillo~S,Pie hueco~N, MEJORAS PROPUESTAS Pese a haber elaborado un sistema experto totalmente funcional, hemos detectado un buen número de mejoras en diversos aspectos de nuestro programa. No hemos implementado estas mejoras debido a la falta de tiempo, pero las comentamos a continuación: Respecto al motor de inferencias, podemos hacer una optimización, cargando las características de cada seta justo antes de hacer la pregunta respectiva a esa característica, con lo que nos ahorraríamos memoria ya que sólo se cargaría una característica por cada seta en cada pregunta. El sistema de preguntas puede ser mejorado notablemente. Es obvio que hay preguntas excluyentes, por ejemplo, si un usuario responde que la seta que está clasificando no tiene sombrero, es ilógico preguntarle de qué color es el sombrero. 9 Sin embargo, las preguntas de clasificación tampoco se pueden realizar como árboles, ya que, independientemente de que la seta tenga sombrero o no habrá que preguntar si tiene pie. Por tanto pensamos que se puede mejorar el sistema de preguntas lineal que tenemos ahora añadiendo la posibilidad de hacer “desvíos” dependiendo de la respuesta y después volver a una pregunta en común. En la implementación actual del sistema, sólo se pueden aprender setas que tienen algún par pregunta/respuesta distinto a las ya conocidas, lo que implica un diseño muy cuidadoso de las preguntas por el experto. Sin embargo puede haber dos setas lo suficientemente parecidas como para que el sistema no las distingan. Una mejora para esta situación es añadir al programa un modo “edición” de modo que al llegar a una identificación, el experto pueda decidir que es una identificación errónea y añadir al sistema una pregunta que permita diferenciar las dos setas. Finalmente, y gracias a haber usado Visual Prolog para nuestro programa, es posible hacer una mejora visual, y pasar del sistema de línea de comandos a un sistema de ventanas. Además se podrían usar las imágenes de las setas incluídas en la carpeta imágenes para mostrar directamente al usuario la seta que ha clasificado, o acceder a una base de datos (o un libro) indicando una descripción más detallada de la seta. Pensando siempre en facilitar el trabajo al usuario sería conveniente el realizar un pequeño folleto o manual, con las posibles respuestas a una determinada pregunta. Así por ejemplo un usuario no sepa exactamente que responder a la pregunta de “forma del sombrero?”, podría acudir al manual donde tendría todas las posibles respuestas con la definición o correspondiente dibujo de cada una de ellas (en nuestro ejemplo: convexo,cónico,globoso,plano,deprimido,embonado,etc), la respuesta por parte del usuario sería más acertada. Y de esta forma evitaríamos errores como responder naranja en lugar de anaranjado, siendo lo mismo o prácticamente (obviamos este debate), darían respuestas totalmente diferentes. DISCUSION Y CONCLUSIÓN El trabajo presentado tiene los siguientes objetivos principales: 1. Identificar cualquier tipo de seta en base a características externas que presenta, dando como resultado el reconocimiento de ésta. 2. Construcción de una base de datos de conocimiento utilizando el concepto de Sistemas Expertos, resaltando la importancia de usar fuentes de conocimiento, para apoyar el conocimiento subjetivo del experto . 3. Elaborar un Motor de inferencia en Prolog, necesario para mantener el funcionamiento del sistema experto. El sistema desarrollado responde a la necesidad de poder tipificar e identificar setas y hongos en base a características observables. Su campo de aplicación se puede dar en dos áreas importantes: 10 Investigación: En estudios de micología, para tipificar en base a la caracterización que previamente se tiene en la base de datos dinámica del sistema experto, la cual se encuentra inicialmente alimentada por el experto. Educación: En la enseñanza o introducción a la micología en base a la interacción sistema– usuario con preguntas del sistema y respuestas del usuario haciendo que el sistema identifique que seta ha encontrado el usuario dependiendo de lo acertado de la respuesta del usuario. El sistema experto que se presenta se encuentra inicialmente alimentado en su base de datos por la información que el experto del área pueda proporcionar. Esta base de datos se torna dinámica por cuanto posteriormente y con el uso que tenga el sistema experto, la base de datos se incrementará. El alcance del sistema depende principalmente del experto que alimenta inicialmente la base de datos, teniendo como limitante principal el uso posterior que se le pueda dar al sistema experto por parte de usuarios considerados como expertos y que por una alimentación no eficiente de la base de datos por estos últimos, la base de datos pueda tener datos inconsistentes . Lo que podría pasar en la realidad si este programa fuera utilizado con alguno de estos fines es que en una primera prueba el sistema experto con la base de conocimientos implementada tendría un buen funcionamiento, por cuanto que permite que un segundo usuario no experto en micología pueda identificar una seta con las características que este ultimo proporciona al sistema. Si se realizara una segunda prueba con el sistema experto, para la cuál se utilizara un usuario experto en micología, el cual podía realizar tareas de identificación con la base de datos predefinida en el sistema y también podía retroalimentar al sistema en base a la interacción usuariosistema. En principio esto tendría buen resultado por cuanto algunas características no tipificadas por el primer experto serían hechas por el segundo experto, aumentando así la precisión del sistema. El problema sería que en cuanto, la tipificación del segundo experto no coincida en una característica con la tipificación hecha por el primer experto, esta no coincidencia supondría que posteriormente el sistema experto entraría en conflicto cuando se tipificaran setas, lo cual no es realmente cierto por cuanto el sistema experto identificaba a la seta con cualquiera de las clasificaciones hechas (ya sea con el primer experto o con el segundo experto), pero no es consistente de que una seta este descrita de diferentes formas. Como una última anotación para este sistema experto, decir que hemos elegido tipificar o catalogar setas, pero bastaría con modificar los ficheros correspondientes a las bases de datos (pregunta.dat, DBHechos.dta y DBReglas.dat) para poder tipificar cualquier otro objeto, ser vivo, o lo que se nos ocurra, pero no habrá que modificar en ningún momento el código fuente, simplemente volver a realizar el proceso de entrenamiento del sistema gracias a un experto en el tema. 11 BIBLIOGRAFÍA Lista de correo de prolog. Hispalinux. [en línea]. Disponible en Internet: < prolog@listas.hispalinux.es> y <https://listas.hispalinux.es/mailman/listinfo/prolog> José Angel Bañares Bañares, universidad De Zaragoza. Ingeniería de los Sistemas Basados en el Conocimiento [en línea], 2003, <http://iaaa.cps.unizar.es/docencia/ISBC.html> Nieves Pavón, Universidad de Huelva. Visual Prolog: entorno de desarrollo [en línea], 2003, <http://www.uhu.es/nieves.pavon/pprogramacion/practicas/visualprolog/visualprolog.html> Prolog Development Center A/S. Visual Prolog 5.x language tutorial.[archivo PDF], 2001. Prolog Development Center A/S. Visual Prolog 5.x getting started.[archivo PDF], 2001. MENDAZA RINCÓN, Ramón y DÍAZ MONTOYA, Guillermo. Las setas: guía fotográfica y descriptiva. Iberduero, 1987. MORENO, Gabriel et al. La guía de Incafo de los hongos de la Península Ibérica. Incafo, 1986. 12 CÓDIGO COMENTADO /***************************************************************************** INTELIGENCIA EN REDES DE COMUNICACIONES 2003 Universidad Carlos III Project: Sistema Experto de Reconocimiento de Setas Written by: Héctor Pérez Martín y Laura Asenjo Manzano Comments: Extensible para reconocimiento de cualquier otra cosa: flores,insectos,etc ******************************************************************************/ plantas, /* Domains: En esta sección se define el tipo de objetos con los que trabajaremos.*/ /* Dominios locales. */ domains Opcion,Longitud,Longitud1,Longitud2,Longitud3,entero,num=integer Pos,Pos1,Pos2,Pos3,Pos4,Pos5,Pos6,Total,TotalTmp=integer Salida,Cadena,Cad1,Cad2,Cad3=string Regla,TotalStr,Resultado1=string LRegla=Cadena* ListaSujetos,ListaNegativos=Sujeto* /* Dominios globales (los usados en las BD de hechos y los archivos.*/ global domains file=input1;input2 Sujeto,Pregunta,Respuesta,Resultado,Propiedad1,Propiedad2,Estado=string /* Bases de datos de hechos (dinámicas). Colocamos cada tipo de hechos por separado por comodidad.*/ global facts - propiedades propiedad (Sujeto,Pregunta, Respuesta) global facts - categoria clasificacion (Sujeto, Propiedad1, Propiedad2) global facts - encontrado encontrado (Estado) /* En la sección PREDICATES definimos el nombre y el tipo de los argumentos de todos los predicados que se usarán durante el programa.*/ predicates analiza analiza_pregunta (string, Pregunta, Respuesta) barra borraeliminados (ListaSujetos) clasifica_resultado (ListaSujetos) contar (ListaSujetos, entero) decodifica (Cadena, Sujeto) escribeLista (ListaSujetos) existeBD (entero) graba (LRegla, LRegla) menu (Opcion, Regla) novalido (Sujeto, Pregunta, Respuesta) nuevosujeto pantallainicio pregunta (LRegla) repetir /* Goal. En esta sección se definen los objetivos a lograr al ejecutar el programa.*/ goal pantallainicio. 13 /* Clauses. Contiene la implementación del conjunto de hechos y reglas que componen el programa.*/ clauses /* Corresponde a la pantalla principal del sistema, presenta opciones para ejecutar el sistema 1--> Visualizaremos el contenido de los ficheros utilizados por el sistema. 2--> Proceso de pregunta-respuesta para identificar una seta. 3--> Terminamos el programa.*/ barra:nl, write ("(1) Bases de Datos (2) Clasificador (3) Salir\n"), write ("==>"), readint (Opcion), nl, menu (Opcion, "principal"). /* Corresponde al segundo menú del programa, el usuario desea visualizar los archivos 1--> Para visualizar DBHechos.dat. 2--> Para visualizar preguntas.dat. 3--> Para visualizar DBReglas.dat.*/ menu(1,"principal"):write("(1)Muestra Clasificacion\n"), write("(2)Muestra Preguntas\n"), write("(3)Muestra Reglas\n"), write("==>"), readint(Opcion), nl, menu(Opcion,"BD"). /* Muestra en pantalla el contenido de DBHechos.dat.*/ menu (1,"BD"):/* file_str(File,String). Lee un archivo y lo guarda en String.*/ file_str ("DBHechos.dat",Salida), write(Salida), barra. /* Muestra en pantalla del contenido de pregunta.dat.*/ menu (2, "BD"):file_str ("pregunta.dat",Salida), write(Salida), nl, barra. /* Despliegue en pantalla del contenido de DBReglas.dat.*/ menu (3, "BD"):file_str ("DBReglas.dat",Salida), write(Salida), nl, barra. /* Si el usuario elige una opción incorrecta (distinto de 1,2 ó 3).*/ menu(_,"BD"):write("Tecla incorrecta...Intentelo de nuevo"), menu(1,"principal"). /* Entorno de preguntas-respuetas. Clasificación de setas.*/ menu(2,"principal"):/* determ retractall(Hecho, NombreSeccionHechos): Borra todos los hechos encontrados que casen con el hecho especificado en el argumento. Actúa sobre del dominio de hechos con nombre NombreSeccionHechos.*/ retractall(_,categoria), /* consult(String NombreFichero, NombreSeccionHechos): Sirve para leer hechos desde un fichero de hechos y almacenarlos en la base de hechos de nombre NombreSeccionHechos. Este fichero debe haber sido salvado con save.*/ consult("DBHechos.dat",categoria), retractall(_), retractall(_,encontrado), 14 assertz(encontrado("Falso")), /* Obtenemos las reglas de clasificación, para decodificarlas y cargarlas al sistema.*/ openread(input1,"DBReglas.dat"), repetir, analiza, closefile(input1), /* Abrimos el archivo de preguntas para comenzar el proceso de identificación.*/ openread(input2,"Pregunta.dat"), repetir, Pregunta(LRegla), closefile(input2), /* Si el sujeto no se encontraba en las reglas lo añadimos.*/ nuevosujeto, graba(LRegla,LRegla), /* Vuelta al menú principal.*/ barra. /* Salir de la aplicación.*/ menu(3,"principal"):write("Presione una tecla para salir"), readchar(_). /* Si el usuario elige una opción incorrecta (distinto de 1,2 ó 3).*/ menu(_,"principal"):write("Tecla incorrecta...Intentelo de nuevo"), barra. /* Leemos del fichero DBReglas para cada seta su nombre en latín (sujeto) y sus preguntas con las respuestas (Cadena).*/ analiza:eof(input1),!. /* Llegamos al final del fichero DBReglas.dat.*/ analiza:readdevice(input1), readln(Sujeto), readln(Cadena), /* Parseamos las preguntas-respuestas.*/ decodifica(Cadena,Sujeto). /* Creamos un hecho por cada pregunta-respuesta asociado al sujeto, por tanto deberemos parsear Cadena, ya que aquí se encuentran concatenadas todas pregunta1~repuesta1, pregunta2~repuesta2,...*/ decodifica(Cadena,Sujeto):/* Cogemos de la posición de la coma y hacemos un substring hasta esa coma ej:Toma leche~S, */ str_len(Cadena,Longitud), searchchar(Cadena,',',Pos), Pos1=Pos-1, subString(Cadena,1,Pos1,Cadena1), /* De la subcadena esta tomamos la longitud y creamos una subcadena con lo que hay delante y detrás de ~ .*/ str_len(Cadena1,Longitud1), searchchar(Cadena1,'~',Pos2), Pos3=Pos2-1, substring(Cadena1,1,Pos3,Pregunta), Pos4=Pos2+1, searchchar(Cadena1,'~',Pos6), Longitud2=Longitud1-Pos6, substring(Cadena1,Pos4,Longitud2,Respuesta), /* Una vez que tenemos la pregunta y la respuesta podemos llamar a assetz esta característica.*/ assertz(propiedad(Sujeto,Pregunta,Respuesta)), 15 Pos5=Pos+1, Longitud3=Longitud-Pos, substring(Cadena,Pos5,Longitud3,Cadena2), /* Y así con todas las preguntas y respuestas de un mismo sujeto.*/ decodifica(Cadena2,Sujeto). /* Pregunta lleva a cabo el proceso de preguntar, guardar la respuesta del usuario y eliminar los sujetos que ya no son solución. Si en algún momento no queda ningún sujeto se pasa al estado de aprendizaje para completar el resto de preguntas. Si se llega a la última pregunta y queda algún sujeto, entonces ese sujeto es la solución.*/ /* Si hemos terminado las preguntas, comprobar si tenemos algún sujeto concordante.*/ Pregunta([]):/* eof(SFN) Es verdadera si el apuntador del archivo ya está al final del mismo.*/ eof(input2), encontrado("Falso"), findall(X,propiedad(X,_,_),ListaSujetos), /* Contamos el numero de sujetos cuya descripción concuerdan con las respuestas dadas por el usuario, si no hay ninguno será que no tenemos identificada a esa seta y aprenderemos.*/ contar(ListaSujetos,Y), Y<>0, retractall(_,encontrado), assertz(encontrado("Verdadero")), /* Imprimimos por pantalla las características del sujeto encontrado.*/ clasifica_resultado(ListaSujetos),!. /* Identificación el final del archivo preguntas.dat Y como anteriormente hemos averiguado que no tenemos esa seta en la BD, tendremos que aprender después.*/ Pregunta([]):eof(input2), encontrado("No existe"),!. /* Pregunta al usuario usando la BD Preguntas. Las respuestas del usuario se convierten en mayúsculas para facilitar las comparaciones. Las preguntas pueden ser del tipo S/N o con valores complejos, como colores u otras propiedades. Se guarda el par pregunta-respuesta en LRegla, para que si no se conoce el sujeto poder usar esos conocimientos en la etapa de aprendizaje. Después se llama a analiza_pregunta para eliminar los sujetos que no responden a la nueva característica introducida por el usuario, y se continúa con el resto de preguntas.*/ Pregunta([Cad3|T]):readdevice(input2), /* Lee una pregunta.*/ readln(Pregunta), Pregunta<>"", /* Escribe la pregunta, el usuario podrá responder en mayúsculas o minúsculas.*/ write("\168",Pregunta,"? "), readdevice(stdin), readln(Respuesta1), /* Tratamos la cadena para que sea toda en mayúsculas.*/ upper_lower(Respuesta, Respuesta1), /* Analizamos los sujetos que responden a estas características y eliminamos el resto.*/ analiza_pregunta("",Pregunta,Respuesta), /* Concatenamos Pregunta~Respuesta, para poder aprender en caso de que sea necesario.*/ concat(Pregunta,"~",Cad1), concat(Cad1,Respuesta,Cad2), concat(Cad2,",",Cad3), /* Seguimos mostrando preguntas.*/ pregunta(T). 16 /* Analiza los sujetos que cumplen una pregunta y una respuesta, eliminando al resto. Si no hay sujetos que cumplan esa pregunta/respuesta, activa el modo de aprendizaje y desactiva el modo de análisis. Por aquí entraremos cuando estemos en el proceso de aprendizaje.*/ analiza_pregunta(_,_,_):encontrado(XX), XX<>"Falso",!. /* Por aquí entraremos cuando estemos en el proceso de análisis.*/ analiza_pregunta(_,Pregunta,Respuesta):/* Obtener los sujetos concordantes.*/ findall(X,propiedad(X,Pregunta,Respuesta),ListaSujetos), /* Y los contamos.*/ contar(ListaSujetos,Y), /* Dependiendo del número de sujetos concordantes, cambiar de modo o no.*/ existeBD(Y), /* Mostrar sujetos concordantes (si los hay).*/ escribelista(ListaSujetos),nl, nl, /* Buscamos los sujetos que no tengan la misma respuesta que dio el usuario para una pregunta, esos sujetos no serán solución y los podremos eliminar.*/ findall(XX,novalido(XX,Pregunta,Respuesta),ListaNegativos), borraeliminados(ListaNegativos). /* Cuenta los elementos de una lista.*/ contar([],0). contar([_|T],Total):contar(T,TotalTmp), Total=TotalTmp+1. /* Obtiene los sujetos cuya respuesta no coincide con una respuesta dada.*/ novalido(Sujeto,Pregunta,Respuesta):propiedad(Sujeto,Pregunta,Z), Z<>Respuesta. /* Eliminar sujetos que no pueden ser solución.*/ borraeliminados([]). borraeliminados([H|T]):retractall(propiedad(H,_,_)), borraeliminados(T). /* Comprueba la cantidad de sujetos encontrados con las características dadas */ /* Si no hay ningún sujeto concordante, pasar al modo de aprendizaje e informar de ello. Así ahorramos el tener que hacer el análisis una vez que no queden sujetos.*/ existeBD(0):retractall(_,encontrado), assertz(encontrado("No existe")), write("No hay setas que se correspondan con esta descripcion."), nl, write("Comenzamos proceso de aprendizaje...\n"),!. /* Si solo hay uno, informar de ello, pero obligar al usuario a que siga respondiendo preguntas para asegurarse (minimizar la posibilidad de falsos positivos).*/ existeBD(1):write("Hay una seta encontrada. Siga respondiendo a las preguntas para seguro.\n"),!. estar /* Si el numero de setas que se adecuan a la descripción que da el usuario es distinto de cero, es porque podemos tener esa seta catalogada, por tanto tendremos que seguir preguntando y analizar cada pregunta-respuesta.*/ existeBD(Y):write("Hay ",Y," setas encontradas.\n"),!. 17 /* Grabación de regla en archivo.*/ /* Si el sujeto esta clasificado en DBHechos (encontrado=verdadero) no haremos nada.*/ nuevosujeto:encontrado("Verdadero"),!. /* Si el sujeto no se encuentra en nuestra clasificación de setas (DBHechos) aprenderemos. Preguntaremos al usuario de que seta se trata y lo almacenaremos convenientemente en los ficheros DBHechos.dat y DBReglas.dat.*/ nuevosujeto:/* Informamos de que el sujeto no estaba en nuestras bases de datos, y pedimos al usuario que introduzca los datos.*/ nl,nl, write("****** Seta no identificada *******\n"), write("La seta no estaba en nuestros archivos. Por favor, introduzca los siguientes datos sobre la seta:"),nl, /* El usuario introduce los write("Nombre latino : write("Nombre(s) comun(es): write("Comestibilidad : datos del nuevo sujeto para completar el aprendizaje.*/ "),readln(Resultado), "),readln(Propiedad1), "),readln(Propiedad2), /* Añadimos a la BD de hechos los datos introducidos.*/ openappend(input1,"DBHechos.dat"), writedevice(input1), write("clasificacion(\"",Resultado,"\",\"",Propiedad1,"\",\"",Propiedad2,"\")\n"), closefile(input1), /* Añadimos a la BD de reglas usuario.*/ openappend(input2,"DBReglas.dat"), writedevice(input2), nl, write(Resultado),nl, closefile(input2). las preguntas/respuestas introducidas por el /* Imprime por pantalla el resultado y su clasificación.*/ clasifica_resultado([H|_T]):Clasificacion(H,Propiedad1,Propiedad2), nl, write("********* RESULTADO ENCONTRADO: ********\n"), write("Nombre latino : ",H),nl, write("Nombre(s) Comun(es): ",Propiedad1),nl, write("Comestibilidad : ",Propiedad2),nl, write("****************************************\n"), nl. /* Identificación y registro en la BD de Reglas de datos aprendidos correspondiente al sujeto no identificado.*/ /*Si hemos grabado todo el contenido de LRegla(Pregunta1~Respuesta1,Pregunta2~Respuesta2...) en DBRegla.dat terminamos.*/ graba([],_):closefile(input2),!. /* Si hemos encontrado la seta no necesitamos grabar en DBReglas.dat.*/ graba(_,_):encontrado("Verdadero"),!. /* Si hemos aprendido almacenamos en DBReglas todas las preguntas y respuestas que el usuario ha ido respondiendo a lo largo de todo el proceso.*/ graba([H|T],LRegla):openappend(input2,"DBReglas.dat"), writedevice(input2), write(H), closefile(input2), graba(T,LRegla). /* Escribe una pantalla con los créditos del programa.*/ 18 pantallainicio:write("\201\205\205\205\205\205\205\205\205\205\205\205\205\205\205\205\205\205\205\ 205\205\205\205\205\205\205\205\205\205\205\205\205\205\205\205\205\205\205\205\205\ 205\205\205\205\205\205\205\205\205\205\205\205\205\205\205\205\205\205\205\187\n"), write("\186 SISTEMA EXPERTO DE CLASIFICACION DE SETAS \186\n"), write("\186\196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\ 196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\ 196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\186\n"), write("\186 Autores: \186\n"), write("\186 LAURA ASENJO MANZANO \186\n"), write("\186 H\144CTOR P\144REZ MARTIN \186\n"), write("\186\196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\ 196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\ 196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\186\n"), write("\186 Inteligencia en redes de comunicaci\149n \186\n"), write("\186 Universidad Carlos III de Madrid, a\164o 2003 \186\n"), write("\186\196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\ 196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\ 196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\196\186\n"), write("\186Este programa solo tiene fines educativos. Los autores no \186\n"), write("\186 se hacen responsable de las consecuencias debidas a una \186\n"), write("\186 clasificación erróneaa. Compruebe siempre los resultados.\186\n"), write("\200\205\205\205\205\205\205\205\205\205\205\205\205\205\205\205\205\205\205\ 205\205\205\205\205\205\205\205\205\205\205\205\205\205\205\205\205\205\205\205\205\ 205\205\205\205\205\205\205\205\205\205\205\205\205\205\205\205\205\205\205\188\n"), barra. /* Imprime por pantalla una lista de elementos, con una puntuación correcta para separarlos. */ escribeLista([]). escribeLista([H]):write(H,"."). escribeLista([H|T]):write(H,", "), escribeLista(T). /*Repeticion */ repetir. repetir:repetir. 19