Transcript
Page 1: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação

Aplicações de recursividade

Prof. Dr. Silvio do Lago PereiraDepartamento de Tecnologia da Informação

Faculdade de Tecnologia de São Paulo

Page 2: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação

Aplicações de recursividade

Nesta aula, veremos algumas

aplicações de recursividade em:

Ordenação de dados

Ordenação topológica

Árvores de busca binária

72 51 65 88 90 46 29 15 37

72 65 90 29 37 51 88 46 15

72 90 37 65 29 51 46 88 15

72 37 90 65 29 51 46 88 15

72 37

37 72

46 51 15 88

72 37

90 65 29 51 46 88 15

29 6537 72 90

lg n

n

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

Código de Huffman46 51 15 88

15 46 51 88

15 29 37 46 51 65 72 88 90

29 6537 72 90

29 37 65 72 90

1 2 3

4 5 6

7 8 9

62

1 3 5 7

4

1

DDDD

1

EEEE

1

LLLL

1

RRRR

2

MMMM

3

AAAA

2 2 5

4

90

0

0 0 0

1

1

1 11

Page 3: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação

Ordenação de dados

ordenação por geração e testeordenação por trocas

ordenação por inserçãoordenação por intercalação

ordenação por partição

Page 4: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação

Ordenação por geração e teste (permutation sort)

A operação de geração (ou permutação)A operação de geração (ou permutação)

Constrói uma permutação PPPP de uma lista LLLL.Constrói uma permutação PPPP de uma lista LLLL.

A operação de testeA operação de teste

Verifica se uma permutação PPPP está ordenada.Verifica se uma permutação PPPP está ordenada.

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

Para ordenar LLLL por tentativa e erro:

Gere uma permutação PPPP de LLLL.

Teste se PPPP está ordenada.

Complexidade de tempo: O(n.n!)

Muito ineficiente para ser usada em aplicações práticas!

3 1 2L :

3 1 2P1 :

3 2 1

1 3 2

1 2 3

P2 :

P3 :

P4 :

Page 5: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação

Ordenação por geração e teste: implementação

Exemplo 1. Ordenação por geração e testeExemplo 1. Ordenação por geração e teste

pspspsps(L,P) :(L,P) :(L,P) :(L,P) :---- permuta(L,P), ordenada(P).permuta(L,P), ordenada(P).permuta(L,P), ordenada(P).permuta(L,P), ordenada(P).

permutapermutapermutapermuta([],[]).([],[]).([],[]).([],[]).

permutapermutapermutapermuta(L,[(L,[(L,[(L,[X|PX|PX|PX|P]) :]) :]) :]) :---- exclui(X,L,R), permuta(R,P).exclui(X,L,R), permuta(R,P).exclui(X,L,R), permuta(R,P).exclui(X,L,R), permuta(R,P).

excluiexcluiexcluiexclui(X,L,R) :(X,L,R) :(X,L,R) :(X,L,R) :---- concatena(A,[concatena(A,[concatena(A,[concatena(A,[X|BX|BX|BX|B],L), concatena(A,B,R).],L), concatena(A,B,R).],L), concatena(A,B,R).],L), concatena(A,B,R).

concatenaconcatenaconcatenaconcatena([],B,B).([],B,B).([],B,B).([],B,B).

pspspsps(L,P) :(L,P) :(L,P) :(L,P) :---- permuta(L,P), ordenada(P).permuta(L,P), ordenada(P).permuta(L,P), ordenada(P).permuta(L,P), ordenada(P).

permutapermutapermutapermuta([],[]).([],[]).([],[]).([],[]).

permutapermutapermutapermuta(L,[(L,[(L,[(L,[X|PX|PX|PX|P]) :]) :]) :]) :---- exclui(X,L,R), permuta(R,P).exclui(X,L,R), permuta(R,P).exclui(X,L,R), permuta(R,P).exclui(X,L,R), permuta(R,P).

excluiexcluiexcluiexclui(X,L,R) :(X,L,R) :(X,L,R) :(X,L,R) :---- concatena(A,[concatena(A,[concatena(A,[concatena(A,[X|BX|BX|BX|B],L), concatena(A,B,R).],L), concatena(A,B,R).],L), concatena(A,B,R).],L), concatena(A,B,R).

concatenaconcatenaconcatenaconcatena([],B,B).([],B,B).([],B,B).([],B,B).

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

concatenaconcatenaconcatenaconcatena([],B,B).([],B,B).([],B,B).([],B,B).

concatenaconcatenaconcatenaconcatena([([([([X|AX|AX|AX|A],B,[],B,[],B,[],B,[X|CX|CX|CX|C]) :]) :]) :]) :---- concatena(A,B,C).concatena(A,B,C).concatena(A,B,C).concatena(A,B,C).

ordenadaordenadaordenadaordenada([]).([]).([]).([]).

ordenadaordenadaordenadaordenada([_]).([_]).([_]).([_]).

ordenadaordenadaordenadaordenada([X,([X,([X,([X,Y|RY|RY|RY|R]) :]) :]) :]) :---- X=<Y, ordenada([X=<Y, ordenada([X=<Y, ordenada([X=<Y, ordenada([Y|RY|RY|RY|R]). ]). ]). ]).

concatenaconcatenaconcatenaconcatena([],B,B).([],B,B).([],B,B).([],B,B).

concatenaconcatenaconcatenaconcatena([([([([X|AX|AX|AX|A],B,[],B,[],B,[],B,[X|CX|CX|CX|C]) :]) :]) :]) :---- concatena(A,B,C).concatena(A,B,C).concatena(A,B,C).concatena(A,B,C).

ordenadaordenadaordenadaordenada([]).([]).([]).([]).

ordenadaordenadaordenadaordenada([_]).([_]).([_]).([_]).

ordenadaordenadaordenadaordenada([X,([X,([X,([X,Y|RY|RY|RY|R]) :]) :]) :]) :---- X=<Y, ordenada([X=<Y, ordenada([X=<Y, ordenada([X=<Y, ordenada([Y|RY|RY|RY|R]). ]). ]). ]).

Exercício 1. Ordenação por geração e testeExercício 1. Ordenação por geração e teste

Digite e teste os predicados definidos no Exemplo 1.Digite e teste os predicados definidos no Exemplo 1.

Page 6: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação

Ordenação por trocas (bubble sort)

A operação de trocaA operação de troca

Troca as posições de dois elementos consecutivos que estejam fora de ordem.Troca as posições de dois elementos consecutivos que estejam fora de ordem.

Para ordenar recursivamente uma lista LLLL usando trocas:

Encontre um par de elementos 46 51 39 17 25L :

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

Encontre um par de elementos consecutivos XXXX e YYYY em LLLL que estejam fora de ordem.

Construa uma nova lista NNNN, idêntica a LLLL, exceto pelo fato de que em NNNN o elemento YYYY ocorre antes de XXXX.

Ordene recursivamente a lista NNNN, obtendo a lista ordenada LoLoLoLo.

46 51 39 17 25

46 39 51 17 25

17 25 39 46 51

toque

ordene

N :

Lo :

Page 7: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação

Ordenação por trocas: funcionamento/complexidade

46 17 51 39 25

17 46 51 39 25

toque

17 46 39 51 25

toque

toque

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

17 39 46 51 25

17 39 46 25 51

toque

