Author
vokien
View
228
Download
0
Embed Size (px)
Aplicações de recursividade
Prof. Dr. Silvio do Lago PereiraDepartamento de Tecnologia da Informação
Faculdade de Tecnologia de São Paulo
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
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
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 :
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.
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 :
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)
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.
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 :
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.
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 :
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)
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).
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 :
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)
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).
Ordenação topológica
definiçãoimplementaçã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
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]
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).
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
Árvores de busca binária
definição
manipulaçã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
Á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.
Código de Huffman
definiçãoimplementaçã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
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!
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).
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'''').).).).
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).
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).
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]).
Fim