Title: Arbres en Prolog
1Arbres 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
- / \ / \
- 4 5 6 7
2Arbres 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)).
3Un arbre binaire
4Parcours inordre
printInfo(nul). printInfo(t(RootInfo,LeftSubtr,Rig
htSubtr)) - 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))). 5 31
73 83 97 101 Yes
5Recherche 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 lt Info2 .
6Insertion 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).
7Retrait à 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)
8Retrait 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).
9Retrait 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).
10Recherche en profondeur
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.
11Les tours de Hanoi
État initial A,B,C 1,2,3,, but(,
,_).
12Les tours de Hanoi (mouvements)
legal(_,). legal(D1,D2_)-
D1ltD2. successeur(TL1,L2,L3,L1,TL2,L3)
- legal(T,L2). successeur(TL1,L2,L3,L1,L2,
TL3) - legal(T,L3). successeur(L1,TL2,L3
,TL1,L2,L3) - legal(T,L1).
successeur(L1,TL2,L3,L1,L2,TL3) -
legal(T,L3). successeur(L1,L2,TL3,TL1,L2,
L3) - legal(T,L1). successeur(L1,L2,TL3,L
1,TL2,L3) - legal(T,L2).
13Les tours de Hanoi (version 1)
but(,,_). resoudre(E,E) - but(E).
resoudre(E,ESolution) - successeur(E,Esuivant
), resoudre(Esuivant,S
olution). ?!
14Les tours de Hanoi (version 2)
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).
15Les tours de Hanoi (version 3)
resoudre(E,E,Pmax) - but(E).
resoudre(E,ESolution,Pmax) - Pmaxgt0,
successeur(E,Esuivant), Pmax1 is Pmax-1,
resoudre(Esuivant,Solution,Pmax1),
write(Esuivant), nl.
16Recherche en largeur
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,).
17Les tours de Hanoi (version 4)
?- 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, , .
18Les tours de Hanoi (version 4)
resoudre(Racine, Solution)- largeur(Racine,So
lution),
voir(Solution). voir(). voir(NoeudChemin) -
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
19Les graphes
Représentation g(Noeud, ...,arc(Noeud1,Noeu
d2,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,Val
eur)- member(arc(N1,N2,Valeur),Arcs)
member(arc(N2,N1,Valeur),Arcs).
20Voisins dans un graphe
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).
21Coloriage de graphe
coloriage(g(Ns,Arcs),Couleurs,Coloriage)-
genere(Ns,Couleurs,Coloriage),
test(Arcs,Coloriage). genere(,_,). genere(NN
s,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).
22Coloriage de graphe
?- 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,ve
rt,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)
23Labyrinthe
connecte(0,1). depart 0 connecte(1,2). connect
e(2,6). connecte(6,5). connecte(6,7). connecte(5,4
). connecte(5,9). connecte(9,8). connecte(8,12). c
onnecte(9,10). connecte(10,11). connecte(9,13). co
nnecte(13,14). connecte(14,15). fin 15
0 1 2 3 4 5 6 7 8 9
10 11 12 13 14 15
24Labyrinthe
successeur(A,B)-connecte(A,B). successeur(A,B)-c
onnecte(B,A). but(15). resoudre(FinChemin,Fin
Chemin)-but(Fin). resoudre(CourantChemin,Sol
ution)- successeur(Courant,Suivant),
\member(Suivant,Chemin),write(Suivant),nl,
resoudre(Suivant,CourantChemin,Solution).
25Labyrinthe
?- resoudre(0,S). 1 2 6 5 9 8 12 10 11 13 14 15
S 15, 14, 13, 9, 5, 6, 2, 1, 0 7 4 false.