Está en la página 1de 16

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*
global domains
file=input1;input2
Sujeto,Pregunta,Respuesta,Resultado,Propiedad1,Propiedad2,Estado=string
global facts - propiedades
propiedad (Sujeto,Pregunta, Respuesta)
global facts - categoria
clasificacion (Sujeto, Propiedad1, Propiedad2)
global facts - encontrado
encontrado (Estado)
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
pantallainicio.
clauses
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 archi
vos
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 opcin incorrecta (distinto de 1,2 3).*/
menu(_,"BD"):write("Tecla incorrecta...Intentelo de nuevo"),
menu(1,"principal").
/* Entorno de preguntas-respuetas. Clasificacin de setas.*/
menu(2,"principal"):/* determ retractall(Hecho, NombreSeccionHechos): Borra todos los hechos encontr
ados
que casen con el hecho especificado en el argumento. Acta sobre del dominio
de hechos con nombre NombreSeccionHechos.*/
retractall(_,categoria),
/* consult(String NombreFichero, NombreSeccionHechos): Sirve para leer hechos de
sde
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),
assertz(encontrado("Falso")),
/* Obtenemos las reglas de clasificacin, para decodificarlas y cargarlas al
sistema.*/
openread(input1,"DBReglas.dat"),
repetir,
analiza,
closefile(input1),
/* Abrimos el archivo de preguntas para comenzar el proceso de identificacin.*/
openread(input2,"Pregunta.dat"),
repetir,
Pregunta(LRegla),
closefile(input2),
/* Si el sujeto no se encontraba en las reglas lo aadimos.*/
nuevosujeto,
graba(LRegla,LRegla),
/* Vuelta al men principal.*/
barra.
/* Salir de la aplicacin.*/
menu(3,"principal"):-

write("Presione una tecla para salir"),


readchar(_).
/* Si el usuario elige una opcin 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 latn (sujeto) y sus pr
eguntas
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 de
beremos
parsear Cadena, ya que aqu se encuentran concatenadas todas
pregunta1~repuesta1, pregunta2~repuesta2,...*/
decodifica(Cadena,Sujeto):/* Cogemos de la posicin 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 h
ay
delante y detrs 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
caracterstica.*/
assertz(propiedad(Sujeto,Pregunta,Respuesta)),
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 usuar
io y
eliminar los sujetos que ya no son solucin. Si en algn momento no queda ningn sujet
o
se pasa al estado de aprendizaje para completar el resto de preguntas. Si se lle
ga a la
ltima pregunta y queda algn sujeto, entonces ese sujeto es la solucin.*/
/* Si hemos terminado las preguntas, comprobar si tenemos algn 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 descripcin concuerdan con las respu
estas
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 caractersticas del sujeto encontrado.*/
clasifica_resultado(ListaSujetos),!.
/* Identificacin el final del archivo preguntas.dat Y como anteriormente hemos av
eriguado
que no tenemos esa seta en la BD, tendremos que aprender despus.*/
Pregunta([]):eof(input2),
encontrado("No existe"),!.
/* Pregunta al usuario usando la BD Preguntas. Las respuestas del usuario se con
vierten en
maysculas 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-r
espuesta
en LRegla, para que si no se conoce el sujeto poder usar esos conocimientos en l
a etapa
de aprendizaje. Despus se llama a analiza_pregunta para eliminar los sujetos que
no
responden a la nueva caracterstica introducida por el usuario, y se contina con el
resto de preguntas.*/
Pregunta([Cad3|T]):readdevice(input2),
/* Lee una pregunta.*/
readln(Pregunta),
Pregunta<>"",
/* Escribe la pregunta, el usuario podr responder en maysculas o minsculas.
*/
write("\168",Pregunta,"? "),
readdevice(stdin),
readln(Respuesta1),
/* Tratamos la cadena para que sea toda en maysculas.*/
upper_lower(Respuesta, Respuesta1),
/* Analizamos los sujetos que responden a estas caractersticas y eliminam
os el
resto.*/
analiza_pregunta("",Pregunta,Respuesta),
/* Concatenamos Pregunta~Respuesta, para poder aprender en caso de que s
ea
necesario.*/
concat(Pregunta,"~",Cad1),
concat(Cad1,Respuesta,Cad2),
concat(Cad2,",",Cad3),
/* Seguimos mostrando preguntas.*/
pregunta(T).