17 39 25 46 51

toque

17 25 39 46 51

toque

O(n2)

Page 8: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação

Ordenação por trocas: implementação

Exemplo 2. Ordenação por trocasExemplo 2. Ordenação por trocas

bsbsbsbs(L,(L,(L,(L,LoLoLoLo) :) :) :) :----

concatena(A,[X,concatena(A,[X,concatena(A,[X,concatena(A,[X,Y|BY|BY|BY|B],L),],L),],L),],L),

X>Y, !,X>Y, !,X>Y, !,X>Y, !,

concatena(A,[Y,concatena(A,[Y,concatena(A,[Y,concatena(A,[Y,X|BX|BX|BX|B],N),],N),],N),],N),

bsbsbsbs(N,(N,(N,(N,LoLoLoLo).).).).

bsbsbsbs(L,L).(L,L).(L,L).(L,L).

bsbsbsbs(L,(L,(L,(L,LoLoLoLo) :) :) :) :----

concatena(A,[X,concatena(A,[X,concatena(A,[X,concatena(A,[X,Y|BY|BY|BY|B],L),],L),],L),],L),

X>Y, !,X>Y, !,X>Y, !,X>Y, !,

concatena(A,[Y,concatena(A,[Y,concatena(A,[Y,concatena(A,[Y,X|BX|BX|BX|B],N),],N),],N),],N),

bsbsbsbs(N,(N,(N,(N,LoLoLoLo).).).).

bsbsbsbs(L,L).(L,L).(L,L).(L,L).

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

concatenaconcatenaconcatenaconcatena([],B,B).([],B,B).([],B,B).([],B,B).

concatenaconcatenaconcatenaconcatena([([([([X|AX|AX|AX|A],B,[],B,[],B,[],B,[X|CX|CX|CX|C]) :]) :]) :]) :---- concatena(A,B,C).concatena(A,B,C).concatena(A,B,C).concatena(A,B,C).

concatenaconcatenaconcatenaconcatena([],B,B).([],B,B).([],B,B).([],B,B).

concatenaconcatenaconcatenaconcatena([([([([X|AX|AX|AX|A],B,[],B,[],B,[],B,[X|CX|CX|CX|C]) :]) :]) :]) :---- concatena(A,B,C).concatena(A,B,C).concatena(A,B,C).concatena(A,B,C).

Exercício 2. Ordenação por trocasExercício 2. Ordenação por trocas

Digite e teste os predicados definidos no Exemplo 2.

Modifique o predicado bs/2bs/2bs/2bs/2 para que os estados da lista sejam exibidos no vídeo.

Digite e teste os predicados definidos no Exemplo 2.

Modifique o predicado bs/2bs/2bs/2bs/2 para que os estados da lista sejam exibidos no vídeo.

Page 9: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação

Ordenação por inserção (insertion sort)

A operação de inserçãoA operação de inserção

Insere um elemento XXXX numa lista ordenada LLLL, obtendo uma nova lista ordenada NNNN.Insere um elemento XXXX numa lista ordenada LLLL, obtendo uma nova lista ordenada NNNN.

Para ordenar recursivamente uma lista LLLL usando inserção:

Comece com uma lista auxiliar AAAA

46 51 39 17 25

insere

L : A :

4651 39 17 25L : A :

insere

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

Comece com uma lista auxiliar AAAAvazia.Insira o primeiro elemento de LLLLem AAAA, obtendo uma nova lista NNNN.Insira recursivamente os demais elementos de LLLL em NNNN, obtendo a lista ordenada LoLoLoLo.

Complexidade: O(n2)

insere

46 5139 17 25L : A :

insere

46 513917 25L : A :

insere

46 51391725L : A :

insere

46 513917 25L : A :

Page 10: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação

Ordenação por inserção: implementação

Exemplo 3. Ordenação por inserçãoExemplo 3. Ordenação por inserção

isisisis([],A,A).([],A,A).([],A,A).([],A,A).

isisisis([([([([X|RX|RX|RX|R],A,],A,],A,],A,LoLoLoLo) :) :) :) :---- insere(X,A,N), is(R,N,insere(X,A,N), is(R,N,insere(X,A,N), is(R,N,insere(X,A,N), is(R,N,LoLoLoLo).).).).

insereinsereinsereinsere(X,[],[X]).(X,[],[X]).(X,[],[X]).(X,[],[X]).

insereinsereinsereinsere(X,[(X,[(X,[(X,[Y|AY|AY|AY|A],[X,],[X,],[X,],[X,Y|AY|AY|AY|A]) :]) :]) :]) :---- X=<Y, !.X=<Y, !.X=<Y, !.X=<Y, !.

insereinsereinsereinsere(X,[(X,[(X,[(X,[Y|AY|AY|AY|A],[],[],[],[Y|BY|BY|BY|B]) :]) :]) :]) :---- insere(X,A,B).insere(X,A,B).insere(X,A,B).insere(X,A,B).

isisisis([],A,A).([],A,A).([],A,A).([],A,A).

isisisis([([([([X|RX|RX|RX|R],A,],A,],A,],A,LoLoLoLo) :) :) :) :---- insere(X,A,N), is(R,N,insere(X,A,N), is(R,N,insere(X,A,N), is(R,N,insere(X,A,N), is(R,N,LoLoLoLo).).).).

insereinsereinsereinsere(X,[],[X]).(X,[],[X]).(X,[],[X]).(X,[],[X]).

insereinsereinsereinsere(X,[(X,[(X,[(X,[Y|AY|AY|AY|A],[X,],[X,],[X,],[X,Y|AY|AY|AY|A]) :]) :]) :]) :---- X=<Y, !.X=<Y, !.X=<Y, !.X=<Y, !.

insereinsereinsereinsere(X,[(X,[(X,[(X,[Y|AY|AY|AY|A],[],[],[],[Y|BY|BY|BY|B]) :]) :]) :]) :---- insere(X,A,B).insere(X,A,B).insere(X,A,B).insere(X,A,B).

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

Exercício 3. Ordenação por inserçãoExercício 3. Ordenação por inserção

Digite os predicados definidos no Exemplo 2 e teste com a consulta:

????---- is([46,51,39,17,25],[],Lo).is([46,51,39,17,25],[],Lo).is([46,51,39,17,25],[],Lo).is([46,51,39,17,25],[],Lo).

Modifique o predicado is/2is/2is/2is/2 de modo que os estados da lista AAAA sejam exibidos.

Digite os predicados definidos no Exemplo 2 e teste com a consulta:

????---- is([46,51,39,17,25],[],Lo).is([46,51,39,17,25],[],Lo).is([46,51,39,17,25],[],Lo).is([46,51,39,17,25],[],Lo).

Modifique o predicado is/2is/2is/2is/2 de modo que os estados da lista AAAA sejam exibidos.

Page 11: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação

Ordenação por intercalação (merge sort)

A operação de intercalaçãoA operação de intercalação

Dadas duas listas ordenadas AoAoAoAo e BoBoBoBo, a operação de intercalação constrói uma lista ordenada LoLoLoLo, com elementos de AoAoAoAo e BoBoBoBo, em tempo proporcional ao tamanho de LoLoLoLo.Dadas duas listas ordenadas AoAoAoAo e BoBoBoBo, a operação de intercalação constrói uma lista ordenada LoLoLoLo, com elementos de AoAoAoAo e BoBoBoBo, em tempo proporcional ao tamanho de LoLoLoLo.

