Você está na página 1de 33

Aplicaes de recursividade

Prof. Dr. Silvio do Lago Pereira


Departamento de Tecnologia da Informao
Faculdade de Tecnologia de So Paulo
Aplicaes de recursividade
72 51 65 88 90 46 29 15 37
Nesta aula, veremos algumas
72 65 90 29 37 51 88 46 15
lg n
aplicaes de recursividade em: 72 90 37 65 29 51 46 88 15

Ordenao de dados 72 37 90 65 29 51 46 88 15

72 37
Ordenao topolgica 72 37
n

37 72 90 65 29 51 46 88 15
rvores de busca binria
37 72 90 29 65 46 51 15 88

Cdigo de Huffman 29 37 65 72 90 15 46 51 88

15 29 37 46 51 65 72 88 90

9
4 0 1
1 2 3
4
0 1
4 5 6 2 6
2 2 5
0 1 0 1 0 1

7 8 9 1 3 5 7 1 1 1 1 2 3
D E L R M A

Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 2


Ordenao de dados

ordenao por gerao e teste


ordenao por trocas
ordenao por insero
ordenao por intercalao
ordenao por partio
Ordenao por gerao e teste (permutation sort)
AAoperao
operaodedegerao
gerao(ou
(oupermutao)
permutao)
Constri
Constriuma
umapermutao
permutaoPPde
deuma
umalista
listaLL. .

AAoperao
operaode deteste
teste
Verifica
Verificase
seuma
umapermutao
permutaoPPest
estordenada.
ordenada.

Para ordenar L por tentativa e erro: L: 3 1 2


Gere uma permutao P de L.
P1 : 3 1 2
Teste se P est ordenada.

Complexidade de tempo: O(n!) P2 : 3 2 1

Muito ineficiente para ser usada P3 : 1 3 2


