% Evaluation de formules logiques : premi\`ere m\'ethode de calcul

valeur_semantique(P,vrai) :-
	vrai(P), !.
valeur_semantique(P,faux).

vrai(P) :-
	atomique(P),
	effacable(P). 
vrai(non(P)) :-
	non_effacable(P).
vrai(et(P,Q)) :-
	vrai(P),
	vrai(Q).
vrai(ou(P,Q)) :-
	vrai(non(et(non(P),non(Q)))).
vrai(existe(X,P)) :-
	individu(X),
	vrai(P).
vrai(tout(X,P)) :- 
	vrai(non(existe(X,non(P)))).


/* individus */
individu(I):-
	domaine_D(L),
	element(I,L).

domaine_D([pierre,henry,alain,gerard,david,benjamin,jean_pierre,yvette,deborah,delphine,vanessa]).

/* formules atomiques : on sippose que l'arite est 1 ou 2*/

atomique(P) :-
	P =.. [R,X],
	symbole_relationnel(R),
	individu(X).
atomique(P) :-
	P =.. [R,X,Y],
	symbole_relationnel(R),
	individu(X),
	individu(Y).

/* symboles relationnels */

symbole_relationnel(R) :-
	domaine_R(L),
	element(R,L).


domaine_R([homme,femme,pere,mere,enfant,fils,fille,parent,frere,soeur,grand_pere,grand_mere,oncle,tante,cousine,cousin]).

/* divers */

effacable(P) :- P,!.
non_effacable(P) :- vrai(P),!,impasse.
non_effacable(P).

element(E,[E|L]).
element(E,[X|L]) :- E \== X, element(E,L).

/* Reponses */
reponse(est_ce_que(F),oui):-
	valeur_semantique(F,vrai),!.
reponse(est_ce_que(F),'je ne sais pas ').
reponse(quel(X,F),X):-
	individu(X),
	valeur_semantique(F,vrai).
reponse(quel(X,F),'je ne sais pas'):-
	valeur_semantique(non(existe(X,F)),vrai).

/* Jeu d'essai */

fils(david,henry).
fils(benjamin,henry).
fils(jean_pierre,alain).
frere(alain,henry).

q1(X,R) :- reponse(est_ce_que(existe(X,fils(X,henry))),R).
q2(X,R) :- reponse(quel(X,fils(X,henry)),R).
q3(X,Y,R) :- reponse(quel(X,et(frere(X,henry),existe(Y,fils(Y,X)))),R).