Para ordenar recursivamente uma lista LLLL usando intercalação:

72 51 65 88 90 46 29 15 37

separe

L :

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

lista usando intercalação:Separe os elementos de LLLL em duas listas AAAA e BBBB; com aproximadamente o mesmo número de elementos.

Ordene recursivamente as listas AAAAe BBBB, obtendo as respectivas listas ordenadas AoAoAoAo e BoBoBoBo.

Intercale as listas ordenadas AoAoAoAo e BoBoBoBo, obtendo a lista ordenada LoLoLoLo.

72 65 90 29 37 51 88 46 15

29 37 65 72 90 15 46 51 88

15 29 37 46 51 65 72 88 90

separe

ordene

intercale

A : B :

Ao : Bo :

Lo :

Page 12: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação

Ordenação por intercalação: funcionamento/complexidade

72 51 65 88 90 46 29 15 37

72 65 90 29 37 51 88 46 15

72 90 37 65 29 51 46 88 15

72 37 90 65 29 51 46 88 15

72 37

lg n

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

72 37

37 72

46 51 15 88

15 46 51 88

15 29 37 46 51 65 72 88 90

72 37

90 65 29 51 46 88 15

29 6537 72 90

29 37 65 72 90

n

O(n lg n)

Page 13: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação

Ordenação por intercalação: implementação

Exercício 4. Separação dos elementosExercício 4. Separação dos elementos

Defina o predicado separa(L,A,B)separa(L,A,B)separa(L,A,B)separa(L,A,B), que separa os elementos da lista LLLL em duas listas AAAA e BBBB, cada uma delas com aproximadamente o mesmo número de elementos.Teste com a 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).separa([72,51,65,88,90,46,29,15,37],A,B).separa([72,51,65,88,90,46,29,15,37],A,B).

Defina o predicado separa(L,A,B)separa(L,A,B)separa(L,A,B)separa(L,A,B), que separa os elementos da lista LLLL em duas listas AAAA e BBBB, cada uma delas com aproximadamente o mesmo número de elementos.Teste com a 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).separa([72,51,65,88,90,46,29,15,37],A,B).separa([72,51,65,88,90,46,29,15,37],A,B).

Exercício 5. Intercalação dos elementosExercício 5. Intercalação dos elementos

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

Defina o predicado intercala(Ao,Bo,Lo)intercala(Ao,Bo,Lo)intercala(Ao,Bo,Lo)intercala(Ao,Bo,Lo), que intercala os elementos das listas ordenadas AoAoAoAo e BoBoBoBo para construir uma única lista ordenada LoLoLoLo.Teste com a consulta: ????---- intercala([29,37,65,72,90],[15,46,51,88],Lo).intercala([29,37,65,72,90],[15,46,51,88],Lo).intercala([29,37,65,72,90],[15,46,51,88],Lo).intercala([29,37,65,72,90],[15,46,51,88],Lo).

Defina o predicado intercala(Ao,Bo,Lo)intercala(Ao,Bo,Lo)intercala(Ao,Bo,Lo)intercala(Ao,Bo,Lo), que intercala os elementos das listas ordenadas AoAoAoAo e BoBoBoBo para construir uma única lista ordenada LoLoLoLo.Teste com a consulta: ????---- intercala([29,37,65,72,90],[15,46,51,88],Lo).intercala([29,37,65,72,90],[15,46,51,88],Lo).intercala([29,37,65,72,90],[15,46,51,88],Lo).intercala([29,37,65,72,90],[15,46,51,88],Lo).

Exercício 6. Ordenação por intercalação (merge sort)Exercício 6. Ordenação por intercalação (merge sort)

Defina o predicado ms(L,Lo)ms(L,Lo)ms(L,Lo)ms(L,Lo), que transforma a lista LLLL em uma lista ordenada correspondente LoLoLoLo, usando o método de ordenação por intercalação.Teste com a consulta: ????---- ms([72,51,65,88,90,46,29,15,37],Lo).ms([72,51,65,88,90,46,29,15,37],Lo).ms([72,51,65,88,90,46,29,15,37],Lo).ms([72,51,65,88,90,46,29,15,37],Lo).

Defina o predicado ms(L,Lo)ms(L,Lo)ms(L,Lo)ms(L,Lo), que transforma a lista LLLL em uma lista ordenada correspondente LoLoLoLo, usando o método de ordenação por intercalação.Teste com a consulta: ????---- ms([72,51,65,88,90,46,29,15,37],Lo).ms([72,51,65,88,90,46,29,15,37],Lo).ms([72,51,65,88,90,46,29,15,37],Lo).ms([72,51,65,88,90,46,29,15,37],Lo).

Page 14: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação

Ordenação por partição (quick sort)

A operação de partiçãoA operação de partição

Dada uma lista L=[L=[L=[L=[P|RP|RP|RP|R]]]], a operação de partição distribui os elementos de RRRR em duas listas AAAA e BBBB tais que os elementos de AAAA sejam menores ou iguais a PPPP e os elementos de BBBB sejam maiores que PPPP.

Dada uma lista L=[L=[L=[L=[P|RP|RP|RP|R]]]], a operação de partição distribui os elementos de RRRR em duas listas AAAA e BBBB tais que os elementos de AAAA sejam menores ou iguais a PPPP e os elementos de BBBB sejam maiores que PPPP.

Para ordenar recursivamente uma lista L=[P|R]L=[P|R]L=[P|R]L=[P|R] usando partição:

L : 72 51 65 88 90 46 29 15 37

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

lista L=[P|R]L=[P|R]L=[P|R]L=[P|R] usando partição:Particione os elementos de RRRRem duas listas AAAA e BBBB.Ordene recursivamente as listas AAAA e BBBB, obtendo as respectivas listas ordenadas AoAoAoAo e BoBoBoBo.Concatene as listas ordenadas AoAoAoAo e [P|Bo][P|Bo][P|Bo][P|Bo], obtendo a lista ordenada LoLoLoLo.

Bo :Ao :

B :51 65 46 29 15 88 9037

15 29 37 46 51 88 9065

15 29 37 46 51 65 72 88 90

particione

ordene

concatene

A :

Lo :

Page 15: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação

Ordenação por partição: 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

15 37

29 15 37

n

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

15 37

88 90

15 29 37 46 51 65 72 88 90

15 37

65

15 29 37

15 29 37 46

15 29 37 46 51 65

90

n

Pior caso: O(n2)

Melhor caso: O(n lg n)

Page 16: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação

Ordenação por partição: implementação

Exercício 7. Partição dos elementosExercício 7. Partição dos elementos

Defina particionaparticionaparticionaparticiona(P,L,A,B)(P,L,A,B)(P,L,A,B)(P,L,A,B), que particiona a lista LLLL em duas listas AAAA e BBBB tal que os elementos de A sejam menores ou iguais a PPPP e os de BBBB sejam maiores que PPPP.Teste com a consulta: ????---- particionaparticionaparticionaparticiona(72,[51,65,88,90,46,29,15,37],A,B).(72,[51,65,88,90,46,29,15,37],A,B).(72,[51,65,88,90,46,29,15,37],A,B).(72,[51,65,88,90,46,29,15,37],A,B).

