Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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"):-
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).
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,
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")),
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.