sistema experto de reconocimiento de setas en prolog

Anuncio
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
Descargar