Defina particionaparticionaparticionaparticiona(P,L,A,B)(P,L,A,B)(P,L,A,B)(P,L,A,B), que particiona a lista LLLL em duas listas AAAA e BBBB tal que os elementos de A sejam menores ou iguais a PPPP e os de BBBB sejam maiores que PPPP.Teste com a consulta: ????---- particionaparticionaparticionaparticiona(72,[51,65,88,90,46,29,15,37],A,B).(72,[51,65,88,90,46,29,15,37],A,B).(72,[51,65,88,90,46,29,15,37],A,B).(72,[51,65,88,90,46,29,15,37],A,B).

Exercício 8. Concatenação de listasExercício 8. Concatenação de listas

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

Defina concatena(A,B,L)concatena(A,B,L)concatena(A,B,L)concatena(A,B,L), que concatena as listas AAAA e BBBB para construir a lista LLLL.Teste com a consulta: ????---- concatena([15,29,37,46,51,65],[72,88,90],L).concatena([15,29,37,46,51,65],[72,88,90],L).concatena([15,29,37,46,51,65],[72,88,90],L).concatena([15,29,37,46,51,65],[72,88,90],L).

Defina concatena(A,B,L)concatena(A,B,L)concatena(A,B,L)concatena(A,B,L), que concatena as listas AAAA e BBBB para construir a lista LLLL.Teste com a consulta: ????---- concatena([15,29,37,46,51,65],[72,88,90],L).concatena([15,29,37,46,51,65],[72,88,90],L).concatena([15,29,37,46,51,65],[72,88,90],L).concatena([15,29,37,46,51,65],[72,88,90],L).

Exercício 9. Ordenação por partição (quick sort)Exercício 9. Ordenação por partição (quick sort)

Defina o predicado qs(L,Lo)qs(L,Lo)qs(L,Lo)qs(L,Lo), que transforma a lista LLLL em uma lista ordenada correspondente LoLoLoLo, usando o método de ordenação por partição.Teste com a consulta: ????---- qs([72,51,65,88,90,46,29,15,37],Lo).qs([72,51,65,88,90,46,29,15,37],Lo).qs([72,51,65,88,90,46,29,15,37],Lo).qs([72,51,65,88,90,46,29,15,37],Lo).

Defina o predicado qs(L,Lo)qs(L,Lo)qs(L,Lo)qs(L,Lo), que transforma a lista LLLL em uma lista ordenada correspondente LoLoLoLo, usando o método de ordenação por partição.Teste com a consulta: ????---- qs([72,51,65,88,90,46,29,15,37],Lo).qs([72,51,65,88,90,46,29,15,37],Lo).qs([72,51,65,88,90,46,29,15,37],Lo).qs([72,51,65,88,90,46,29,15,37],Lo).

Page 17: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação

Ordenação topológica

definiçãoimplementação

Page 18: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação

Ordenação topológica

Ordenação topológicaOrdenação topológica

Uma ordenação topológica de um grafo acíclico G=(V,A) é uma ordem total S dos elementos de V tal que se (vi,vj) ∈ A, então vi precede vj em S.Uma ordenação topológica de um grafo acíclico G=(V,A) é uma ordem total S dos elementos de V tal que se (vi,vj) ∈ A, então vi precede vj em S.

Se G representa uma rede de tarefas, isto é:Os elementos de V denotam tarefas

gravata paletó cueca

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

Os elementos de V denotam tarefas

Os elementos de A denotam dependências entre tarefas (restrições de ordem)

Então:

Uma ordenação topológica de G indica uma ordem em que as tarefas podem ser realizadas, sem que as restrições de ordem entre elas sejam violadas

camisa cinto calça

relógio meias sapatos

1 2 3

4 5 6

7 8 9

Page 19: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação

Ordenação topológica: funcionamento

1 2 3

4 5 6

1 2 3

4 5 6

1 2 3

4 5 6

1 2 3

4 5 6

1 2 3

4 5 6

1 2 3

4 5 6

1 2 3

4 5 6

1 2 3

4 5 6

1 2 3

4 5 6

1 2 3

4 5 6

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

7 8 97 8 97 8 97 8 97 8 97 8 97 8 97 8 97 8 97 8 9

Ordenação topológica: [3, 4, 1, 6, 5, 2, 7, 8, 9]Ordenação topológica: [3, 4, 1, 6, 5, 2, 7, 8, 9]Ordenação topológica: [3, 4, 1, 6, 5, 2, 7, 8, 9]Ordenação topológica: [3, 4, 1, 6, 5, 2, 7, 8, 9]

Page 20: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação

Ordenação topológica: implementação

Exemplo 4. Ordenação topológicaExemplo 4. Ordenação topológica

grafografografografo(1,[1, 2, 3, 4, 5, 6, 7, 8, 9],(1,[1, 2, 3, 4, 5, 6, 7, 8, 9],(1,[1, 2, 3, 4, 5, 6, 7, 8, 9],(1,[1, 2, 3, 4, 5, 6, 7, 8, 9],[1<2, 3<6, 4<1, 4<5, 5<2, 6<5, 6<9, 8<9]).[1<2, 3<6, 4<1, 4<5, 5<2, 6<5, 6<9, 8<9]).[1<2, 3<6, 4<1, 4<5, 5<2, 6<5, 6<9, 8<9]).[1<2, 3<6, 4<1, 4<5, 5<2, 6<5, 6<9, 8<9]).

ordtopordtopordtopordtop(G,S) :(G,S) :(G,S) :(G,S) :----grafo(G,grafo(G,grafo(G,grafo(G,VsVsVsVs,As),,As),,As),,As),ordtopordtopordtopordtop((((VsVsVsVs,As,S).,As,S).,As,S).,As,S).

ordtopordtopordtopordtop([],_,[]).([],_,[]).([],_,[]).([],_,[]).ordtopordtopordtopordtop((((VsVsVsVs,As,[,As,[,As,[,As,[V|SV|SV|SV|S]) :]) :]) :]) :----

grafografografografo(1,[1, 2, 3, 4, 5, 6, 7, 8, 9],(1,[1, 2, 3, 4, 5, 6, 7, 8, 9],(1,[1, 2, 3, 4, 5, 6, 7, 8, 9],(1,[1, 2, 3, 4, 5, 6, 7, 8, 9],[1<2, 3<6, 4<1, 4<5, 5<2, 6<5, 6<9, 8<9]).[1<2, 3<6, 4<1, 4<5, 5<2, 6<5, 6<9, 8<9]).[1<2, 3<6, 4<1, 4<5, 5<2, 6<5, 6<9, 8<9]).[1<2, 3<6, 4<1, 4<5, 5<2, 6<5, 6<9, 8<9]).

ordtopordtopordtopordtop(G,S) :(G,S) :(G,S) :(G,S) :----grafo(G,grafo(G,grafo(G,grafo(G,VsVsVsVs,As),,As),,As),,As),ordtopordtopordtopordtop((((VsVsVsVs,As,S).,As,S).,As,S).,As,S).

ordtopordtopordtopordtop([],_,[]).([],_,[]).([],_,[]).([],_,[]).ordtopordtopordtopordtop((((VsVsVsVs,As,[,As,[,As,[,As,[V|SV|SV|SV|S]) :]) :]) :]) :----

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