/* 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 anlisis.
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 anlisis.*/
analiza_pregunta(_,Pregunta,Respuesta):/* Obtener los sujetos concordantes.*/
findall(X,propiedad(X,Pregunta,Respuesta),ListaSujetos),
/* Y los contamos.*/
contar(ListaSujetos,Y),
/* Dependiendo del nmero 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 usua
rio para
una pregunta, esos sujetos no sern solucin 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 solucin.*/
borraeliminados([]).
borraeliminados([H|T]):retractall(propiedad(H,_,_)),
borraeliminados(T).
/* Comprueba la cantidad de sujetos encontrados con las caractersticas dadas */
/* Si no hay ningn sujeto concordante, pasar al modo de aprendizaje e informar de
ello.
As ahorramos el tener que hacer el anlisis 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 respond
iendo
preguntas para asegurarse (minimizar la posibilidad de falsos positivos).*/
existeBD(1):write("Hay una seta encontrada. Siga respondiendo a las preguntas para estar
seguro.\n"),!.

/* Si el numero de setas que se adecuan a la descripcin que da el usuario es dist


into de
cero, es porque podemos tener esa seta catalogada, por tanto tendremos que segui
r
preguntando y analizar cada pregunta-respuesta.*/
existeBD(Y):write("Hay ",Y," setas encontradas.\n"),!.
/* Grabacin de regla en archivo.*/
/* Si el sujeto esta clasificado en DBHechos (encontrado=verdadero) no haremos n
ada.*/
nuevosujeto:encontrado("Verdadero"),!.
/* Si el sujeto no se encuentra en nuestra clasificacin de setas (DBHechos) apren
deremos.
Preguntaremos al usuario de que seta se trata y lo almacenaremos convenientement
e en los
ficheros DBHechos.dat y DBReglas.dat.*/
nuevosujeto:/* Informamos de que el sujeto no estaba en nuestras bases de datos, y p
edimos 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 datos del nuevo sujeto para completar el apr
endizaje.*/
write("Nombre latino : "),readln(Resultado),
write("Nombre(s) comun(es): "),readln(Propiedad1),
write("Comestibilidad : "),readln(Propiedad2),
/* Aadimos a la BD de hechos los datos introducidos.*/
openappend(input1,"DBHechos.dat"),
writedevice(input1),
write("clasificacion(\"",Resultado,"\",\"",Propiedad1,"\",\"",Propiedad2
,"\")\n"),
closefile(input1),
/* Aadimos a la BD de reglas las preguntas/respuestas introducidas por el
usuario.*/
openappend(input2,"DBReglas.dat"),
writedevice(input2),
nl,
write(Resultado),nl,
closefile(input2).
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.
/* Identificacin y registro en la BD de Reglas de datos aprendidos correspondient
e al

sujeto no identificado.*/
/*Si hemos grabado todo el contenido de LRegla(Pregunta1~Respuesta1,Pregunta2~Re
spuesta2...)
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 q
ue 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 crditos del programa.*/
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 \18
6\n"),
write("\186 se hacen responsable de las consecuencias debidas a una \186
\n"),
write("\186 clasificacin errneaa. 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 puntuacin correcta para s
epararlos.
*/
escribeLista([]).

escribeLista([H]):write(H,".").
escribeLista([H|T]):write(H,", "),
escribeLista(T).
/*Repeticion */
repetir.
repetir:repetir.

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*
global domains
file=input1;input2
Sujeto,Pregunta,Respuesta,Resultado,Propiedad1,Propiedad2,Estado=string
global facts - propiedades
propiedad (Sujeto,Pregunta, Respuesta)
global facts - categoria
clasificacion (Sujeto, Propiedad1, Propiedad2)
global facts - encontrado
encontrado (Estado)
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
pantallainicio.
clauses
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 archi
vos
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 opcin incorrecta (distinto de 1,2 3).*/
menu(_,"BD"):write("Tecla incorrecta...Intentelo de nuevo"),
menu(1,"principal").
/* Entorno de preguntas-respuetas. Clasificacin de setas.*/
menu(2,"principal"):/* determ retractall(Hecho, NombreSeccionHechos): Borra todos los hechos encontr
ados
que casen con el hecho especificado en el argumento. Acta sobre del dominio
de hechos con nombre NombreSeccionHechos.*/
retractall(_,categoria),
/* consult(String NombreFichero, NombreSeccionHechos): Sirve para leer hechos de
sde
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),
assertz(encontrado("Falso")),
/* Obtenemos las reglas de clasificacin, para decodificarlas y cargarlas al
sistema.*/
openread(input1,"DBReglas.dat"),
repetir,
analiza,
closefile(input1),
/* Abrimos el archivo de preguntas para comenzar el proceso de identificacin.*/
openread(input2,"Pregunta.dat"),

repetir,
Pregunta(LRegla),
closefile(input2),
/* Si el sujeto no se encontraba en las reglas lo aadimos.*/
nuevosujeto,
graba(LRegla,LRegla),
/* Vuelta al men principal.*/
barra.
/* Salir de la aplicacin.*/
menu(3,"principal"):write("Presione una tecla para salir"),
readchar(_).
/* Si el usuario elige una opcin 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 latn (sujeto) y sus pr
eguntas
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 de
beremos
parsear Cadena, ya que aqu se encuentran concatenadas todas
pregunta1~repuesta1, pregunta2~repuesta2,...*/
decodifica(Cadena,Sujeto):/* Cogemos de la posicin 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 h
ay
delante y detrs 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
caracterstica.*/
assertz(propiedad(Sujeto,Pregunta,Respuesta)),
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 usuar
io y

eliminar los sujetos que ya no son solucin. Si en algn momento no queda ningn sujet
o
se pasa al estado de aprendizaje para completar el resto de preguntas. Si se lle
ga a la
ltima pregunta y queda algn sujeto, entonces ese sujeto es la solucin.*/
/* Si hemos terminado las preguntas, comprobar si tenemos algn 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 descripcin concuerdan con las respu
estas
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 caractersticas del sujeto encontrado.*/
clasifica_resultado(ListaSujetos),!.
/* Identificacin el final del archivo preguntas.dat Y como anteriormente hemos av
eriguado
que no tenemos esa seta en la BD, tendremos que aprender despus.*/
Pregunta([]):eof(input2),
encontrado("No existe"),!.
/* Pregunta al usuario usando la BD Preguntas. Las respuestas del usuario se con
vierten en
maysculas 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-r
espuesta
en LRegla, para que si no se conoce el sujeto poder usar esos conocimientos en l
a etapa
de aprendizaje. Despus se llama a analiza_pregunta para eliminar los sujetos que
no
responden a la nueva caracterstica introducida por el usuario, y se contina con el
resto de preguntas.*/
Pregunta([Cad3|T]):readdevice(input2),
/* Lee una pregunta.*/
readln(Pregunta),
Pregunta<>"",
/* Escribe la pregunta, el usuario podr responder en maysculas o minsculas.
*/
write("\168",Pregunta,"? "),
readdevice(stdin),
readln(Respuesta1),
/* Tratamos la cadena para que sea toda en maysculas.*/
upper_lower(Respuesta, Respuesta1),
/* Analizamos los sujetos que responden a estas caractersticas y eliminam
os el
resto.*/

analiza_pregunta("",Pregunta,Respuesta),
/* Concatenamos Pregunta~Respuesta, para poder aprender en caso de que s
ea
necesario.*/
concat(Pregunta,"~",Cad1),
concat(Cad1,Respuesta,Cad2),
concat(Cad2,",",Cad3),
/* Seguimos mostrando preguntas.*/
pregunta(T).
/* 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 anlisis.
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 anlisis.*/
analiza_pregunta(_,Pregunta,Respuesta):/* Obtener los sujetos concordantes.*/
findall(X,propiedad(X,Pregunta,Respuesta),ListaSujetos),
/* Y los contamos.*/
contar(ListaSujetos,Y),
/* Dependiendo del nmero 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 usua
rio para
una pregunta, esos sujetos no sern solucin 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 solucin.*/
borraeliminados([]).
borraeliminados([H|T]):retractall(propiedad(H,_,_)),
borraeliminados(T).
/* Comprueba la cantidad de sujetos encontrados con las caractersticas dadas */
/* Si no hay ningn sujeto concordante, pasar al modo de aprendizaje e informar de
ello.
As ahorramos el tener que hacer el anlisis 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 respond
iendo
preguntas para asegurarse (minimizar la posibilidad de falsos positivos).*/
existeBD(1):write("Hay una seta encontrada. Siga respondiendo a las preguntas para estar
seguro.\n"),!.
/* Si el numero de setas que se adecuan a la descripcin que da el usuario es dist
into de
cero, es porque podemos tener esa seta catalogada, por tanto tendremos que segui
r
preguntando y analizar cada pregunta-respuesta.*/
existeBD(Y):write("Hay ",Y," setas encontradas.\n"),!.
/* Grabacin de regla en archivo.*/
/* Si el sujeto esta clasificado en DBHechos (encontrado=verdadero) no haremos n
ada.*/
nuevosujeto:encontrado("Verdadero"),!.
/* Si el sujeto no se encuentra en nuestra clasificacin de setas (DBHechos) apren
deremos.
Preguntaremos al usuario de que seta se trata y lo almacenaremos convenientement
e en los
ficheros DBHechos.dat y DBReglas.dat.*/
nuevosujeto:/* Informamos de que el sujeto no estaba en nuestras bases de datos, y p
edimos 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 datos del nuevo sujeto para completar el apr
endizaje.*/
write("Nombre latino : "),readln(Resultado),
write("Nombre(s) comun(es): "),readln(Propiedad1),
write("Comestibilidad : "),readln(Propiedad2),
/* Aadimos a la BD de hechos los datos introducidos.*/
openappend(input1,"DBHechos.dat"),
writedevice(input1),
write("clasificacion(\"",Resultado,"\",\"",Propiedad1,"\",\"",Propiedad2
,"\")\n"),
closefile(input1),
/* Aadimos a la BD de reglas las preguntas/respuestas introducidas por el
usuario.*/
openappend(input2,"DBReglas.dat"),
writedevice(input2),
nl,
write(Resultado),nl,
closefile(input2).
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.
/* Identificacin y registro en la BD de Reglas de datos aprendidos correspondient
e al
sujeto no identificado.*/
/*Si hemos grabado todo el contenido de LRegla(Pregunta1~Respuesta1,Pregunta2~Re
spuesta2...)
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 q
ue 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 crditos del programa.*/
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 \18
6\n"),
write("\186 se hacen responsable de las consecuencias debidas a una \186
\n"),
write("\186 clasificacin errneaa. 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 puntuacin correcta para s
epararlos.
*/
escribeLista([]).
escribeLista([H]):write(H,".").
escribeLista([H|T]):write(H,", "),
escribeLista(T).
/*Repeticion */
repetir.
repetir:repetir.

También podría gustarte