em aplicaes prticas!
P4 : 1 2 3
Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 4
Ordenao por gerao e teste: implementao
Exemplo
Exemplo1.1.Ordenao
Ordenaopor
porgerao
geraoeeteste
teste
ps(L,P)
ps(L,P)
ps (L,P) :-
ps(L,P) :-- permuta(L,P),
::- permuta(L,P), ordenada(P).
ordenada(P).
permuta([],[]).
permuta([],[]).
permuta
permuta([],[]).
([],[]).
permuta(L,[
permuta(L,[X|P
permuta (L,[X|P])
(L,[
permuta(L,[ X|P])
X|P
(L,[X|P ]) :-
X|P]) :-- exclui(X,L,R),
::- exclui(X,L,R), permuta(R,P).
permuta(R,P).
exclui(X,L,R)
exclui(X,L,R)
exclui (X,L,R) :-
exclui(X,L,R) :-- concatena(A,[X|B],L),
::- concatena(A,[X|B],L), concatena(A,B,R).
concatena(A,B,R).
concatena([],B,B).
concatena([],B,B).
concatena
concatena([],B,B).
([],B,B).
concatena([X|A],B,[X|C])
concatena([X|A],B,[X|C])
concatena ([X|A],B,[X|C]) :-
concatena([X|A],B,[X|C]) :-- concatena(A,B,C).
::- concatena(A,B,C).
ordenada([]).
ordenada([]).
ordenada
ordenada([]).
([]).
ordenada([_]).
ordenada([_]).
ordenada
ordenada([_]).
([_]).
ordenada([X,
ordenada([X,Y|R
ordenada ([X,Y|R])
([X,
ordenada([X, Y|R])
Y|R
([X,Y|R ]) :-
Y|R]) :-- X=<Y,
::- X=<Y, ordenada([Y|R
ordenada([Y|R]).
ordenada([ Y|R]).
Y|R
ordenada([Y|R
Y|R]).
]).

Exerccio
Exerccio1.1.Ordenao
Ordenaoporporgerao
geraoeeteste
teste
Digite
Digiteeeteste
testeos
ospredicados
predicadosdefinidos
definidosno
noExemplo
Exemplo1.1.
Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 5
Ordenao por trocas (bubble sort)
AAoperao
operaodedetroca
troca
Troca
Trocaas
asposies
posiesde
dedois
doiselementos
elementosconsecutivos
consecutivosque
queestejam
estejamfora
forade
deordem.
ordem.

Para ordenar recursivamente uma lista


L usando trocas:
Encontre um par de elementos L: 46 51 39 17 25
consecutivos X e Y em L que toque
estejam fora de ordem.
Construa uma nova lista N, idntica N : 46 39 51 17 25
a L, exceto pelo fato de que em N o ordene
elemento Y ocorre antes de X.
Ordene recursivamente a lista N, Lo : 17 25 39 46 51
obtendo a lista ordenada Lo.

Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 6


Ordenao por trocas: funcionamento/complexidade
46 17 51 39 25
toque

17 46 51 39 25
toque

17 46 39 51 25
toque

17 39 46 51 25 O(n2)
toque

17 39 46 25 51
toque

17 39 25 46 51
toque

17 25 39 46 51

Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 7


Ordenao por trocas: implementao
Exemplo
Exemplo2.2.Ordenao
Ordenaopor
portrocas
trocas
bs(L,Lo)
bs(L,Lo)
bs (L,Lo) :-
bs(L,Lo) :--
::-
concatena(A,[X,Y|B
concatena(A,[X,Y|B],L),
concatena(A,[X, Y|B],L),
Y|B
concatena(A,[X,Y|B
Y|B],L),
],L),
X>Y,
X>Y, !,
!,
concatena(A,[Y,X|B],N),
concatena(A,[Y,X|B],N),
bs(N,Lo).
bs(N,Lo).
bs
bs(N,Lo).
(N,Lo).
bs(L,L).
bs(L,L).
bs
bs(L,L).
(L,L).
concatena([],B,B).
concatena([],B,B).
concatena
concatena([],B,B).
([],B,B).
concatena([X|A],B,[X|C])
concatena([X|A],B,[X|C])
concatena ([X|A],B,[X|C]) :-
concatena([X|A],B,[X|C]) :-- concatena(A,B,C).
::- concatena(A,B,C).

Exerccio
Exerccio2.2.Ordenao
Ordenaopor portrocas
trocas
Digite
Digiteeeteste
testeos
ospredicados
predicadosdefinidos
definidosno
noExemplo
Exemplo2.2.
Modifique
Modifiqueoopredicado
predicadobs/2 /2para
bs/2
bs
bs/2 paraque
queos
osestados
estadosda
dalista
listasejam
sejamexibidos
exibidosno
novdeo.
vdeo.

Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 8


Ordenao por insero (insertion sort)
AAoperao
operaodedeinsero
insero
Insere
Insereum
umelemento
elementoXXnuma
numalista
listaordenada
ordenadaLL, ,obtendo
obtendouma
umanova
novalista
listaordenada
ordenadaNN. .

L : 46 51 39 17 25 A:
Para ordenar recursivamente uma insere
lista L usando insero: L : 51 39 17 25 A : 46
Comece com uma lista auxiliar insere
A vazia.
L : 39 17 25 A : 46 51
Insira o primeiro elemento de L
insere
em A, obtendo uma nova lista N.
L : 17 25 A : 39 46 51
Insira recursivamente os demais
elementos de L em N, obtendo a insere
lista ordenada Lo. L : 25 A : 17 39 46 51

Complexidade: O(n2) insere

L: A : 17 25 39 46 51

Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 9


Ordenao por insero: implementao
Exemplo
Exemplo3.3.Ordenao
Ordenaopor
porinsero
insero
is([],A,A).
is([],A,A).
is
is([],A,A).
([],A,A).
is([X|R],A,Lo)
is([X|R],A,Lo)
is ([X|R],A,Lo) :-
is([X|R],A,Lo) :-- insere(X,A,N),
::- insere(X,A,N), is(R,N,Lo).
is(R,N,Lo).
insere(X,[],[X]).
insere(X,[],[X]).
insere
insere(X,[],[X]).
(X,[],[X]).
insere(X,[
insere(X,[Y|A
insere (X,[Y|A],[X,
(X,[
insere(X,[ Y|A],[X,Y|A
Y|A
(X,[Y|A ],[X,Y|A])
],[X,
Y|A],[X, Y|A])
Y|A
],[X,Y|A ]) :-
Y|A]) :-- X=<Y,
::- X=<Y, !.
!.
insere(X,[
insere(X,[Y|A
insere (X,[Y|A],[
(X,[
insere(X,[ Y|A],[Y|B
Y|A
(X,[Y|A ],[Y|B])
],[
Y|A],[ Y|B])
Y|B
],[Y|B ]) :-
Y|B]) :-- insere(X,A,B).
::- insere(X,A,B).

Exerccio
Exerccio3.3.Ordenao
Ordenaopor
porinsero
insero
Digite
Digiteos
ospredicados
predicadosdefinidos
definidosno
noExemplo
Exemplo22eeteste
testecom
comaaconsulta:
consulta:
??-- is([46,51,39,17,25],[],Lo).
is([46,51,39,17,25],[],Lo).

Modifique
Modifiqueoopredicado is/2de
predicadois/2 demodo
modoque
queos
osestados
estadosda
dalista
listaAAsejam
sejamexibidos.
exibidos.

Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 10


Ordenao por intercalao (merge sort)
AAoperao
operaode deintercalao
intercalao
Dadas
Dadasduas
duaslistas
listasordenadas
ordenadasAoAoeeBo
Bo, ,aaoperao
operaodedeintercalao
intercalaoconstri
constriuma
umalista
lista
ordenada Lo, ,com
ordenadaLo comelementos
elementosde AoeeBo
deAo Bo, ,em
emtempo
tempoproporcional
proporcionalao
aotamanho
tamanhodedeLo Lo. .

Para ordenar recursivamente uma L: 72 51 65 88 90 46 29 15 37


lista L usando intercalao: separe
Separe os elementos de L em duas
listas A e B; com aproximadamente A : 72 65 90 29 37 B : 51 88 46 15
o mesmo nmero de elementos.
ordene
Ordene recursivamente as listas A
e B, obtendo as respectivas listas Ao : 29 37 65 72 90 Bo : 15 46 51 88
ordenadas Ao e Bo.
intercale
Intercale as listas ordenadas Ao e
Bo, obtendo a lista ordenada Lo. Lo : 15 29 37 46 51 65 72 88 90

Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 11


Ordenao por intercalao: funcionamento/complexidade
72 51 65 88 90 46 29 15 37

72 65 90 29 37 51 88 46 15
lg n
72 90 37 65 29 51 46 88 15

72 37 90 65 29 51 46 88 15

72 37
n
72 37

37 72 90 65 29 51 46 88 15

37 72 90 29 65 46 51 15 88
O(n lg n)
29 37 65 72 90 15 46 51 88

15 29 37 46 51 65 72 88 90
Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 12
Ordenao por intercalao: implementao
Exerccio
Exerccio4.4.Separao
Separaodos doselementos
elementos
Defina
Definaoopredicado separa(L,A,B), ,que
predicadosepara(L,A,B) quesepara
separaos
oselementos
elementosda
dalista
listaLLem
emduas
duas
listas
listasAAeeBB, ,cada
cadauma
umadelas
delascom
comaproximadamente
aproximadamenteoomesmo
mesmonmero
nmerode deelementos.
elementos.
Teste
Testecom
comaaconsulta:
consulta:??-- separa([72,51,65,88,90,46,29,15,37],A,B).
separa([72,51,65,88,90,46,29,15,37],A,B).

Exerccio
Exerccio5.5.Intercalao
Intercalaodosdoselementos
elementos
Defina
Definaoopredicado intercala(Ao,Bo,Lo), ,que
predicadointercala(Ao,Bo,Lo) queintercala
intercalaos
oselementos
elementosdas
daslistas
listas
ordenadas
ordenadasAo AoeeBo
Bopara
paraconstruir
construiruma
umanica
nicalista
listaordenada
ordenadaLoLo. .
Teste
Testecom
comaaconsulta:
consulta:??-- intercala([29,37,65,72,90],[15,46,51,88],Lo).
intercala([29,37,65,72,90],[15,46,51,88],Lo).

Exerccio
Exerccio6.6.Ordenao
Ordenaopor porintercalao
intercalao(merge
(mergesort)
sort)
Defina
Definaoopredicado (L,Lo), ,que
predicadoms(L,Lo)
msms(L,Lo)
ms(L,Lo) quetransforma
transformaaalista
listaLLem
emuma
umalista
listaordenada
ordenada
correspondente
correspondenteLoLo, ,usando
usandooomtodo
mtodode deordenao
ordenaopor porintercalao.
intercalao.
Teste
Testecom
comaaconsulta:
consulta:??-- ms([72,51,65,88,90,46,29,15,37],Lo).
ms([72,51,65,88,90,46,29,15,37],Lo).
ms
ms([72,51,65,88,90,46,29,15,37],Lo).
([72,51,65,88,90,46,29,15,37],Lo).
Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 13
Ordenao por partio (quick sort)
AAoperao
operaode departio
partio
Dada
Dadaumaumalista L=[P|R], ,aaoperao
listaL=[P|R] operaode
departio
partiodistribui
distribuios
oselementos
elementosde deRRem
emduas
duas
listas
listasAAeeBBtais
taisque
queos
oselemento
elementode
deAAsejam
sejammenores
menoresou ouiguais
iguaisaaPPeeos
oselementos
elementosde
de
BBsejam
sejammaiores
maioresquequePP. .

Para ordenar recursivamente uma L: 72 51 65 88 90 46 29 15 37


lista L=[P|R] usando partio:
particione
Particione os elementos de R
em duas listas A e B. A : 51 65 46 29 15 37 B : 88 90
Ordene recursivamente as listas
ordene
A e B, obtendo as respectivas
listas ordenadas Ao e Bo. Ao : 15 29 37 46 51 65 Bo : 88 90
Concatene as listas ordenadas
concatene
Ao e [P|Bo]
P|Bo], obtendo a lista
ordenada Lo. Lo : 15 29 37 46 51 65 72 88 90

Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 14


Ordenao por partio: funcionamento/complexidade
72 51 65 88 90 46 29 15 37

51 65 46 29 15 37 88 90

46 29 15 37 65 90 n

29 15 37

15 37

15 37 n

15 29 37

15 29 37 46 65 90
Pior caso: O(n2)
15 29 37 46 51 65 88 90

15 29 37 46 51 65 72 88 90 Melhor caso: O(n lg n)


Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 15
Ordenao por partio: implementao
Exerccio
Exerccio7.7.Partio
Partiodos
doselementos
elementos
Defina particiona(P,L,A,B), ,que
Definaparticiona(P,L,A,B) queparticiona
particionaaalista
listaLLem
emduas
duaslistas
listasAAeeBBtal
talque
que
os
oselementos
elementosde deAAsejam
sejammenores
menoresou
ouiguais
iguaisaaPPeeos osdedeBBsejam
sejammaiores
maioresque quePP. .
Teste
Testecom
comaaconsulta:
consulta:??-- particiona([72,51,65,88,90,46,29,15,37],A,B).
particiona([72,51,65,88,90,46,29,15,37],A,B).

Exerccio
Exerccio8.8.Concatenao
Concatenaode delistas
listas
Defina concatena(A,B,L), ,que
Definaconcatena(A,B,L) queconcatena
concatenaas
aslistas
listasAAeeBBpara
paraconstruir
construiraalista
listaLL. .
Teste
Testecom
comaaconsulta:
consulta:??-- concatena([15,29,37,46,51,65],[72,88,90],L).
concatena([15,29,37,46,51,65],[72,88,90],L).

Exerccio
Exerccio9.9.Ordenao
Ordenaopor porpartio
partio(quick
(quicksort)
sort)
Defina
Definaoopredicado (L,Lo), ,que
predicadoqs(L,Lo)
qsqs(L,Lo)
qs(L,Lo) quetransforma
transformaaalista
listaLLem
emuma
umalista
listaordenada
ordenada
correspondente
correspondenteLoLo, ,usando
usandooomtodo
mtodode deordenao
ordenaopor porpartio.
partio.
Teste
Testecom
comaaconsulta:
consulta:??-- qs([72,51,65,88,90,46,29,15,37],Lo).
qs([72,51,65,88,90,46,29,15,37],Lo).
qs
qs([72,51,65,88,90,46,29,15,37],Lo).
([72,51,65,88,90,46,29,15,37],Lo).

Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 16


Ordenao topolgica

definio
implementao
Ordenao topolgica
Ordenao
Ordenaotopolgica
topolgica
Uma
Umaordenao
ordenaotopolgica
topolgicade deum umgrafo
grafoacclico G=(V,A)uma
acclicoG=(V,A) umaordem
ordemtotal
totalSSdos
dos
elementos
elementosde
deVVtal
talque
quese
se(v(vi,v,vj))A,
A,ento
entovvi precede
precedevvj em
emS.S.
i j i j

Se G representa uma rede de tarefas, isto : gravata palet cueca

Os elementos de V denotam tarefas


camisa cinto cala
Os elementos de A denotam dependncias
entre tarefas (restries de ordem)
relgio meias sapatos
Ento:
Uma ordenao topolgica de G indica 1 2 3
uma ordem em que as tarefas podem ser
realizadas, sem que as restries de 4 5 6
ordem entre elas sejam violadas
7 8 9

Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 18


Ordenao topolgica: funcionamento

1 2 3

4 5 6

7 8 9

Ordena
Ordenao topol
topolgica: [3, 4, 1, 6, 5, 2, 7, 8, 9]

Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 19


Ordenao topolgica: implementao
Exemplo
Exemplo4.4.Ordenao
Ordenaotopolgica
topolgica
grafo(1,[1,
grafo(1,[1,
grafo (1,[1, 2,
grafo(1,[1, 2, 3,
3, 4,
4, 5,
5, 6,
6, 7,
7, 8,
8, 9],
9],
[1<2,
[1<2, 3<6, 4<1, 4<5, 5<2, 6<5,
3<6, 4<1, 4<5, 5<2, 6<5, 6<9,
6<9, 8<9]).
8<9]).
ordtop(G,S)
ordtop(G,S)
ordtop (G,S) :-
ordtop(G,S) :--
::-
grafo(G,Vs
grafo(G,Vs,As),
grafo(G, Vs,As),
Vs
grafo(G,VsVs,As),
,As),
ordtop(
ordtop((Vs,As,S).
ordtop
ordtop( Vs,As,S).
Vs
Vs,As,S).
,As,S).
ordtop([],_,[]).
ordtop([],_,[]).
ordtop
ordtop([],_,[]).
([],_,[]).
ordtop(
ordtop(Vs,As,[
ordtop (
ordtop( Vs,As,[V|S
Vs ,As,[V|S])
,As,[
Vs,As,[ V|S])
V|S
,As,[V|S ]) :-
V|S]) :--
::-
append(E,[
append(E,[V|D
append (E,[V|D],
(E,[
append(E,[ V|D],Vs
V|D
(E,[V|D ],Vs),
],
V|D], Vs),
Vs
],Vs
Vs),
),
not(
not (
not( member(_<V,As)),
member (_<V,As)),
not(member(_<V,As)),
member(_<V,As)),
append(E,D,
append(E,D,NVs
append (E,D,NVs),
(E,D,
append(E,D, NVs),
NVs
(E,D,NVs
NVs),
),
findall(X<Y,
findall (X<Y,(
(X<Y,
findall(X<Y,
findall(X<Y,( (member(X<Y,As),X
member(X<Y,As),X\
member (X<Y,As),X\\=V),
(X<Y,As),X
(X<Y,(member(X<Y,As),X
(X<Y,As),X\ =V),,NAs),
=V)
=V), NAs),
NAs
NAs),
),
ordtop(
ordtop
ordtop( (NVs,
NVs
ordtop(NVs, , NAs,S).
NAs ,S).
NVs,NAs,S).
NAs,S).

Exerccio
Exerccio10.
10.Ordenao
Ordenaotopolgica
topolgica
Digite
Digiteooprograma
programado
doExemplo
Exemplo44eefaa
faaaaconsulta:
consulta:
??-- ordtop(1,S).
ordtop(1,S).
ordtop
ordtop(1,S).
(1,S).
Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 20
Ordenao topolgica
Exerccio
Exerccio11.
11.Exibio
Exibiode
detodas
todasasassolues
solues
Represente
Representeoografo
grafoaaseguir
seguireefaa
faaaaconsulta
consultaindicada.
indicada.

1 2 3 4

??-- forall(
forall((ordtop(2,S)
forall
forall( ordtop(2,S),
ordtop (2,S),, writeln(S)
(2,S)
ordtop(2,S)
(2,S), writeln(S))
writeln (S)))..
(S)
writeln(S)
(S))

Exerccio
Exerccio12.
12.Ordenao
Ordenaotopolgica
topolgicaversus
versuspermutao
permutao
Quando
Quandono
nohhrestries
restriesde
deordem
ordementre
entreososvrtices
vrticesdodografo,
grafo,aaordenao
ordenaotopolgica
topolgica
funciona
funcionacomo
comopermutao.
permutao.Para
Paraverificar
verificareste
estefato,
fato,represente
representeoografo
grafoaaseguir
seguireefaa
faa
aaconsulta
consultaindicada:
indicada:
1 2 3

??-- forall(
forall((ordtop(3,S)
forall
forall( ordtop(3,S),
ordtop (3,S),, writeln(S)
(3,S)
ordtop(3,S)
(3,S), writeln(S))
writeln (S)))..
(S)
writeln(S)
(S))
Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 21
rvores de busca binria

definio
manipulao
rvores de busca binria

Uma
Umarvore binriaAA
rvorebinria
uma
umaestrutura
estruturacomposta
compostapor
pornnnsnstal
talque
quese n=0,dizemos
sen=0, dizemosqueque R
AAvazia
vazia(representada por##););caso
(representadapor casocontrrio:
contrrio:
existe
existeum
umnnespecial emAAdenominado
especialem denominadoraizraiz
os
osdemais
demaisns deAAso
nsde soorganizados
organizadosem emestruturas
estruturasdisjuntas:
disjuntas:
E D
uma
umasubrvore
subrvorebinria esquerdaEE
binriaesquerda
uma
umasubrvore
subrvorebinria direitaDD
binriadireita

4
Uma
Umarvore
rvorede
debusca binriaAA
buscabinria
umaumarvore
rvorebinria
binriavazia
vaziaou
ouuma
umaestrutura (R,E,D)tal
estruturann(R,E,D) talque:
que: 2 6
todo
todoelemento
elementoememEEmenor
menorououigual
igualaaRR
todo
todoelemento
elementoememDDmaior
maiorque
queRR 1 3 5 7

Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 23


rvore de busca binria
Exemplo
Exemplo5.5.Criao
Criaode
dervore
rvorede
debusca
buscabinria
binria
abb([],A,A).
abb([],A,A).
abb
abb([],A,A).
([],A,A).
abb([
abb([X|Xs
abb ([X|Xs],A,A2)
([
abb([ X|Xs],A,A2)
X|Xs
([X|Xs ],A,A2) :-
X|Xs],A,A2) :-- ins(X,A,A1),
::- ins(X,A,A1), abb(Xs
abb(Xs,A1,A2).
abb( Xs,A1,A2).
Xs
abb(Xs
Xs,A1,A2).
,A1,A2).
ins(X,#,n
ins(X,#,n
ins (X,#,n(X,#,#)).
(X,#,n
ins(X,#,n
(X,#,n (X,#,#)).
ins(X,n
ins(X,n
ins (X,n(R,E,D),n
(X,n
ins(X,n
(X,n (R,E,D),n(R,N,D))
(R,E,D),n
(R,E,D),n (R,N,D)) :-
:-- X=<R,
::- X=<R, !,
!, ins(X,E,N).
ins(X,E,N).
ins
ins(X,E,N).
(X,E,N).
ins(X,n
ins(X,n
ins (X,n(R,E,D),n
(X,n
ins(X,n
(X,n (R,E,D),n(R,E,N))
(R,E,D),n
(R,E,D),n (R,E,N)) :-
:-- ins(X,D,N).
::- ins(X,D,N).
ins
ins(X,D,N).
(X,D,N).

Exerccio
Exerccio13.
13.Criao
Criaode
dervore
rvorede debusca
buscabinria
binria
Digite
Digiteooprograma
programadodoExemplo
Exemplo5,5,faa
faaaaconsulta
consultaaaseguir
seguireedesenhe
desenheaarvore
rvoreobtida:
obtida:
??-- abb([3,5,1,0,4,2],A).
abb([3,5,1,0,4,2],A).

Exerccio
Exerccio14.
14.Exibio
Exibiodedervore
rvorede
debusca
buscabinria
binria
Complete
Completeooprograma
programadodoExemplo
Exemplo55com
comumumpredicado
predicadopara
paraexibir
exibiros
oselementos
elementosde
de
uma
umarvore
rvorede
debusca
buscabinria
binriaem
emordem
ordemcrescente.
crescente.
Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 24
Cdigo de Huffman

definio
implementao
Cdigo de Huffman
OOcdigo
cdigodedeHuffman
Huffman
para
paraum
umtexto
textoTTuma
umaatribuio
atribuiodedecdigos
cdigosbinrios
binriosaos
aoscaracteres
caracteresde
deTTque
que
minimiza
minimizaoonmero
nmeromdio
mdiodedebits
bitspor
porcaractere.
caractere.

Para obter os cdigos de Huffman para Exemplo


os caracteres de um texto T: Exemplo6.6.Cdigos
Cdigosde
deHuffman
Huffman
Obtenha as frequncias dos Texto:
Texto:MARMELADA
MARMELADA
caracteres em T .
Crie uma floresta contendo uma 9
rvore unitria com a frequncia 0 1
de cada um dos caracteres.
4
Juntes as rvores de menores 0 1
frequncias, duas a duas, at que
seja obtida uma nica rvore. 2 2 5
Associe um bit 0 s subrvores 0 1 0 1 0 1
esquerdas e um bit 1 s
1 1 1 1 2 3
subrvores direitas.
D E L R M A

Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 26


Cdigo de Huffman
Exemplo
Exemplo6.6.Frequncia
Frequnciados
doscaracteres
caracteres
freq([],F1,F2)
freq([],F1,F2)
freq ([],F1,F2) :-
freq([],F1,F2) :-- !,
::- !, sort(F1,F2).
sort(F1,F2).
freq([
freq([S|Ss
freq ([S|Ss],F1,F3)
([
freq([ S|Ss],F1,F3)
S|Ss
([S|Ss ],F1,F3) :-
S|Ss],F1,F3) :-- ins(S,F1,F2),
::- ins(S,F1,F2), freq(Ss
freq(Ss,F2,F3).
freq( Ss,F2,F3).
Ss
freq(Ss
Ss,F2,F3).
,F2,F3).
ins(X,[],[n
ins(X,[],[n
ins (X,[],[n(1,X,#,#)])
(X,[],[n
ins(X,[],[n
(X,[],[n (1,X,#,#)]) :-
:-- !.
::- !.
ins(X,[n
ins(X,[n
ins (X,[n(F,X,#,#)|R],[n
(X,[n
ins(X,[n
(X,[n (F,X,#,#)|R],[n(G,X,#,#)|R])
(F,X,#,#)|R],[n
(F,X,#,#)|R],[n (G,X,#,#)|R]) :-
:-- !,
::- !, GG is
is F+1.
F+1.
ins(X,[n
ins(X,[n
ins (X,[n(F,Y,#,#)|R],[n
(X,[n
ins(X,[n
(X,[n (F,Y,#,#)|R],[n(F,Y,#,#)|N])
(F,Y,#,#)|R],[n
(F,Y,#,#)|R],[n (F,Y,#,#)|N]) :-
:-- ins(X,R,N).
::- ins(X,R,N).

Exerccio
Exerccio15.
15.Frequncia
Frequnciados
doscaracteres
caracteres
Digite
Digiteooprograma
programado
doExemplo
Exemplo66eefaa
faaas
asconsultas
consultasaaseguir:
seguir:
??-- atom_chars(marmelada,S).
atom_chars(marmelada,S).
atom_chars
atom_chars(marmelada,S).
(marmelada,S).
??-- atom_chars(marmelada,S),
atom_chars(marmelada,S),
atom_chars (marmelada,S), freq(S,[],F).
atom_chars(marmelada,S), freq(S,[],F).
freq
freq(S,[],F).
(S,[],F).

Note
Noteque
queaalista
listade
defrequncias
frequnciasdos
doscaracteres
caracteresFFuma
umafloresta!
floresta!
Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 27
Cdigo de Huffman
Exemplo
Exemplo7.7.Construo
Construoda
darvore
rvorede
deHuffman
Huffman
arvhuf([A],A)
arvhuf([A],A)
arvhuf ([A],A) :-
arvhuf([A],A) :--
::-
!!..
arvhuf([A1,A2|A],B)
arvhuf([A1,A2|A],B)
arvhuf ([A1,A2|A],B) :-
arvhuf([A1,A2|A],B) :--
::-
A1
A1 == nn(F1,_,_,_),
nn (F1,_,_,_),
A2 =
A2 = nn
n (F2,_,_,_),
n(F2,_,_,_),
F3
F3 isis F1F1 ++ F2,
F2,
sort([n
sort([n
sort ([n(F3,-
([n
sort([n([n (F3,--,A1,A2)|A],As),
(F3,
(F3,- ,A1,A2)|A],As),
arvhuf(As,B).
arvhuf(As,B).
arvhuf
arvhuf(As,B).
(As,B).

Exerccio
Exerccio15.
15.Construo
Construoda
darvore
rvorededeHuffman
Huffman
Digite
Digiteooprograma
programado
doExemplo
Exemplo77eefaa
faaas
asconsultas
consultasaaseguir:
seguir:
??-- atom_chars(marmelada,S),
atom_chars(marmelada,S),
atom_chars (marmelada,S), freq(S,[],F),
atom_chars(marmelada,S), freq(S,[],F),
freq (S,[],F), arvhuf(F,A).
freq(S,[],F), arvhuf(F,A).

Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 28


Cdigo de Huffman
Exemplo
Exemplo8.8.Exibio
Exibiodos
doscdigos
cdigos
ccdigos(n
digos(n
digos (n(_,S,#,#),C)
(n
digos(n(n (_,S,#,#),C) :-
:--
::-
!!,, reverse(C,R),
reverse(C,R),
reverse (C,R), atom_chars(A,R),
reverse(C,R), atom_chars(A,R),
atom_chars (A,R), writeln(S
atom_chars(A,R), writeln(S
writeln (S :: A).
writeln(S A).
ccdigos(n
digos(n
digos (n(_,_,E,D),C)
(n
digos(n(n (_,_,E,D),C) :-
:--
::-
ccdigos(E,['0'|C]),
digos(E,['0'|C]), c cdigos(D,['1'|C]).
cc digos(D,['1'|C]).

Exerccio
Exerccio16.
16.Exibio
Exibiodos
doscdigos
cdigos
Digite
Digiteooprograma
programadodoExemplo
Exemplo88eefaa
faaas
asconsultas
consultasaaseguir:
seguir:
??-- atom_chars(marmelada,S),
atom_chars
atom_chars(marmelada,S),
(marmelada,S), freq(S,[],
atom_chars(marmelada,S), freq
freq(S,[],F),
(S,[],F),
(S,[],
freq(S,[], F), arvhuf(F,A),
(S,[],F), arvhuf(F,A), c
cc
cdigos(A,[]).
digos(A,[]).

Exerccio
Exerccio17.
17.Programa
Programaprincipal
principal
Defina
Definaoopredicado (T), ,que
predicadohuf(T)
huf(T)
huf
huf(T) queexibe
exibeos
oscdigos
cdigosde
deHuffman
Huffmanpara
paraootexto
textoTT: :
??-- huf(
huf(MARMELADA
MARMELADA'').
).

Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 29


Bnus: interface grfica
:- use_module(
use_module(library(tabular)).
library(tabular)).

huf :-
new(F,frame('C
new(F,frame('C
(F,frame('Cdigos de Huffman')),
send(F,
send(F,append
(F,append,
append,new(D,
new(D,dialog
(D,dialog)),
dialog)),
send(D,
send(D,above
(D,above,
above,new(P,
new(P,picture
(P,picture)),
picture)),
send(P,
send(P,size
(P,size,
size,size(210,100)),
size(210,100)),
send(P,display,
send(P,display,new
(P,display,new(T,tabular)),
new(T,tabular)),
send(T,
send(T,border
(T,border,1),
border,1),
send(T,
send(T,rules
(T,rules,
rules,all),
all),
send(D,
send(D,append
(D,append,
append,new(I,
new(I,text_item
(I,text_item(texto))),
text_item(texto))),
send(D,
send(D,append
(D,append,
append,button(
button(ok,
ok,and(
and(and(
and(message(T,
message(T,clear
(T,clear),
clear),
message(@
message(@prolog
(@prolog,
prolog,huf,T,I
huf,T,I?
,T,I?selection)),
selection)),
message(I,
message(I,clear
(I,clear)))),
clear)))),
send(D,
send(D,append
(D,append,
append,button(sair,
button(sair,message
(sair,message(F,
message(F,destroy
(F,destroy))),
destroy))),
send(F,open).
send(F,open).

Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 30


Bnus: interface grfica
huf(T,I)
huf(T,I) :-
:-
atom_chars(I,L),
atom_chars(I,L),
freq(L,[],F),
freq(L,[],F),
arvhuf(F,A),
arvhuf(F,A),
cdigos(T,A,[]).

freq([],F1,F2)
freq([],F1,F2) :-
:-
!,
sort(F1,F2).
sort(F1,F2).
freq([
freq([S|Ss
([S|Ss],F1,F3)
S|Ss],F1,F3) :-
:-
ins(S,F1,F2),
ins(S,F1,F2),
freq(
freq(Ss,F2,F3).
Ss,F2,F3).

ins(X,[],[n
ins(X,[],[n
(X,[],[n(1,X,#,#)]) :-
:- !.
ins(X,[n
ins(X,[n
(X,[n(F,X,#,#)|R],[n
(F,X,#,#)|R],[n(G,X,#,#)|R]) :
:-
- !, G is F+1.
ins(X,[n
ins(X,[n
(X,[n(F,Y,#,#)|R],[n
(F,Y,#,#)|R],[n(F,Y,#,#)|N]) :-
:- ins
ins(X,R,N).
(X,R,N).

Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 31


Bnus: interface grfica
arvhuf([A],A)
arvhuf([A],A) :-
:- !.
arvhuf([A1,A2|A],B)
arvhuf([A1,A2|A],B) :-
:-
A1 = n
n(F1,_,_,_),
A2 = n
n(F2,_,_,_),
F3 is F1+F2,
sort([n
sort([n
([n(F3,-
(F3,-,A1,A2)|A],As),
arvhuf(As,B).
arvhuf(As,B).
cdigos(T,n
digos(T,n
(T,n(_,S,#,#),C) :-
:- !,
reverse(C,CR),
reverse(C,CR),
atom_chars(A,CR),
atom_chars(A,CR),
send(T,
send(T,append
(T,append,S,
append,S,bold
,S,bold,
bold,left,
left,colspan:=
colspan:=1),
:=1),
send(T,
send(T,append
(T,append,A,
append,A,bold
,A,bold,
bold,left,
left,colspan:=
colspan:=1),
:=1),
send(T,
send(T,next_row
(T,next_row).
next_row).
cdigos(T,n
digos(T,n
(T,n(_,_,E,D),C) :-
:-
cdigos(T,E,['0'|C]),
cdigos(T,D,['1'|C]).
Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 32
Fim