ordtopordtopordtopordtop((((VsVsVsVs,As,[,As,[,As,[,As,[V|SV|SV|SV|S]) :]) :]) :]) :----appendappendappendappend(E,[(E,[(E,[(E,[V|DV|DV|DV|D],],],],VsVsVsVs),),),),notnotnotnot((((membermembermembermember(_<V,As)),(_<V,As)),(_<V,As)),(_<V,As)),appendappendappendappend(E,D,(E,D,(E,D,(E,D,NVsNVsNVsNVs),),),),findallfindallfindallfindall(X<Y,(X<Y,(X<Y,(X<Y,((((membermembermembermember(X<Y,As),X(X<Y,As),X(X<Y,As),X(X<Y,As),X\\\\=V)=V)=V)=V),,,,NAsNAsNAsNAs),),),),ordtopordtopordtopordtop((((NVsNVsNVsNVs,,,,NAsNAsNAsNAs,S).,S).,S).,S).

ordtopordtopordtopordtop((((VsVsVsVs,As,[,As,[,As,[,As,[V|SV|SV|SV|S]) :]) :]) :]) :----appendappendappendappend(E,[(E,[(E,[(E,[V|DV|DV|DV|D],],],],VsVsVsVs),),),),notnotnotnot((((membermembermembermember(_<V,As)),(_<V,As)),(_<V,As)),(_<V,As)),appendappendappendappend(E,D,(E,D,(E,D,(E,D,NVsNVsNVsNVs),),),),findallfindallfindallfindall(X<Y,(X<Y,(X<Y,(X<Y,((((membermembermembermember(X<Y,As),X(X<Y,As),X(X<Y,As),X(X<Y,As),X\\\\=V)=V)=V)=V),,,,NAsNAsNAsNAs),),),),ordtopordtopordtopordtop((((NVsNVsNVsNVs,,,,NAsNAsNAsNAs,S).,S).,S).,S).

Exercício 10. Ordenação topológicaExercício 10. Ordenação topológica

Digite o programa do Exemplo 4 e faça a consulta:????---- ordtop(1,S).ordtop(1,S).ordtop(1,S).ordtop(1,S).

Digite o programa do Exemplo 4 e faça a consulta:????---- ordtop(1,S).ordtop(1,S).ordtop(1,S).ordtop(1,S).

Page 21: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação

Ordenação topológica

Exercício 11. Exibição de todas as soluçõesExercício 11. Exibição de todas as soluções

Represente o grafo a seguir e faça a consulta indicada.

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

Represente o grafo a seguir e faça a consulta indicada.

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

1 2 3 4

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

Exercício 12. Ordenação topológica versus permutaçãoExercício 12. Ordenação topológica versus permutação

Quando não há restrições de ordem entre os vértices do grafo, a ordenação topológica funciona como permutação. Para verificar este fato, represente o grafo a seguir e faça a consulta indicada:

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

Quando não há restrições de ordem entre os vértices do grafo, a ordenação topológica funciona como permutação. Para verificar este fato, represente o grafo a seguir e faça a consulta indicada:

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

1 2 3

Page 22: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação

Árvores de busca binária

definição

manipulação

Page 23: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação

Árvores de busca binária

Uma árvore binária AAAAUma árvore binária AAAA

