Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- ---------------------------------------------------------
- | TRABAJO PRACTICO N° 2 - SISTEMA EXPERTO EN PROLOG |
- | INTRODUCCION A LA INTELIGENCIA ARTIFICIAL |
- | LCC 2019 |
- | |
- | Ignacio Sebastián Moliné ~ M-6466/1 |
- | Tomás Fernández de Luco ~ F-3443/6 |
- ---------------------------------------------------------
- INTRODUCCIÓN:
- Este código en Prolog es un sistema experto cuya finalidad es la de reconocer distintos
- ejemplares y familias de corales mediante preguntas al usuario sobre cualidades conocidas.
- Se utilizarán las siguientes reglas de clasificación:
- -- Lophilia Pertusa es un espécimen de coral, de esqueleto duro,
- que habita en zonas profundas, no es utilizado en joyería, tiene forma de árbol y su color es blanco.
- -- Corallium Rubrum (el coral rojo) es un espécimen de coral, de esqueleto duro,
- que habita en zonas profundas, es utilizado en joyería, tiene forma de árbol y su color es rojo.
- -- Favia (el coral cerebro) es una familia de corales, de esqueleto duro,
- que habita en zonas poco profundas, no es utilizado en joyería, tiene forma de esfera y su color es verde.
- -- Fungia Fungites (el coral plato) es una familia de corales, de esqueleto duro,
- que habita en zonas poco profundas, no es utilizado en joyería, tiene forma de seta y su color es violeta.
- -- Antipathes Dichotoma (el coral negro) es una familia de corales, de esqueleto blando,
- que habita en zonas profundas, utilizado en joyería, realiza fotosombra, tiene forma de arbusto y su color es verde.
- -- Dendroneptya (el coral árbol) es una familia de corales, de esqueleto blando,
- que habita en zonas poco profundas, no es utilizado en joyería, tiene forma de árbol y su color es rojo.
- -- Sarcopython (el coral cuero) es una familia de corales, de esqueleto blando,
- que habita en zonas poco profundas, no es utilizado en joyería, tiene forma de seta y su color es verde.
- -- Gorgonia Ventalina es un espécimen de la familia Gorgoniidae y su color es violeta.
- -- Gorgonia Mariae es un espécimen de la familia Gorgoniidae y su color es blanco.
- Para las distintas categorías y propiedades:
- -- Gorgoniidae: Es un coral blando, que habita en zonas poco profundas,
- realiza fotosíntesis y tiene forma de abanico.
- -- Duro: Propiedad del coral. Esqueleto de formación pétrea.
- -- Blando: Propiedad del coral. Equeleto de formación proteínica.
- -- Joyería: Utilizado como matería prima para joyería.
- -- No joyería: No utilizado como materia prima para joyería.
- -- Profundo: Que habita en zonas de profundidades mayores a 30 metros.
- -- No profundo: Que habita en zonas de profundidaes menores a 30 metros.
- -- Solar: Que recibe luz solar, y realiza fotosíntesis.
- -- No solar: Que no recibe luz solar, y realiza fotosombra.
- -- Color: Propiedad del coral. Color mayoritario del coral.
- -- Forma: Propiedad del coral. Forma general del coral.
- El comando para ejecutar el programa es:
- ~ coral.
- Las consultas se contestan con 's.' o 'n.', o con 'N.' siendo N el n° de la opción correspondiente.
- En caso de ingresar una opción no valida, el programa alertará al usuario y volvera a consultar por una propiedad.
- "texto para aprender"
- */
- % --- Predicados con los que se clasifican a los corales. ---
- duro :- satisface('es duro').
- blando :- not(satisface('es duro')).
- joyeria :- satisface('es usado en joyería').
- no_joyeria :- not(satisface('es usado en joyería')).
- profundo :- satisface('habita a más de 30 metros de profundidad').
- no_profundo :- not(satisface('habita a más de 30 metros de profundidad')).
- solar :- satisface('recibe luz solar para fotosíntesis').
- no_solar :- not(satisface('recibe luz solar para fotosíntesis')).
- % Preficados con lista de opciones posibles.
- color(Color) :- satisface_mult('¿De qué color es el coral buscado?', Color, [rojo, violeta, blanco, verde]).
- forma(Forma) :- satisface_mult('¿Qué forma tiene el coral buscado?', Forma, [árbol, seta, esfera, arbusto, abanico]).
- % Predicado para la familia de las Gorgonias.
- gorgoniidae :- blando, no_profundo, solar, forma(abanico).
- % ---
- % --- Verificación para predicados del tipo Si / No. ---
- % si/1 y no/1 almacenarán la información de las propiedades que pueden o no cumplir los corales.
- :- dynamic si/1,no/1.
- % Revisa si ya se sabe si un coral cumple o no con una propiedad.
- % En caso de no tener esa información en la base de conocimiento, la pregunta para agregarla.
- satisface(Atributo) :- si(Atributo) -> true;
- (no(Atributo) -> fail;
- pregunta(Atributo)).
- % Pregunta si un coral cumple o no con un atributo dado y agrega la respuesta a la base de conocimiento.
- % Si la opción no es válida, alertará al usuario de ello y preguntará otra vez.
- pregunta(Atributo) :- write('¿El coral buscado '), write(Atributo), write('? (s/n): '), read(Resp), nl,
- (Resp == s -> assertz(si(Atributo));
- (Resp == n -> assertz(no(Atributo)), fail;
- write('Respuesta incorrecta, intente otra vez.'), nl, pregunta(Atributo))).
- % ---
- % --- Verificación para predicados con una lista de opciones posibles. ---
- % si/2 y no/2 almacenarán la información de qué opción cumple un predicado de una lista de atributos posibles.
- :- dynamic si/2, no/2.
- % Revisa si ya se sabe si un coral cumple con una opción específica de un atributo de opción múltiple dado.
- % En caso de no tener esa información en la base de conocimiento, la pregunta para agregarla.
- satisface_mult(Atributo, Buscado, Opciones) :- si(Atributo, Buscado) -> true;
- (no(Atributo, Buscado) -> fail;
- pregunta_mult(Atributo, Buscado, Opciones)).
- % Imprime la pregunta de opción múltiple, junto con el listado de posibilidades.
- % Agrega la información relevante a la base de conocimiento y revisa si la elección
- % coincide con el valor buscado inicialmente.
- pregunta_mult(Atributo, Buscado, Opciones) :- write(Atributo), nl,
- opciones_mult(Opciones, 1),
- respuesta_mult(Atributo, Opciones, Respuesta),
- aprender_mult(Atributo, Opciones, Respuesta),
- Buscado == Respuesta.
- % Convierte un átomo en una versión imprimible, con la primera letra en may
- convertir(Atomo, Print) :- atom_chars(Atomo, Lista),
- [NotCapitalized | Tail] = Lista,
- upcase_atom(NotCapitalized, Capitalized),
- atomic_list_concat([Capitalized | Tail], Print).
- % Toma un listado de opciones y las va imprimieno en distintos renglones, numeradas a partir de 1.
- opciones_mult([], _).
- opciones_mult([H | T], Numero) :- write(Numero), write('- '), convertir(H, HPrint), write(HPrint), write('.'), nl,
- NuevoValor is Numero + 1, opciones_mult(T, NuevoValor).
- % Pide un número que corresponda a alguno de los de las opciones previamente impresas.
- % Si la opción no es válida, alertará al usuario de ello y preguntará otra vez.
- respuesta_mult(Atributo, Opciones, Respuesta) :- write('Su respuesta: '), read(Elegida),
- (verificar_mult(Opciones, Elegida, Resultado, 1) -> Respuesta = Resultado;
- write('Respuesta inválida. Intente de nuevo.'), nl,
- respuesta_mult(Atributo, Opciones, Respuesta)).
- % Dado un listado de opciones y un valor, revisa que dicho valor corresponda a un índice válido de la lista.
- % Si es así, instancia Resultado al valor de dicho índice. Si no, falla.
- verificar_mult([], _, _, _) :- fail.
- verificar_mult([H | T], Elegida, Resultado, Numero) :- Numero == Elegida -> Resultado = H;
- NuevoValor is Numero + 1, verificar_mult(T, Elegida, Resultado, NuevoValor).
- % Agrega a la base de conocimiento que la opción previamente elegida para un atributo vale.
- % Además, dice que todas las demás opciones para dicho atributo no valen.
- aprender_mult(_, [], _).
- aprender_mult(Atributo, [H | T], Respuesta) :- (H == Respuesta -> assertz(si(Atributo, H));
- assertz(no(Atributo, H))),
- aprender_mult(Atributo, T, Respuesta).
- % ---
- % Elimina todos los datos aprendidos durante la ejecución para poder volver a ejecutar el sistema.
- borraResp :- retractall(si(_)), retractall(no(_)), retractall(si(_, _)), retractall(no(_, _)).
- % Inicia la ejecución del sistema experto.
- coral :- adivina(Coral), !, write('El coral buscado es: '), write(Coral), write('.'), nl, borraResp.
- % --- Predicados para cada una de las especies de corales. ---
- lophilia_pertusa :- duro, profundo, no_joyeria, forma(árbol), color(blanco).
- corallium_rubrum :- duro, profundo, joyeria, forma(árbol), color(rojo).
- favia :- duro, no_profundo, no_joyeria, forma(esfera), color(blanco).
- fungia_fungites :- duro, no_profundo, no_joyeria, forma(seta), color(violeta).
- antipathes_dichotoma :- blando, profundo, joyeria, no_solar, forma(arbusto), color(verde).
- dendronepthya :- blando, no_profundo, no_joyeria, forma(árbol), color(rojo).
- sarcopython :- blando, no_profundo, no_joyeria, forma(seta), color(verde).
- gorgonia_ventalina :- gorgoniidae, color(violeta).
- gorgonia_mariae :- gorgoniidae, color(blanco).
- % ---
- % Predicado que retorna el nombre de un coral que satisfaga las propiedades preguntadas.
- % En caso de no existir, advierte que es desconocido por el sistema.
- adivina('Lophilia Pertusa') :- lophilia_pertusa.
- adivina('Corallium Rubrum, el coral rojo') :- corallium_rubrum.
- adivina('Favia, el coral cerebro') :- favia.
- adivina('Fungia fungites, el coral plato') :- fungia_fungites.
- adivina('Antipathes dichotoma, el coral negro') :- antipathes_dichotoma.
- adivina('Dendronepthya, el coral árbol') :- dendronepthya.
- adivina('Sarcopython, el coral cuero') :- sarcopython.
- adivina('Gorgonia Ventalina') :- gorgonia_ventalina.
- adivina('Gorgonia Mariae') :- gorgonia_mariae.
- adivina('Desconocido').
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement