
/* eliza */

eliza :- write('Bonjour, qu est ce qui vous amene ?'),nl,
 		lire_phrase(Phrase),
		elisa(Phrase).

elisa([bye]) :- !.
elisa(Phrase) :- pattern(Stimulus,Reponse),
				sous_liste(Stimulus,Phrase),
				ecrire_phrase(Reponse),
				lire_phrase(NewPhrase),
				elisa(NewPhrase).

				
					
sous_liste(L1,L2) :- append(L3,_,L2), append(_,L1,L3).
			
pattern([je,suis,X],[depuis,combien,de,temps,etes,vous,X,?]).
pattern([j,aime],[quelqu,un,d,autre,dans,votre,famille,aime,t,il,cela,?]).
pattern([je,me,sens,_],[ressentez,vous,souvent,cela,?]).
pattern([X],[pouvez,vous,me,parler,de,votre,X,?]):-important(X).
pattern(_,[continuez]).

important(pere).
important(mere).
important(fils).
important(fille).
important(frere).
important(soeur).

lire_phrase(Liste):-
	read(Phrase),
	name(Phrase,P),
	divise(P,Liste).
	
divise(Chaine,[MotL|Liste]) :- 
		append(Mot,[32|Reste],Chaine),
		name(MotL,Mot),
		divise(Reste,Liste).
divise(DernierMot,[DernierMotL]):-
		name(DernierMotL,DernierMot).

ecrire_phrase([]) :- nl.
ecrire_phrase([X|L]) :- write(X), write(' '),ecrire_phrase(L).

/* tours de hanoi */
/* hanoi(Nbdisques,TigeDepart,TigeIntermediaire,TigeArrivee) donnes */
hanoi(1,TD,_,TA):- !, write(TD),write(' -> '),write(TA),nl.
hanoi(N,TD,TI,TA) :- Nm1 is N-1, hanoi(Nm1,TD,TA,TI),
					hanoi(1,TD,TI,TA),
					hanoi(Nm1,TI,TD,TA).



/* recherche dans un graphe d'etats */
:- dynamic interdit/1.

/*recherche(EtatCourant,EtatFinal,ListeTaboue,ListeOp) tous donnes sauf ListeOp */

recherche(Ef,Ef,_,[]) :- !.
recherche(Ec,Ef,Le,[Op|Lop]) :- operateur(Ec,Op,Es),
						not(interdit(Es)),
						not(member(Es,Le)),
						write(Ec),write(' '),write(Op), write(' '),write(Es),nl,
						recherche(Es,Ef,[Es|Le],Lop).

resoudre(Solution):- etatInitial(Ei), etatFinal(Ef), recherche(Ei,Ef,[Ei],Solution).

/* probleme du labyrinthe */

/*etatInitial(entree).
etatFinal(sortie).

interdit(minotaure).

operateur(E1,[E1,E2],E2) :- couloir(E1,E2).
operateur(E1,[E1,E2],E2) :- couloir(E2,E1).*/


couloir(entree, thesee).
couloir(entree, ariane).
couloir(thesee, minotaure).
couloir(thesee,sombre).
couloir(claire, sombre).
couloir(claire, sortie).
couloir(minotaure, sortie).
couloir(ariane, claire).
couloir(sombre,sortie).

/* probleme des fleches */
:- dynamic interdit/1.

etatInitial([b,h,h,b,b,h]).
etatFinal([b,b,b,h,h,h]).

operateur(E1,r1,E2) :- remplace([h,h],E1,[b,b],E2).
operateur(E1,r2,E2) :- remplace([h,b],E1,[b,h],E2).
operateur(E1,r3,E2) :- remplace([b,h],E1,[h,b],E2).
operateur(E1,r4,E2) :- remplace([b,b],E1,[h,h],E2).



/* remplace(SL1,L1,SL2,L2) tous donnes sauf L2 */
remplace(SL1,L1,SL2,L2):-append(L5,L4,L1),
						append(L3,SL1,L5),
						append(L3,SL2,L6),
						append(L6,L4,L2).



						