é uma estrutura composta por n nós tal que se n=0, dizemos que A é vazia (representada por ####); caso contrário:

existe um nó especial em AAAA denominado raizos demais nós de AAAA são organizados em estruturas disjuntas:

uma subárvore binária esquerda Euma subárvore binária direita D

é uma estrutura composta por n nós tal que se n=0, dizemos que A é vazia (representada por ####); caso contrário:

existe um nó especial em AAAA denominado raizos demais nós de AAAA são organizados em estruturas disjuntas:

uma subárvore binária esquerda Euma subárvore binária direita D

RRRR

EEEE DDDD

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

uma subárvore binária direita Duma subárvore binária direita D

Uma árvore de busca binária AAAAUma árvore de busca binária AAAA

é uma árvore binária vazia ou uma estrutura nó(R,E,D)nó(R,E,D)nó(R,E,D)nó(R,E,D) tal que:• todo elemento em EEEE é menor ou igual a RRRR• todo elemento em DDDD é maior que RRRR

é uma árvore binária vazia ou uma estrutura nó(R,E,D)nó(R,E,D)nó(R,E,D)nó(R,E,D) tal que:• todo elemento em EEEE é menor ou igual a RRRR• todo elemento em DDDD é maior que RRRR

62

1 3 5 7

4

Page 24: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação

Árvore de busca binária

Exemplo 5. Criação de árvore de busca bináriaExemplo 5. Criação de árvore de busca binária

abbabbabbabb([],A,A).([],A,A).([],A,A).([],A,A).abbabbabbabb([([([([X|XsX|XsX|XsX|Xs],A,A2) :],A,A2) :],A,A2) :],A,A2) :---- insinsinsins(X,A,A1), (X,A,A1), (X,A,A1), (X,A,A1), abbabbabbabb((((XsXsXsXs,A1,A2).,A1,A2).,A1,A2).,A1,A2).

insinsinsins(X,#,nó(X,#,#)).(X,#,nó(X,#,#)).(X,#,nó(X,#,#)).(X,#,nó(X,#,#)).insinsinsins(X,nó(R,E,D),nó(R,N,D)) :(X,nó(R,E,D),nó(R,N,D)) :(X,nó(R,E,D),nó(R,N,D)) :(X,nó(R,E,D),nó(R,N,D)) :---- X=<R, !, X=<R, !, X=<R, !, X=<R, !, insinsinsins(X,E,N).(X,E,N).(X,E,N).(X,E,N).insinsinsins(X,nó(R,E,D),nó(R,E,N)) :(X,nó(R,E,D),nó(R,E,N)) :(X,nó(R,E,D),nó(R,E,N)) :(X,nó(R,E,D),nó(R,E,N)) :---- insinsinsins(X,D,N).(X,D,N).(X,D,N).(X,D,N).

abbabbabbabb([],A,A).([],A,A).([],A,A).([],A,A).abbabbabbabb([([([([X|XsX|XsX|XsX|Xs],A,A2) :],A,A2) :],A,A2) :],A,A2) :---- insinsinsins(X,A,A1), (X,A,A1), (X,A,A1), (X,A,A1), abbabbabbabb((((XsXsXsXs,A1,A2).,A1,A2).,A1,A2).,A1,A2).

insinsinsins(X,#,nó(X,#,#)).(X,#,nó(X,#,#)).(X,#,nó(X,#,#)).(X,#,nó(X,#,#)).insinsinsins(X,nó(R,E,D),nó(R,N,D)) :(X,nó(R,E,D),nó(R,N,D)) :(X,nó(R,E,D),nó(R,N,D)) :(X,nó(R,E,D),nó(R,N,D)) :---- X=<R, !, X=<R, !, X=<R, !, X=<R, !, insinsinsins(X,E,N).(X,E,N).(X,E,N).(X,E,N).insinsinsins(X,nó(R,E,D),nó(R,E,N)) :(X,nó(R,E,D),nó(R,E,N)) :(X,nó(R,E,D),nó(R,E,N)) :(X,nó(R,E,D),nó(R,E,N)) :---- insinsinsins(X,D,N).(X,D,N).(X,D,N).(X,D,N).

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

Exercício 13. Criação de árvore de busca bináriaExercício 13. Criação de árvore de busca binária

Digite o programa do Exemplo 5, faça a consulta a seguir e desenhe a árvore obtida:????---- abbabbabbabb([3,5,1,0,4,2],#,A).([3,5,1,0,4,2],#,A).([3,5,1,0,4,2],#,A).([3,5,1,0,4,2],#,A).

Digite o programa do Exemplo 5, faça a consulta a seguir e desenhe a árvore obtida:????---- abbabbabbabb([3,5,1,0,4,2],#,A).([3,5,1,0,4,2],#,A).([3,5,1,0,4,2],#,A).([3,5,1,0,4,2],#,A).

Exercício 14. Exibição de árvore de busca bináriaExercício 14. Exibição de árvore de busca binária

Complete o programa do Exemplo 5 com um predicado para exibir os elementos de uma árvore de busca binária em ordem crescente.Complete o programa do Exemplo 5 com um predicado para exibir os elementos de uma árvore de busca binária em ordem crescente.

Page 25: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação

Código de Huffman

definiçãoimplementação

Page 26: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação

Exemplo 6. Códigos de HuffmanExemplo 6. Códigos de Huffman

Texto: MARMELADATexto: MARMELADA

Código de Huffman

O código de HuffmanO código de Huffman

para um texto TTTT é uma atribuição de códigos binários aos caracteres de TTTT que minimiza o número médio de bits por caractere.para um texto TTTT é uma atribuição de códigos binários aos caracteres de TTTT que minimiza o número médio de bits por caractere.

Para obter os códigos de Huffman para os caracteres de um texto TTTT:

Obtenha as frequências dos caracteres em .

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

Texto: MARMELADATexto: MARMELADAObtenha as frequências dos caracteres em TTTT .Crie uma floresta contendo uma árvore unitária com a frequência de cada um dos caracteres.Juntes as árvores de menores frequências, duas a duas, até que seja obtida uma única árvore.Associe um bit 0000 às subárvores esquerdas e um bit 1 às subárvores direitas. 1

DDDD

1

EEEE

1

LLLL

1

RRRR

2

MMMM

3

AAAA

2 2 5

4

90

0

0 0 0

1

1

1 11

Page 27: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação

Código de Huffman

Exemplo 6. Frequência dos caracteresExemplo 6. Frequência dos caracteres

freqfreqfreqfreq([],F1,F2) :([],F1,F2) :([],F1,F2) :([],F1,F2) :---- !, !, !, !, sortsortsortsort(F1,F2).(F1,F2).(F1,F2).(F1,F2).

freqfreqfreqfreq([([([([S|SsS|SsS|SsS|Ss],F1,F3) :],F1,F3) :],F1,F3) :],F1,F3) :---- insfinsfinsfinsf(S,F1,F2), (S,F1,F2), (S,F1,F2), (S,F1,F2), freqfreqfreqfreq((((SsSsSsSs,F2,F3).,F2,F3).,F2,F3).,F2,F3).

insfinsfinsfinsf(X,[],[nó(1,X,#,#)]) :(X,[],[nó(1,X,#,#)]) :(X,[],[nó(1,X,#,#)]) :(X,[],[nó(1,X,#,#)]) :---- !.!.!.!.

insfinsfinsfinsf(X,[nó(F,X,#,#)|R],[nó(G,X,#,#)|R]) :(X,[nó(F,X,#,#)|R],[nó(G,X,#,#)|R]) :(X,[nó(F,X,#,#)|R],[nó(G,X,#,#)|R]) :(X,[nó(F,X,#,#)|R],[nó(G,X,#,#)|R]) :---- !, G is F+1.!, G is F+1.!, G is F+1.!, G is F+1.

insfinsfinsfinsf(X,[nó(F,Y,#,#)|R],[nó(F,Y,#,#)|N]) :(X,[nó(F,Y,#,#)|R],[nó(F,Y,#,#)|N]) :(X,[nó(F,Y,#,#)|R],[nó(F,Y,#,#)|N]) :(X,[nó(F,Y,#,#)|R],[nó(F,Y,#,#)|N]) :---- insfinsfinsfinsf(X,R,N).(X,R,N).(X,R,N).(X,R,N).

freqfreqfreqfreq([],F1,F2) :([],F1,F2) :([],F1,F2) :([],F1,F2) :---- !, !, !, !, sortsortsortsort(F1,F2).(F1,F2).(F1,F2).(F1,F2).

freqfreqfreqfreq([([([([S|SsS|SsS|SsS|Ss],F1,F3) :],F1,F3) :],F1,F3) :],F1,F3) :---- insfinsfinsfinsf(S,F1,F2), (S,F1,F2), (S,F1,F2), (S,F1,F2), freqfreqfreqfreq((((SsSsSsSs,F2,F3).,F2,F3).,F2,F3).,F2,F3).

insfinsfinsfinsf(X,[],[nó(1,X,#,#)]) :(X,[],[nó(1,X,#,#)]) :(X,[],[nó(1,X,#,#)]) :(X,[],[nó(1,X,#,#)]) :---- !.!.!.!.

insfinsfinsfinsf(X,[nó(F,X,#,#)|R],[nó(G,X,#,#)|R]) :(X,[nó(F,X,#,#)|R],[nó(G,X,#,#)|R]) :(X,[nó(F,X,#,#)|R],[nó(G,X,#,#)|R]) :(X,[nó(F,X,#,#)|R],[nó(G,X,#,#)|R]) :---- !, G is F+1.!, G is F+1.!, G is F+1.!, G is F+1.

insfinsfinsfinsf(X,[nó(F,Y,#,#)|R],[nó(F,Y,#,#)|N]) :(X,[nó(F,Y,#,#)|R],[nó(F,Y,#,#)|N]) :(X,[nó(F,Y,#,#)|R],[nó(F,Y,#,#)|N]) :(X,[nó(F,Y,#,#)|R],[nó(F,Y,#,#)|N]) :---- insfinsfinsfinsf(X,R,N).(X,R,N).(X,R,N).(X,R,N).

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

Exercício 15. Frequência dos caracteresExercício 15. Frequência dos caracteres

Digite o programa do Exemplo 6 e faça as consultas a seguir:????---- atom_charsatom_charsatom_charsatom_chars(marmelada,S).(marmelada,S).(marmelada,S).(marmelada,S).

????---- atom_charsatom_charsatom_charsatom_chars(marmelada,S), (marmelada,S), (marmelada,S), (marmelada,S), freqfreqfreqfreq(S,[],F).(S,[],F).(S,[],F).(S,[],F).

Digite o programa do Exemplo 6 e faça as consultas a seguir:????---- atom_charsatom_charsatom_charsatom_chars(marmelada,S).(marmelada,S).(marmelada,S).(marmelada,S).

????---- atom_charsatom_charsatom_charsatom_chars(marmelada,S), (marmelada,S), (marmelada,S), (marmelada,S), freqfreqfreqfreq(S,[],F).(S,[],F).(S,[],F).(S,[],F).

Note que a lista de frequências dos caracteres FFFF é uma floresta!Note que a lista de frequências dos caracteres FFFF é uma floresta!

Page 28: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação

Código de Huffman

Exemplo 7. Construção da árvore de HuffmanExemplo 7. Construção da árvore de Huffman

arvhufarvhufarvhufarvhuf([A],A) :([A],A) :([A],A) :([A],A) :----

!!!!....

arvhufarvhufarvhufarvhuf([A1,A2|A],B) :([A1,A2|A],B) :([A1,A2|A],B) :([A1,A2|A],B) :----

A1 = nó(F1,_,_,_),A1 = nó(F1,_,_,_),A1 = nó(F1,_,_,_),A1 = nó(F1,_,_,_),

A2 = nó(F2,_,_,_),A2 = nó(F2,_,_,_),A2 = nó(F2,_,_,_),A2 = nó(F2,_,_,_),

F3 is F1 + F2,F3 is F1 + F2,F3 is F1 + F2,F3 is F1 + F2,

sortsortsortsort([nó(F3,([nó(F3,([nó(F3,([nó(F3,----,A1,A2)|A],As),,A1,A2)|A],As),,A1,A2)|A],As),,A1,A2)|A],As),

arvhufarvhufarvhufarvhuf([A],A) :([A],A) :([A],A) :([A],A) :----

!!!!....

arvhufarvhufarvhufarvhuf([A1,A2|A],B) :([A1,A2|A],B) :([A1,A2|A],B) :([A1,A2|A],B) :----

A1 = nó(F1,_,_,_),A1 = nó(F1,_,_,_),A1 = nó(F1,_,_,_),A1 = nó(F1,_,_,_),

A2 = nó(F2,_,_,_),A2 = nó(F2,_,_,_),A2 = nó(F2,_,_,_),A2 = nó(F2,_,_,_),

F3 is F1 + F2,F3 is F1 + F2,F3 is F1 + F2,F3 is F1 + F2,

sortsortsortsort([nó(F3,([nó(F3,([nó(F3,([nó(F3,----,A1,A2)|A],As),,A1,A2)|A],As),,A1,A2)|A],As),,A1,A2)|A],As),

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

sortsortsortsort([nó(F3,([nó(F3,([nó(F3,([nó(F3,----,A1,A2)|A],As),,A1,A2)|A],As),,A1,A2)|A],As),,A1,A2)|A],As),

arvhufarvhufarvhufarvhuf(As,B).(As,B).(As,B).(As,B).

sortsortsortsort([nó(F3,([nó(F3,([nó(F3,([nó(F3,----,A1,A2)|A],As),,A1,A2)|A],As),,A1,A2)|A],As),,A1,A2)|A],As),

arvhufarvhufarvhufarvhuf(As,B).(As,B).(As,B).(As,B).

Exercício 15. Construção da árvore de HuffmanExercício 15. Construção da árvore de Huffman

Digite o programa do Exemplo 7 e faça as consultas a seguir:????---- atom_charsatom_charsatom_charsatom_chars(marmelada,S), (marmelada,S), (marmelada,S), (marmelada,S), freqfreqfreqfreq(S,[],F), (S,[],F), (S,[],F), (S,[],F), arvhufarvhufarvhufarvhuf(F,A).(F,A).(F,A).(F,A).

Digite o programa do Exemplo 7 e faça as consultas a seguir:????---- atom_charsatom_charsatom_charsatom_chars(marmelada,S), (marmelada,S), (marmelada,S), (marmelada,S), freqfreqfreqfreq(S,[],F), (S,[],F), (S,[],F), (S,[],F), arvhufarvhufarvhufarvhuf(F,A).(F,A).(F,A).(F,A).

Page 29: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação

Código de Huffman

Exemplo 8. Exibição dos códigosExemplo 8. Exibição dos códigos

códigoscódigoscódigoscódigos(nó(_,S,#,#),C) :(nó(_,S,#,#),C) :(nó(_,S,#,#),C) :(nó(_,S,#,#),C) :----

!!!!, , , , reversereversereversereverse(C,R), (C,R), (C,R), (C,R), atom_charsatom_charsatom_charsatom_chars(A,R), (A,R), (A,R), (A,R), writelnwritelnwritelnwriteln(S : A).(S : A).(S : A).(S : A).

códigoscódigoscódigoscódigos(nó(_,_,E,D),C) :(nó(_,_,E,D),C) :(nó(_,_,E,D),C) :(nó(_,_,E,D),C) :----

códigos(E,['0'|C]), códigos(D,['1'|C]).códigos(E,['0'|C]), códigos(D,['1'|C]).códigos(E,['0'|C]), códigos(D,['1'|C]).códigos(E,['0'|C]), códigos(D,['1'|C]).

códigoscódigoscódigoscódigos(nó(_,S,#,#),C) :(nó(_,S,#,#),C) :(nó(_,S,#,#),C) :(nó(_,S,#,#),C) :----

!!!!, , , , reversereversereversereverse(C,R), (C,R), (C,R), (C,R), atom_charsatom_charsatom_charsatom_chars(A,R), (A,R), (A,R), (A,R), writelnwritelnwritelnwriteln(S : A).(S : A).(S : A).(S : A).

códigoscódigoscódigoscódigos(nó(_,_,E,D),C) :(nó(_,_,E,D),C) :(nó(_,_,E,D),C) :(nó(_,_,E,D),C) :----

códigos(E,['0'|C]), códigos(D,['1'|C]).códigos(E,['0'|C]), códigos(D,['1'|C]).códigos(E,['0'|C]), códigos(D,['1'|C]).códigos(E,['0'|C]), códigos(D,['1'|C]).

Exercício 16. Exibição dos códigosExercício 16. Exibição dos códigos

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

Exercício 16. Exibição dos códigosExercício 16. Exibição dos códigos

Digite o programa do Exemplo 8 e faça as consultas a seguir:????---- atom_charsatom_charsatom_charsatom_chars(marmelada,S), (marmelada,S), (marmelada,S), (marmelada,S), freqfreqfreqfreq(S,[],F), (S,[],F), (S,[],F), (S,[],F), arvhufarvhufarvhufarvhuf(F,A), códigos(A,[]).(F,A), códigos(A,[]).(F,A), códigos(A,[]).(F,A), códigos(A,[]).

Digite o programa do Exemplo 8 e faça as consultas a seguir:????---- atom_charsatom_charsatom_charsatom_chars(marmelada,S), (marmelada,S), (marmelada,S), (marmelada,S), freqfreqfreqfreq(S,[],F), (S,[],F), (S,[],F), (S,[],F), arvhufarvhufarvhufarvhuf(F,A), códigos(A,[]).(F,A), códigos(A,[]).(F,A), códigos(A,[]).(F,A), códigos(A,[]).

Exercício 17. Programa principalExercício 17. Programa principal

Defina o predicado huffmanhuffmanhuffmanhuffman(T)(T)(T)(T), que exibe os códigos de Huffman para o texto TTTT:

????---- huffmanhuffmanhuffmanhuffman((((''''MARMELADAMARMELADAMARMELADAMARMELADA'''').).).).

Defina o predicado huffmanhuffmanhuffmanhuffman(T)(T)(T)(T), que exibe os códigos de Huffman para o texto TTTT:

????---- huffmanhuffmanhuffmanhuffman((((''''MARMELADAMARMELADAMARMELADAMARMELADA'''').).).).

Page 30: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação

Bônus: interface gráfica

::::---- use_module(library(tabular)).use_module(library(tabular)).use_module(library(tabular)).use_module(library(tabular)).

hufhufhufhuf ::::----

newnewnewnew(F,frame('Códigos de Huffman')),(F,frame('Códigos de Huffman')),(F,frame('Códigos de Huffman')),(F,frame('Códigos de Huffman')),

sendsendsendsend(F,append,(F,append,(F,append,(F,append,newnewnewnew(D,(D,(D,(D,dialogdialogdialogdialog)),)),)),)),

sendsendsendsend(D,above,(D,above,(D,above,(D,above,newnewnewnew(P,(P,(P,(P,picturepicturepicturepicture)),)),)),)),

sendsendsendsend(P,size,(P,size,(P,size,(P,size,sizesizesizesize(210,100)),(210,100)),(210,100)),(210,100)),

sendsendsendsend(P,display,(P,display,(P,display,(P,display,newnewnewnew(T,tabular)), (T,tabular)), (T,tabular)), (T,tabular)),

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

sendsendsendsend(P,display,(P,display,(P,display,(P,display,newnewnewnew(T,tabular)), (T,tabular)), (T,tabular)), (T,tabular)),

sendsendsendsend(T,border,1),(T,border,1),(T,border,1),(T,border,1),

sendsendsendsend(T,rules,all),(T,rules,all),(T,rules,all),(T,rules,all),

sendsendsendsend(D,append,(D,append,(D,append,(D,append,newnewnewnew(I,(I,(I,(I,text_itemtext_itemtext_itemtext_item(texto))),(texto))),(texto))),(texto))),

sendsendsendsend(D,append,(D,append,(D,append,(D,append,buttonbuttonbuttonbutton(ok,(ok,(ok,(ok,andandandand((((andandandand((((messagemessagemessagemessage(T,clear),(T,clear),(T,clear),(T,clear),

messagemessagemessagemessage(@prolog,huf,T,I(@prolog,huf,T,I(@prolog,huf,T,I(@prolog,huf,T,I????selection)),selection)),selection)),selection)),

messagemessagemessagemessage(I,clear)))),(I,clear)))),(I,clear)))),(I,clear)))),

sendsendsendsend(D,append,(D,append,(D,append,(D,append,buttonbuttonbuttonbutton(sair,(sair,(sair,(sair,messagemessagemessagemessage(F,destroy))),(F,destroy))),(F,destroy))),(F,destroy))),

sendsendsendsend(F,open).(F,open).(F,open).(F,open).

Page 31: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação

Bônus: interface gráfica

hufhufhufhuf(T,I) :(T,I) :(T,I) :(T,I) :----

atom_charsatom_charsatom_charsatom_chars(I,L),(I,L),(I,L),(I,L),

freq(L,[],F),freq(L,[],F),freq(L,[],F),freq(L,[],F),

arvhuf(F,A),arvhuf(F,A),arvhuf(F,A),arvhuf(F,A),

códigos(T,A,[]).códigos(T,A,[]).códigos(T,A,[]).códigos(T,A,[]).

freqfreqfreqfreq([],F1,F2) :([],F1,F2) :([],F1,F2) :([],F1,F2) :----

!!!!, , , ,

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

!!!!, , , ,

sortsortsortsort(F1,F2).(F1,F2).(F1,F2).(F1,F2).

freqfreqfreqfreq([S|Ss],F1,F3) :([S|Ss],F1,F3) :([S|Ss],F1,F3) :([S|Ss],F1,F3) :----

ins(S,F1,F2),ins(S,F1,F2),ins(S,F1,F2),ins(S,F1,F2),

freq(Ss,F2,F3).freq(Ss,F2,F3).freq(Ss,F2,F3).freq(Ss,F2,F3).

insinsinsins(X,[],[nó(1,X,#,#)]) :(X,[],[nó(1,X,#,#)]) :(X,[],[nó(1,X,#,#)]) :(X,[],[nó(1,X,#,#)]) :---- !.!.!.!.

insinsinsins(X,[nó(F,X,#,#)|R],[nó(G,X,#,#)|R]) :(X,[nó(F,X,#,#)|R],[nó(G,X,#,#)|R]) :(X,[nó(F,X,#,#)|R],[nó(G,X,#,#)|R]) :(X,[nó(F,X,#,#)|R],[nó(G,X,#,#)|R]) :---- !, G is F+1.!, G is F+1.!, G is F+1.!, G is F+1.

insinsinsins(X,[nó(F,Y,#,#)|R],[nó(F,Y,#,#)|N]) :(X,[nó(F,Y,#,#)|R],[nó(F,Y,#,#)|N]) :(X,[nó(F,Y,#,#)|R],[nó(F,Y,#,#)|N]) :(X,[nó(F,Y,#,#)|R],[nó(F,Y,#,#)|N]) :---- ins(X,R,N).ins(X,R,N).ins(X,R,N).ins(X,R,N).

Page 32: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação

Bônus: interface gráfica

arvhufarvhufarvhufarvhuf([A],A) :([A],A) :([A],A) :([A],A) :---- !.!.!.!.

arvhufarvhufarvhufarvhuf([A1,A2|A],B) :([A1,A2|A],B) :([A1,A2|A],B) :([A1,A2|A],B) :----

A1 = nó(F1,_,_,_),A1 = nó(F1,_,_,_),A1 = nó(F1,_,_,_),A1 = nó(F1,_,_,_),

A2 = nó(F2,_,_,_),A2 = nó(F2,_,_,_),A2 = nó(F2,_,_,_),A2 = nó(F2,_,_,_),

F3 F3 F3 F3 isisisis F1+F2,F1+F2,F1+F2,F1+F2,

sortsortsortsort([nó(F3,([nó(F3,([nó(F3,([nó(F3,----,A1,A2)|A],As),,A1,A2)|A],As),,A1,A2)|A],As),,A1,A2)|A],As),

arvhuf(As,B).arvhuf(As,B).arvhuf(As,B).arvhuf(As,B).

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

códigoscódigoscódigoscódigos(T,nó(_,S,#,#),C) :(T,nó(_,S,#,#),C) :(T,nó(_,S,#,#),C) :(T,nó(_,S,#,#),C) :---- !, !, !, !,

reversereversereversereverse(C,CR), (C,CR), (C,CR), (C,CR),

atom_charsatom_charsatom_charsatom_chars(A,CR),(A,CR),(A,CR),(A,CR),

sendsendsendsend(T,append,S,bold,left,colspan(T,append,S,bold,left,colspan(T,append,S,bold,left,colspan(T,append,S,bold,left,colspan:=:=:=:=1),1),1),1),

sendsendsendsend(T,append,A,bold,left,colspan(T,append,A,bold,left,colspan(T,append,A,bold,left,colspan(T,append,A,bold,left,colspan:=:=:=:=1),1),1),1),

sendsendsendsend(T,next_row).(T,next_row).(T,next_row).(T,next_row).

códigoscódigoscódigoscódigos(T,nó(_,_,E,D),C) :(T,nó(_,_,E,D),C) :(T,nó(_,_,E,D),C) :(T,nó(_,_,E,D),C) :----

códigos(T,E,['0'|C]),códigos(T,E,['0'|C]),códigos(T,E,['0'|C]),códigos(T,E,['0'|C]),

códigos(T,D,['1'|C]).códigos(T,D,['1'|C]).códigos(T,D,['1'|C]).códigos(T,D,['1'|C]).

Page 33: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação

Fim