La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

CSI2520, Hiver 2007 Arbres en Prolog Un arbre binaire est une structure pouvant contenir des données. Chaque élément de l'arbre contient une donnée et.

Présentations similaires


Présentation au sujet: "CSI2520, Hiver 2007 Arbres en Prolog Un arbre binaire est une structure pouvant contenir des données. Chaque élément de l'arbre contient une donnée et."— Transcription de la présentation:

1 CSI2520, Hiver 2007 Arbres en Prolog Un arbre binaire est une structure pouvant contenir des données. Chaque élément de l'arbre contient une donnée et a au plus un 'parent' et deux 'enfants'. 1 / \ 2 3 / \ / \

2 CSI2520, Hiver 2007 Arbres en Prolog On peut representer les arbres avec une structure t(elem, gauche, droit) ou 'elem' est la valeur de la racine, et gauche et droit sont les sous-arbres à gauche/droite de la racine. Un arbre vide sera represente par 'nil'. Ainsi, un arbre à un seul élément 1: t(1,nil,nil): 1 / \ 2 3 t(1,t(2,nil,nil),t(3,nil,nil)).

3 CSI2520, Hiver 2007 Un arbre binaire

4 CSI2520, Hiver 2007 Parcours inordre printInfo(nul). printInfo(t(RootInfo,LeftSubtr,RightSubtr)) :- printInfo(LeftSubtr), write(RootInfo), write(' '), printInfo(RightSubtr). ?- printInfo(t(73, t(31, t(5, nul, nul), nul), t(101, t(83, nul, t(97, nul, nul)), nul))) Yes

5 CSI2520, Hiver 2007 Recherche dans un arbre search(Info, t(Info, _, _)). search(Info, t(RootInfo, Left, _Right)) :- precedes(Info, RootInfo), search(Info, Left). search(Info, t(RootInfo, _Left, Right)) :- precedes(RootInfo, Info), search(Info, Right). precedes(Info1, Info2) :- Info1 < Info2.

6 CSI2520, Hiver 2007 Insertion dans un arbre insert(Info, nul, t(Info, nul, nul)). insert(Info, t(RootInfo, Left, Right), t(RootInfo, LeftPlus, Right)) :- precedes(Info, RootInfo), insert(Info, Left, LeftPlus). insert(Info, t(RootInfo, Left, Right), t(RootInfo, Left, RightPlus)) :- precedes(RootInfo, Info), insert(Info, Right, RightPlus).

7 CSI2520, Hiver 2007 Retrait à la racine dun arbre delete(Info, t(Info, nul, Right), Right). delete(Info, t(Info, Left, nul), Left). delete(Info, t(Info, Left, Right), t(NewRoot, NewLeft, Right)) :- removeMax(Left, NewLeft, NewRoot). % removeMax(Tree,NewTree,Max)

8 CSI2520, Hiver 2007 Retrait dans un arbre delete(Info, t(RootInfo, Left, Right), t(RootInfo, LeftSmaller, Right)) :- precedes(Info, RootInfo), delete(Info, Left, LeftSmaller). delete(Info, t(RootInfo, Left, Right), t(RootInfo, Left, RightSmaller)) :- precedes(RootInfo, Info), delete(Info, Right, RightSmaller).

9 CSI2520, Hiver 2007 Retrait du max élément removeMax(t(Max, Left, nul), Left, Max). removeMax(t(Root, Left, Right), t(Root, Left, RightSmaller), Max) :- removeMax(Right, RightSmaller, Max).

10 Recherche en profondeur CSI2520, Hiver 2007 resoudre(N,[N]) :- but(N). resoudre(N,[N | Solution]) :- successeur(N,Nsuivant), resoudre(Nsuivant,Solution). Il faut donc définir le but et définir les noeuds successeurs.

11 Les tours de Hanoi CSI2520, Hiver 2007 État initial: [A,B,C] = [[1,2,3],[],[]] but([[],[],_]).

12 Les tours de Hanoi (mouvements) CSI2520, Hiver 2007 legal(_,[]). legal(D1,[D2|_]):- D1

13 Les tours de Hanoi (version 1) CSI2520, Hiver 2007 but([[],[],_]). resoudre(E,[E]) :- but(E). resoudre(E,[E|Solution]) :- successeur(E,Esuivant), resoudre(Esuivant,Solution). ?!

14 Les tours de Hanoi (version 2) CSI2520, Hiver 2007 resoudre(Noeud,Solution) :- profondeur([], Noeud,Solution). profondeur(Chemin, Noeud,[Noeud | Chemin]) :- but(Noeud). profondeur(Chemin, Noeud,Sol) :- successeur(Chemin, Noeud1), \+member(Chemin1,Path), profondeur([Chemin | Path], Chemin1, Sol).

15 Les tours de Hanoi (version 3) CSI2520, Hiver 2007 resoudre(E,[E],Pmax) :- but(E). resoudre(E,[E|Solution],Pmax) :- Pmax>0, successeur(E,Esuivant), Pmax1 is Pmax-1, resoudre(Esuivant,Solution,Pmax1), write(Esuivant), nl.

