%%%************************************************************************
%%% INTELIGENCIA ARTIFICIAL II.                                 CURSO 01-02
%%% EXAMEN PRÁCTICO                                     Árboles de decisión
%%%************************************************************************

%%%************************************************************************
% Definidos en Prolog los operadores '#', 'hecho', 'si', 'entonces', 'y',
% y 'o' como sigue.

:- op(875, xfx, hecho).
:- op(875, xfx, #).
:- op(825, fx, si).
:- op(850, xfx, entonces).
:- op(800, xfy, o). % Asociatividad a la derecha
:- op(775, xfy, y). % Asociatividad a la derecha

% Supongamos que disponemos de una base de conocimiento y que esta base
% de conocimiento es reconocida como un conjunto de términos prolog
% sintácticamente correctos (los operadores de términos
% que aparecen en la misma están correctamente definidos).

% Como ejemplo se puede utilizar la base de conocimiento definida en el
% fichero "animal.pl"

% Definimos los operadores 'se_deduce_de', 'esta_afirmado_por' y 'porque'.

:- op(850, xfx, se_deduce_de).
:- op(850, xfx, esta_afirmado_por).
:- op(800, xfx, porque).

% Consideremos definidas las siguientes relaciones:
%
% pregunta(?Pregunta) :-
%      "Pregunta se deduce de la base de conocimiento y escribe la
%       justificaci\'on de que tal deducci\'on es correcta".
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

pregunta(P) :-
	prueba(P,Prueba),
	escribe_prueba(Prueba).

prueba(P, P esta_afirmado_por F) :- 
        F hecho P.

prueba(P, P se_deduce_de R porque Prueba) :- 
        R # si C entonces P,
        prueba(C, Prueba). 

prueba(P1 y P2, Prueba1 y Prueba2) :- 
        prueba(P1, Prueba1),
        prueba(P2, Prueba2). 

prueba(P1 o _P2, Prueba1) :- 
        prueba(P1, Prueba1).

prueba(_P1 o P2, Prueba2) :- 
        prueba(P2, Prueba2).


escribe_lista([]).
escribe_lista([X|L]) :- write(X), escribe_lista(L).

%%%%%%%%%%%% Escritura de la prueba

escribe_prueba(Prueba) :-
	nl,write_ln('****** Prueba encontrada:'),nl,
	escribe_prueba_aux(0,Prueba).


escribe_prueba_aux(N,A se_deduce_de B porque Prueba):-
        M is N+2,
        escribe_prueba_aux(M,Prueba),tab(N),
        escribe_lista(['luego, segun ',B,' se concluye que ',A,',']),nl.

escribe_prueba_aux(N,A y B):-
        escribe_prueba_aux(N,A),tab(N),write_ln('y'),
        escribe_prueba_aux(N,B).

escribe_prueba_aux(N,P esta_afirmado_por F):-
        tab(N),escribe_lista(['por ',F,', sabemos que ',P,',']),nl.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Ejemplo de sesión con las mismas.

% ? [examen].
% ...
% Yes
% ? [animal].
% ...
% Yes
% ?- pregunta(rayo es un Que).

% ****** Prueba encontrada:

%       por f4, sabemos que rayo da leche,
%     luego, segun r1 se concluye que rayo es mamifero,
%     y
%     por f5, sabemos que rayo tiene dientes afilados,
%     y
%     por f6, sabemos que rayo tiene garras,
%     y
%     por f7, sabemos que rayo tiene ojos oblicuos,
%   luego, segun r3 se concluye que rayo es carnivoro,
%   y
%   por f8, sabemos que rayo tiene color pardo,
%   y
%   por f9, sabemos que rayo tiene manchas oscuras,
% luego, segun r4 se concluye que rayo es un guepardo,

% Que = guepardo Yes
% ?- prueba(oblongo es un Que).

% No
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Completar y modificar adecuadamente las relaciones anteriores para que la
% relación pregunta/1 se comporte de la siguiente forma:

% ?- [examen].
% ...
% Yes
% ?- [animal].
% ...
% Yes
% ?- pregunta(oblongo es un Que).

% ¿oblongo tiene plumas?
% Posibles respuestas: [si, no, porque] (seguidas de un punto): no.

% ¿oblongo vuela bien?
% Posibles respuestas: [si, no, porque] (seguidas de un punto): no.

% ¿oblongo tiene pelo?
% Posibles respuestas: [si, no, porque] (seguidas de un punto): si.

% ¿oblongo come carne?
% Posibles respuestas: [si, no, porque] (seguidas de un punto): porque.

% === Porque:
% La regla r3 dice que probando:
% oblongo es mamifero y (oblongo come carne o oblongo tiene dientes
% afilados y oblongo tiene garras y oblongo tiene ojos oblicuos)
% se tiene: 
% oblongo es carnivoro

% Repito:
% ¿oblongo come carne?
% Posibles respuestas: [si, no, porque] (seguidas de un punto): porque.

% === Porque:
% La regla r4 dice que probando:
% oblongo es carnivoro y oblongo tiene color pardo y oblongo tiene manchas oscuras
% se tiene: 
% oblongo es un guepardo

% Repito:
% ¿oblongo come carne?
% Posibles respuestas: [si, no, porque] (seguidas de un punto): porque.
% Porque esa fue su pregunta!!
% Repito: 
% ¿oblongo come carne?
% Posibles respuestas: [si, no, porque] (seguidas de un punto): si.

% ¿oblongo tiene manchas oscuras?
% Posibles respuestas: [si, no, porque] (seguidas de un punto): no.

% ¿oblongo tiene dientes afilados?
% Posibles respuestas: [si, no, porque] (seguidas de un punto): no.

% ¿oblongo da leche?
% Posibles respuestas: [si, no, porque] (seguidas de un punto): no.

% ¿oblongo tiene pelo?
% Posibles respuestas: [si, no, porque] (seguidas de un punto): si.

% ¿oblongo tiene rayas negras?
% Posibles respuestas: [si, no, porque] (seguidas de un punto): si.

% ****** Prueba encontrada:

%       por usted, sabemos que oblongo tiene pelo,
%     luego, segun r1 se concluye que oblongo es mamifero,
%     y
%     por usted, sabemos que oblongo come carne,
%   luego, segun r3 se concluye que oblongo es carnivoro,
%   y
%   por usted, sabemos que oblongo tiene color pardo,
%   y
%   por usted, sabemos que oblongo tiene rayas negras,
% luego, segun r5 se concluye que oblongo es un tigre,

% Que = tigre 

% Yes

% ?- pregunta(rayo es un X).

% ¿rayo tiene plumas?
% Posibles respuestas: [si, no, porque] (seguidas de un punto): no.

% ¿rayo vuela bien?
% Posibles respuestas: [si, no, porque] (seguidas de un punto): no.

% ¿rayo tiene pelo?
% Posibles respuestas: [si, no, porque] (seguidas de un punto): no.

% ¿rayo come carne?
% Posibles respuestas: [si, no, porque] (seguidas de un punto): no.

% ****** Prueba encontrada:

%       por f4, sabemos que rayo da leche,
%     luego, segun r1 se concluye que rayo es mamifero,
%     y
%     por f5, sabemos que rayo tiene dientes afilados,
%     y
%     por f6, sabemos que rayo tiene garras,
%     y
%     por f7, sabemos que rayo tiene ojos oblicuos,
%   luego, segun r3 se concluye que rayo es carnivoro,
%   y
%   por f8, sabemos que rayo tiene color pardo,
%   y
%   por f9, sabemos que rayo tiene manchas oscuras,
% luego, segun r4 se concluye que rayo es un guepardo,

% X = guepardo 

% Yes
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Nota en el fichero de la base de conocimiento que se utilice estará
%% definida la siguiente relación.

%% preguntable(T) :-
%%             "Determina si T es un término sobre el que el programa puede
%%             preguntar".

% Utilizar la relación respuesta/2 para incluir en la base de las
% respuestas del usuario.

:- dynamic respuesta/2.

% Para evitar avisos al incluir parte de la definición de una relación
% separada de la anterior se utiliza la relación 

% :- discontiguous Relacion/Aridad.

%%% SOLUCIÓN:














%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%