Lab02 Arvoreprolog 100716130900 Phpapp01

9
Laborat´ orio 2 ´ Arvores em PROLOG Edmilson Marmo Moreira Universidade Federal de Itajub´a - UNIFEI Instituto de Engenharia de Sistemas e Tecnologias da Informa¸ c˜ao- IESTI “O que ´ e inconceb´ ıvel a respeito do Universo ´ e que ele ´ e absolutamente conce- ıvel.”. Albert Einstein 1 Considera¸ c˜oesIniciais ´ Arvores s˜ao esruturas de dados que caracterizam uma rela¸c˜ ao entre os dados que a comp˜ oem. Esta rela¸c˜ao existente entre os dados, denominados ose uma rela¸ c˜aode hierarquia ou de composi¸c˜ao, onde um conjunto de dados´ e hierarquicamente subordinado a outro. Formalmente, uma ´arvore´ e um conjunto finito T de um ou mais n´os, tais que: 1. existe um n´ o denominado raiz da ´arvore; 2. os demais n´os formam m 0 conjuntos disjuntos S 1 ,S 2 , ··· ,S m , onde cada um destes conjuntos ´ e uma ´arvore. As ´ arvores S i (1 i n)recebemadenomina¸c˜ao de sub´ arvores. Esquematicamente, uma ´arvore pode ser representada como mostra a figura 1. A B C D E F G H I J K Figura1:Representa¸c˜aoesquem´ atica de uma ´arvore 1

description

arvore de prolog

Transcript of Lab02 Arvoreprolog 100716130900 Phpapp01

Page 1: 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

Page 2: Lab02 Arvoreprolog 100716130900 Phpapp01

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:

Page 3: Lab02 Arvoreprolog 100716130900 Phpapp01

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

Page 4: Lab02 Arvoreprolog 100716130900 Phpapp01

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

Page 5: Lab02 Arvoreprolog 100716130900 Phpapp01

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;

Page 6: Lab02 Arvoreprolog 100716130900 Phpapp01

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).

Page 7: Lab02 Arvoreprolog 100716130900 Phpapp01

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)).

Page 8: Lab02 Arvoreprolog 100716130900 Phpapp01

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).

Page 9: Lab02 Arvoreprolog 100716130900 Phpapp01

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.