
/* 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 */


/*recherche(EtatCourant,EtatFinal,ListeTaboue,ListeOp) tous donnes sauf ListeOp */
:- dynamic interdit/1.

recherche(Ef,Ef,_,[]) :- !.
recherche(Ec,Ef,Lt,[Op|Lop]) :- operateur(Ec,Op,Es),
						not(member(Es,Lt)),
						not(interdit(Es)),
						write(Ec), write(' '), write(Op), write(' '), write(Es),nl,
						recherche(Es,Ef,[Es|Lt],Lop).


resoudre(Sol) :- initial(Ei), final(Ef), recherche(Ei,Ef,[Ei],Sol).

/* probleme du labyrinthe */

initial(entree).
final(sortie).

interdit(minotaure).

/* operateur(Ec,Op,Es) Ec et Op donnés, Es résultat */
operateur(S1,[S1,S2],S2):- couloir(S1,S2).
operateur(S1,[S1,S2],S2):- couloir(S2,S1).

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 */
/*initial([b,h,h,b,b,h]).
final([b,b,b,h,h,h]).

operateur(Ec,r1,Es) :- remplace([h,h],Ec,[b,b],Es).
operateur(Ec,r2,Es) :- remplace([h,b],Ec,[b,h],Es).
operateur(Ec,r3,Es) :- remplace([b,h],Ec,[h,b],Es).
operateur(Ec,r4,Es) :- remplace([b,b],Ec,[h,h],Es).*/


/* 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).



						