16 Recherche en largeur CSI2520, Hiver 2007 resoudre(Racine, Solution):- largeur ([[Racine]],Solution). % largeur(liste de chemin, solution) largeur([[Noeud | Chemin] | _],[Noeud | Chemin]):- but(Noeud). largeur([Chemin | Chemins], Solution):- etendre(Chemin,NChemins), conc(Chemins,NChemins,Chemins1), largeur(Chemins1,Solution). etendre([Noeud | Chemin],NChemins):- bagof([NNoeud,Noeud | Chemin], (successeur(Noeud,NNoeud), \+member(NNoeud,[Noeud | Chemin])), NChemins), !. etendre(Chemin,[]).

17 Les tours de Hanoi (version 4) CSI2520, Hiver 2007 ?- successeur([[1,2,3],[],[]],S). S = [[2, 3], [1], []] ; S = [[2, 3], [], [1]] ; ?- etendre([[[1,2,3],[],[]]],S). S = [[[[2, 3], [1], []], [[1, 2, 3], [], []]], [[[2, 3], [], [1]], [[1, 2, 3], [], []]]].

18 Les tours de Hanoi (version 4) CSI2520, Hiver 2007 resoudre(Racine, Solution):- largeur([[Racine]],Solution), voir(Solution). voir([]). voir([Noeud|Chemin]) :- voir(Chemin), nl, write(Noeud).. ?- resoudre([[1,2,3],[],[]],S). [[1,2,3],[],[]] [[2,3],[],[1]] [[3],[2],[1]] [[3],[1,2],[]] [[],[1,2],[3]] [[1],[2],[3]] [[1],[],[2,3]] [[],[],[1,2,3]]

19 Les graphes CSI2520, Hiver 2007 Représentation: g([Noeud,...],[arc(Noeud1,Noeud2,Valeur),...]). arc(g(Ns,Arcs),N1,N2,Valeur):- member(arc(N1,N2,Valeur),Arcs). % pour un graphe non-dirigé arc(g(Ns,Arcs),N1,N2,Valeur):- member(arc(N1,N2,Valeur),Arcs); member(arc(N2,N1,Valeur),Arcs).

20 Voisins dans un graphe CSI2520, Hiver 2007 voisins(Graphe,Noeud,Voisins):- setof((N,Arc),arc(Graphe,Noeud,N,Arc),Voisins). ?- voisins(g([a,b,c,d,e,f], [arc(a,b,3),arc(a,c,5),arc(a,d,7),arc(e,f,1),arc(d,f,6)]),c,V). V = [ (a, 5)]. ?- voisins(g([a,b,c,d,e,f], [arc(a,b,3),arc(a,c,5),arc(a,d,7),arc(e,f,1),arc(d,f,6)]),a,V). V = [ (b, 3), (c, 5), (d, 7)].

21 Coloriage de graphe CSI2520, Hiver 2007 coloriage(g(Ns,Arcs),Couleurs,Coloriage):- genere(Ns,Couleurs,Coloriage), test(Arcs,Coloriage). genere([],_,[]). genere([N|Ns],Couleurs,[(N,C)|Q]):- member(C,Couleurs), genere(Ns,Couleurs,Q). test([],_). test([arc(N1,N2,_)|Ns],Coloriage):- member((N1,C1),Coloriage), member((N2,C2),Coloriage), C1\=C2, test(Ns,Coloriage).

22 Coloriage de graphe CSI2520, Hiver 2007 ?- coloriage(g([a,b,c,d,e,f], [arc(a,b,3),arc(a,c,5),arc(a,d,7),arc(e,f,1),arc(d,f,6)]), [rouge,bleu,blanc,vert],V). V = [ (a, rouge), (b, bleu), (c, bleu), (d, bleu), (e, rouge), (f, blanc)] ; V = [ (a, rouge), (b, bleu), (c, bleu), (d, bleu), (e, rouge), (f, vert)] ; V = [ (a, rouge), (b, bleu), (c, bleu), (d, bleu), (e, bleu), (f, rouge)]; …

23 Labyrinthe CSI2520, Hiver 2007 connecte(0,1). % depart = 0 connecte(1,2). connecte(2,6). connecte(6,5). connecte(6,7). connecte(5,4). connecte(5,9). connecte(9,8). connecte(8,12). connecte(9,10). connecte(10,11). connecte(9,13). connecte(13,14). connecte(14,15). %fin =

24 Labyrinthe CSI2520, Hiver 2007 successeur(A,B):-connecte(A,B). successeur(A,B):-connecte(B,A). but(15). resoudre([Fin|Chemin],[Fin|Chemin]):-but(Fin). resoudre([Courant|Chemin],Solution):- successeur(Courant,Suivant), \+member(Suivant,Chemin),write(Suivant),nl, resoudre([Suivant,Courant|Chemin],Solution).

25 Labyrinthe CSI2520, Hiver 2007 ?- resoudre([0],S) S = [15, 14, 13, 9, 5, 6, 2, 1, 0] ; 7 4 false.


Télécharger ppt "CSI2520, Hiver 2007 Arbres en Prolog Un arbre binaire est une structure pouvant contenir des données. Chaque élément de l'arbre contient une donnée et."

Présentations similaires


Annonces Google