Você está na página 1de 9

Laboratorio 2

rvores em PROLOG
A
Edmilson Marmo Moreira
Universidade Federal de Itajub
a - UNIFEI
Instituto de Engenharia de Sistemas e Tecnologias da Informac
ao - IESTI

O que e inconcebvel a respeito do Universo e que ele e absolutamente concebvel..


Albert Einstein

Considerac
oes 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
@ABC
o A PPPP
o
o
PPP
ooo
PPP
ooo
PPP
o
o
o
PPP
o
P
ooo
o
GFED
@ABC
GFED
@ABC
GFED
@ABC
C@
D
B
@
~
@
~
@@
~~
@@
~~
@@
~
~
~
GFED
@ABC

GFED
@ABC

GFED
@ABC

GFED
@ABC

89:;
?>=<

89:;
?>=<

~~
~~
~
~~
~~

HA
J

AA
AA
AA
AA
GFED
@ABC

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 n
umero 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 nvel ou profundiade de um no e
definido da seguinte forma: a raiz da arvore tem nvel 0, enquanto o nvel dos demais nos
e igual ao n
umero 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 nvel de seus nos. Na
arvore exemplo, a altura e 3.

Arvores
Bin
arias

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
@ABC

~~
~~
~
~~
~~

GFED
@ABC

~~
~~
~
~~
~~

GFED
@ABC

@@
@@
@@
@@
GFED
@ABC

~~
~~
~
~~
~~
GFED
@ABC
E@
@@
~
~
@@
~~
@@
~
~
@@
~
~~

GFED
@ABC

A@

C@
@

@@
@@
@@
@
GFED
@ABC

GFED
@ABC

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 auxlio do mecanismo para construcao
de tipos functor.
Como foi visto no primeiro laboratorio, um relacionamento e seus objetos sao freq
uentemente 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,
pagar(maria,
pagar(maria,
pagar(maria,

comida).
telefone).
aluguel).
loja).

Objetos compostos permitem que se acrescente maiores detalhes `as clausulas. O que
segue e um exemplo utilizando a informacao recem-apresentada:
pagar(maria,
pagar(maria,
pagar(maria,
pagar(maria,

comida(sanduiche, 23.40)).
telefone(celular, 100.00)).
aluguel(apartamento, 400.00)).
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 recemmostrada com objetos compostos e:
predicado(argumento, functor(componente, componente)).
Nao se deve fazer isto indefinidamente, porque um nvel muito grande de parenteses
pode dificultar a leitura.
Sao varias representacoes possveis de uma arvore binaria. Em Prolog, uma representacao 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 prefixada, 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
@ABC

arvore(nil, A, nil)

Figura 3: Arvore
apos a insercao do no A

Matematica Discreta - Notas de Aula - Laboratorio 02 - 4


GFED
@ABC

arvore(

A@

@@
@@
@@
@@

nil
|{z}

subarvoreEsquerda

, A, arvore(nil, C, nil) )
{z
}
|
subarvoreDireita

GFED
@ABC

Figura 4: Arvore
apos a insercao do no C
GFED
@ABC

~~
~~
~
~~
~~

GFED
@ABC

arvore( arvore(nil,B,nil) , A, arvore(nil, C, nil) )


|
{z
}
{z
}
|

A@

@@
@@
@@
@@

subarvoreEsquerda

subarvoreDireita

GFED
@ABC

Figura 5: Arvore
apos a insercao do no B

Construc
ao de Arvores
Bin
arias

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
@ABC

~
~~
~
~
~~
~~
GFED
@ABC
B
~ @@@
~
@@
~
~
@@
~~
@@
~
~
~

GFED
@ABC

ABC..D.EF....

GFED
@ABC

D@

@@
@@
@@
@@
GFED
@ABC

~
~~
~
~
~~
~~

GFED
@ABC

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.
/*
* Constr
oi 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).

Caminhamentos em Arvores
Bin
arias

Caminhar uma arvore significa percorrer todos os nos da arvore de forma sistematica
de modo que cada no seja visitado uma u
nica 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:
Pr
e-ordem: A B D F C E G
in-ordem: D F B A E G C
P
os-ordem: F D B G E C A

GFED
@ABC

~~
~~
~
~~
~~

GFED
@ABC

~~
~~
~
~~
~~
GFED
@ABC
D@
@@
@@
@@
@@

A@

@@
@@
@@
@@
GFED
@ABC

~~
~~
~
~~
~~
GFED
@ABC
E@
@@
@@
@@
@@

GFED
@ABC

GFED
@ABC

Figura 7: Arvore
binaria
O codigo Prolog a seguir apresenta predicados para realizar os tres tipos de caminhamento em profundidade discutidos. A acao de processar o noe realizada apresentando
o conte
udo do no no dispositivo de sada 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.

Arvore
Bin
aria 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.
/*
* Inser
c~
ao em
Arvore Bin
aria 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.
/*
* Remo
ca
~o em
Arvore Bin
aria de Busca
*/
Domains
arvore=arvore(arvore, symbol, arvore); nil
Predicates
RetiraNo(symbol, arvore, arvore).
RetiraAux(symbol, arvore, arvore).
Clauses
RetiraNo(X, arvore(Esq, X,
RetiraNo(X, arvore(Esq, X,
RetiraAux(Y, Dir, Dir1).
RetiraNo(X, arvore(Esq, Y,
Retira(X, Esq, Esq1).
RetiraNo(X, arvore(Esq, Y,
Retira(X, Dir, Dir1).

nil), Esq) :- !.
Dir), arvore(Esq, Y, Dir1)) :- !,
Dir), arvore(Esq1, Y, Dir)) :- X < Y, !,
Dir), arvore(Esq, Y, Dir1)) :- X > Y, !,

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

Exerccios
1. Montar um predicado Prolog que identifique o nvel 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.

Refer
encias
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.

Você também pode gostar