Lab02 Arvoreprolog 100716130900 Phpapp01
-
Upload
analide-saka-fizzy -
Category
Documents
-
view
212 -
download
0
description
Transcript of Lab02 Arvoreprolog 100716130900 Phpapp01
Laboratorio 2Arvores em PROLOG
Edmilson Marmo MoreiraUniversidade Federal de Itajuba - UNIFEI
Instituto de Engenharia de Sistemas e Tecnologias da Informacao - IESTI
“O que e inconcebıvel a respeito do Universo e que ele e absolutamente conce-bıvel.”.
Albert Einstein
1 Consideracoes Iniciais
Arvores sao esruturas de dados que caracterizam uma relacao entre os dados que
a compoem. Esta relacao existente entre os dados, denominados nos, e uma relacao de
hierarquia ou de composicao, onde um conjunto de dados e hierarquicamente subordinado
a outro.
Formalmente, uma arvore e um conjunto finito T de um ou mais nos, tais que:
1. existe um no denominado raiz da arvore;
2. os demais nos formam m ≥ 0 conjuntos disjuntos S1, S2, · · · , Sm, onde cada um
destes conjuntos e uma arvore. As arvores Si(1 ≤ i ≤ n) recebem a denominacao
de subarvores.
Esquematicamente, uma arvore pode ser representada como mostra a figura 1.
GFED@ABCA
GFED@ABCB
ooooooooooooooooo GFED@ABCC GFED@ABCD
PPPPPPPPPPPPPPPPP
GFED@ABCE GFED@ABCF
~~~~~~~~~ GFED@ABCG
@@@@@@@@@
GFED@ABCH
?>=<89:;I
~~~~~~~~~ ?>=<89:;J GFED@ABCK
AAAAAAAAA
Figura 1: Representacao esquematica de uma arvore
1
Matematica Discreta - Notas de Aula - Laboratorio 02 - 2
Pela definicao de arvore, cada no e a raiz de uma subarvore. No exemplo da figura 1, a
raiz da arvore e o no A. Por sua vez, o no B e raiz da subarvore que possui os nos B e E.
O numero de subarvores de um no e o grau daquele no. Um no de grau zero e denominado
folha ou no terminal. Entao, A tem grau 3, B tem grau 1, e assim sucessivamente. Alem
disso, E, F , G, I, J e K sao folhas desta arvore. O nıvel ou profundiade de um no e
definido da seguinte forma: a raiz da arvore tem nıvel 0, enquanto o nıvel dos demais nos
e igual ao numero de arestas que o liga a raiz, ou seja, e o comprimento do caminho que
vai da raiz ate este no. A altura de uma arvore e igual ao maximo nıvel de seus nos. Na
arvore exemplo, a altura e 3.
2 Arvores Binarias
Arvores binarias sao estruturas do tipo arvore, onde o grau de cada no e menor ou
igual a dois. No caso de arvores binarias, distinguem-se as subarvores de um no entre
subarvore esquerda e subarvore direita. Assim, se o grau de um no for igual a 1, deve
ser especificado se a sua subarvore e a da esquerda ou a da direita. Uma arvore binaria
tambem pode ser vazia, isto e, nao possuir nenhum no. A figura 2 apresenta um exemplo
de arvore binaria.
GFED@ABCA
GFED@ABCB
~~~~~~~~~ GFED@ABCC
@@@@@@@@@
GFED@ABCD
~~~~~~~~~ GFED@ABCE
~~~~~~~~~ GFED@ABCF
@@@@@@@@@
GFED@ABCH
~~~~~~~~~ GFED@ABCG
@@@@@@@@@
Figura 2: Ilustracao de uma arvore binaria
Para ilustrar o processo de construcao de arvores, sera considerado o caso de construir
arvores binarias na linguagem Turbo Prolog com o auxılio do mecanismo para construcao
de tipos functor.
Como foi visto no primeiro laboratorio, um relacionamento e seus objetos sao frequen-
temente escritos em Turbo Prolog como:
relacionamento(objeto, objeto).
com o relacionamento precedendo os objetos, e os objetos entre parenteses.
Esta estrutura nem sempre e suficiente, mesmo que se utilize listas. Por exemplo, uma
lista de contas a serem pagas poderia ser escrita como uma serie de fatos:
Matematica Discreta - Notas de Aula - Laboratorio 02 - 3
pagar(maria, comida).
pagar(maria, telefone).
pagar(maria, aluguel).
pagar(maria, loja).
Objetos compostos permitem que se acrescente maiores detalhes as clausulas. O que
segue e um exemplo utilizando a informacao recem-apresentada:
pagar(maria, comida(sanduiche, 23.40)).
pagar(maria, telefone(celular, 100.00)).
pagar(maria, aluguel(apartamento, 400.00)).
pagar(maria, loja(brinquedos, 25.00)).
Quando um argumento em si e um predicado, ele e chamado functor. Os argumentos
de um functor sao denominados componentes. Portanto, a estrutura da clausula recem-
mostrada com objetos compostos e:
predicado(argumento, functor(componente, componente)).
Nao se deve fazer isto indefinidamente, porque um nıvel muito grande de parenteses
pode dificultar a leitura.
Sao varias representacoes possıveis de uma arvore binaria. Em Prolog, uma represen-
tacao conveniente e feita traves do uso de uma estrutura. Uma estrutura e expressa por
um functor e seus argumentos. Em geral, estruturas sao representadas na notacao prefix-
ada, isto e, o functor em primeiro lugar seguido de seus argumentos. Na representacao de
arvores binarias sera usada a estrutura:
domains
arvore = arvore(arvore, tipo_informacao, arvore) ; nil
Nesta estrutura, arvore e o functor e nil e utilizado para representar um atomo
especial, ou seja, a arvore vazia. Nesta representacao, a arvore binaria que consiste so da
raiz, rotulada ‘A’, sera representada por:
arvore(nil, ‘A’, nil).
As figuras 3, 4 e 5 apresentam uma sequencia de insercoes de nos em uma arvore
binaria, inicialmente vazia.
GFED@ABCA arvore(nil, ‘A’, nil)
Figura 3: Arvore apos a insercao do no A
Matematica Discreta - Notas de Aula - Laboratorio 02 - 4
GFED@ABCA
GFED@ABCC
@@@@@@@@@
arvore( nil︸︷︷︸subarvoreEsquerda
, ‘A’, arvore(nil, ‘C’, nil)︸ ︷︷ ︸subarvoreDireita
)
Figura 4: Arvore apos a insercao do no C
GFED@ABCA
GFED@ABCB
~~~~~~~~~ GFED@ABCC
@@@@@@@@@
arvore( arvore(nil,‘B’,nil)︸ ︷︷ ︸subarvoreEsquerda
, ‘A’, arvore(nil, ‘C’, nil)︸ ︷︷ ︸subarvoreDireita
)
Figura 5: Arvore apos a insercao do no B
3 Construcao de Arvores Binarias
Utiliza-se uma forma sequencial dos nos na arvore afim de facilitar o processo de
construcao. Um mecanismo muito utilizado e conhecido como Notacao Ponto. Nesta
notacao, os elementos da arvore aparecem em ordem pre-fixada e um ponto representa
uma arvore vazia. A figura 6 ilustra o exemplo de uma arvore e sua representacao neste
tipo de notacao. Observa-se que, pela posicao do ponto, nao existe duas cadeias de
caracteres diferentes para representar a mesma arvore.
GFED@ABCA
GFED@ABCB
~~~~~~~~~
GFED@ABCC
~~~~~~~~~ GFED@ABCD
@@@@@@@@@
GFED@ABCE
@@@@@@@@@
GFED@ABCF
~~~~~~~~~
ABC..D.EF....
Figura 6: Arvore binaria e respectiva notacao ponto
A seguir tem-se o exemplo de um programa simples em Turbo Prolog para construir
uma arvore a partir da respectiva notacao ponto. Este programa obtem do dispositivo de
entrada padrao as informacoes que serao inseridas na arvore.
/*
* Constroi Arvore
Matematica Discreta - Notas de Aula - Laboratorio 02 - 5
*/
Domains
arvore=arvore(arvore, symbol, arvore); nil
Predicates
CriaArvore(arvore).
CriaArvoreAux(symbol, arvore).
Clauses
CriaArvore(A) :-
readln(Dado),
CriaArvoreAux(Dado,A).
CriaArvoreAux(".",nil) :- !.
CriaArvoreAux(Dado, arvore(Esq,Dado,Dir)) :-
CriaArvore(Esq),
CriaArvore(Dir).
4 Caminhamentos em Arvores Binarias
Caminhar uma arvore significa percorrer todos os nos da arvore de forma sistematica
de modo que cada no seja visitado uma unica vez. O caminhamento pode ser realizado
por profundidade ou por largura.
O caminhamento por profundidade apresenta tres formas basicas:
1. Caminhamento pre-fixado (pre-ordem), que realiza a seguinte sequencia de passos:
(a) Processa o no;
(b) Percorre a subarvore esquerda;
(c) Percorre a subarvore direita.
2. Caminhamento central (ordem intermediaria), que realiza a seguinte sequencia de
passos:
(a) Percorre a subarvore esquerda;
(b) Processa o no;
(c) Percorre a subarvore direita.
3. Caminhamento pos-fixado (pos-ordem), que realiza a seguinte sequencia de passos:
(a) Percorre a subarvore esquerda;
Matematica Discreta - Notas de Aula - Laboratorio 02 - 6
(b) Percorre a subarvore direita;
(c) Processa o no.
Se estas tres formas de caminhamento fossem utilizadas para percorrer e apresentar
as informacoes da arvore da figura 7 os resultados seriam, respectivamente:
Pre-ordem: A B D F C E G
in-ordem: D F B A E G C
Pos-ordem: F D B G E C A
GFED@ABCA
GFED@ABCB
~~~~~~~~~ GFED@ABCC
@@@@@@@@@
GFED@ABCD
~~~~~~~~~ GFED@ABCE
~~~~~~~~~
GFED@ABCF
@@@@@@@@@
GFED@ABCG
@@@@@@@@@
Figura 7: Arvore binaria
O codigo Prolog a seguir apresenta predicados para realizar os tres tipos de camin-
hamento em profundidade discutidos. A acao de“processar o no” e realizada apresentando
o conteudo do no no dispositivo de saıda padrao.
/*
* Caminhamentos em profundidade primeiro
*/
Domains
arvore=arvore(arvore, symbol, arvore); nil
Predicates
MostraPreOrdem(arvore).
MostraInOrdem(arvore).
MostraPosOrdem(arvore).
Clauses
MostraPreOrdem(nil).
Matematica Discreta - Notas de Aula - Laboratorio 02 - 7
MostraPreOrdem(arvore(Esq,Info,Dir)) :-
write (Info), nl,
MostraPreOrdem(Esq),
MostraPreOrdem(Dir).
MostraInOrdem(nil).
MostraInOrdem(arvore(Esq,Info,Dir)) :-
MostraInOrdem(Esq),
write (Info), nl,
MostraInOrdem(Dir).
MostraPosOrdem(nil).
MostraPosOrdem(arvore(Esq,Info,Dir)) :-
MostraPosOrdem(Esq),
MostraPosOrdem(Dir),
write (Info), nl.
5 Arvore Binaria de Busca
A estrutura de dados arvore e boa para a manutencao ordenada dos dados. Assim,
se for utilizado o criterio de que dados maiores devem ser inseridos no ramo direito e
dados menores devem ser inseridos no ramo esquerdo, a arvore estara sempre ordenada.
Nesta situacao, o caminhamento em ordem intermediaria apresentara os dados em ordem
crescente.
O codigo a seguir apresenta um predicado para inserir um no em um arvore binaria
de busca.
/*
* Inserc~ao em Arvore Binaria de Busca
*/
Domains
arvore=arvore(arvore, symbol, arvore); nil
Predicates
InsereNo(symbol, arvore, arvore).
Clauses
InsereNo(X, nil, arvore(nil, X, nil)).
InsereNo(X, arvore(Esq, X, Dir), arvore(Esq, X, Dir)).
Matematica Discreta - Notas de Aula - Laboratorio 02 - 8
InsereNo(X, arvore(Esq, Y, Dir), arvore(Esq1, Y, Dir)) :-
X < Y,!,
InsereNo(X, Esq, Esq1).
InsereNo(X, arvore(Esq, Y, Dir), arvore(Esq, Y, Dir1)) :-
InsereNo(X, Dir, Dir1).
Para remover um no de uma arvore ordenada e preciso analisar dois casos:
1. O no a ser removido possui uma ou ambas as subarvores vazias;
2. As duas subarvores do no possuem ligacoes (nao sao vazias).
No primeiro caso, a remocao e feita conectando o no pai com o filho do no a ser
removido. Por sua vez, no segundo caso deve-se remover o no que contem o sucessor
imediato do no a ser removido e reinserir esta informacao no local que se deseja realmente
remover. O codigo seguinte ilustra estas acoes.
/*
* Remoc~ao em Arvore Binaria de Busca
*/
Domains
arvore=arvore(arvore, symbol, arvore); nil
Predicates
RetiraNo(symbol, arvore, arvore).
RetiraAux(symbol, arvore, arvore).
Clauses
RetiraNo(X, arvore(Esq, X, nil), Esq) :- !.
RetiraNo(X, arvore(Esq, X, Dir), arvore(Esq, Y, Dir1)) :- !,
RetiraAux(Y, Dir, Dir1).
RetiraNo(X, arvore(Esq, Y, Dir), arvore(Esq1, Y, Dir)) :- X < Y, !,
Retira(X, Esq, Esq1).
RetiraNo(X, arvore(Esq, Y, Dir), arvore(Esq, Y, Dir1)) :- X > Y, !,
Retira(X, Dir, Dir1).
RetiraAux(X, arvore(nil, X, Dir), Dir) :- !.
RetiraAux(X, arvore(Esq, Y, Dir), arvore(Esq1, Y, Dir)) :-
RetiraAux(X, Esq, Esq1).
Matematica Discreta - Notas de Aula - Laboratorio 02 - 9
6 Exercıcios
1. Montar um predicado Prolog que identifique o nıvel de um determinado no de uma
arvore binaria.
2. Escrever um predicado para substituir todas as ocorrencias de um determinado
elemento em uma arvore binaria.
3. Escrever um predicado que retorne a altura de uma arvore binaria.
4. Escrever um predicado que verifique se duas arvores sao equivalentes.
5. Desenvolver predicados para realizar as seguintes rotacoes em uma arvore binaria:
(a) Rotacao Esquerda;
(b) Rotacao Direita;
(c) Rotacao Esquerda e Direita;
(d) Rotacao Direita e Esquerda.
6. Desenvolva um predicado para inserir um elemento em uma arvore AVL.
Referencias
CLOCKSIN, W. F.; MELLISH, C. S. Programming in Prolog. Berlin: Springer-Verlag,
1984.
MONARD, M. C.; NICOLETTI, M. do C. Tecnicas avancadas de programacao prolog
para tratamento de Arvores. 1993.
ROBERTS, R. Turbo Prolog. Rio de Janeiro: LTC, 1988. 180 p.
ROBINSON, P. R. Turbo Prolog - Guia do Usuario. Sao Paulo: McGraw-Hill, 1988.
287 p.
VELOSO, P. et al. Estruturas de Dados. Rio de Janeiro: Editora Campus, 1983.