Sunteți pe pagina 1din 24

Tipos de Dados

Abstractos
Fac. Cincias Univ. Lisboa

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Hoje
!

Especificao da pilha: gneros, assinaturas, domnios


das operaes.

Relao entre as operaes construtoras e as


observadoras.

Especificao da pilha: axiomas.

! Da especificao para uma classe Java.

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Construo e observao
! As especificaes definem tipos de dados, chamados

gneros (sorts).
!

Cada especificao define exactamente um gnero.

Vamos definir o gnero pilha (Stack)

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Especificao de um Stack
specification
sorts
Stack
constructors
make: > Stack;
push : Stack Element > Stack ;
observers
top: Stack >? Element ;
pop: Stack >? Stack;
isEmpty: Stack ;
domains
S: Stack ;
top (S) if not isEmpty (S);
pop (S) if not isEmpty (S);
axioms
S: Stack ; E: Element ;
top (push (S, E)) = E;
pop (push (S, E)) = S;
isEmpty (make ()) ;
not isEmpty (push (S, E));
end specification"

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Aps sorts, especificamos as assinaturas de todas as


operaes que a especificao define.

Por exemplo:
!
!

push: Stack Element Stack


afirma que push o nome de uma operao que requer dois
parmetros (de gneros Stack e Element) e devolve um valor
(de gnero Stack).
a especificao de Element tem que ser feita separadamente

! Outro exemplo
! make: Stack
!
Constri um Stack sem elementos, no requer input
Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Tipos de operaes
!

H 3 seces separadas de operaes:


! constructors
! observers
! others

Constructors: conjunto minimal de operaes para


construir qualquer valor do gnero

Gnero Stack tem 2 construtores: um para construir


um novo Stack, outro para construir um novo Stack
dado um Stack e um Element
Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Observers
!

Observers: operaes usadas para analisar (dissecar,


separar, desconstruir) um dado valor do gnero.

Os observers tm que ter pelo menos um parmetro.

! O primeiro parmetro tem que ser do gnero a ser

especificado, no exemplo Stack.

Dois observers:
! top, que devolve o elemento de topo no Stack
! Pop, que devolve o Stack obtido por remoo do

elemento de topo no Stack

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Predicates (predicados)
!

Predicates so operaes usadas no para construir


elementos de um sort, mas para avaliar uma condio.

! Como os predicados no devolvem nada, omite-se a

seta:
isEmpty: Stack;
! serve para inquirir se um Stack no contm elementos
!

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Operaes parciais
!

Nem todas as operaes so totais.

Algumas operaes podem no estar definidas para todos os


valores possveis dos parmetros

Exemplo: no podemos obter o elemento de topo num Stack


vazio.

Usamos ? a seta de funo parcial


!

top: Stack >? Element ;#

Definimos para cada funo parcial o seu domnio


!

domains#
! S: Stack#
! top(S) if not isEmpty(S);#

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Axiomas
!

Axiomas descrevem as dependncias entre as diferentes


operaes.

! Ex: se empilharmos um elemento E num Stack e a

seguir examinarmos o topo do Stack temos que ter E.


!

Esta seco comea por declarar as variveis necessrias


aos axiomas. Estas so distintas das declaradas para os
domnios (mbito diferente).

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Definio de Axiomas
!

Nesta seco, descrita a semntica (i.e., o significado)


de cada uma das operaes anteriores.
Esta descrio no deve ser explcita, ou seja, no deve
usar nenhuma representao do objecto ( precisamente
isso que queremos evitar). No nos interessa a estrutura
dos resultados.
! A descrio deve ser implcita. Uma descrio implcita
focada nas propriedades relevantes do objecto. Assim,
no se diz como devem ser representadas, diz-se o que as
eventuais representaes devem satisfazer.
!

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Axiomas
!

Nos casos simples, precisamos de um axioma por


obervador por construtor.
! top(make()) no faz sentido (o domains exclui-o)
! Este
! top (push(S, E)) = E;#
!

Diz precisamente que E o topo do Stack onde se


empilhou E

! Outro:
! pop (push(S, E)) = S;#

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Mais axiomas
!

Mais 2 axiomas para relacionar o observador isEmpty


com os construtores make e push.
isEmpty(make());#
! not isEmpty(push(S,E));#
!

! O primeiro diz que um Stack acabado de fazer vazio#


! O segundo diz que falso que o resultado de empilhar

um Element num Stack dado d um Stack vazio.

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Adicionar uma operao Size


! size: Stack int;#
! O gnero int primitivo
!

Inclui, por ordem crescente de preferncia:


!
!
!
!
!

Dois operadores de igualdade (=, !=)


Quatro operadores relacionais (<, >, <=, >=)
Dois operadores aditivos (+, )
Trs operadores multiplicativos (*, /, %)
Um operador unrio ()

! E ainda min(_, _) e max(_, _)


Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Esp. Stack com size


specification
sorts
Stack
constructors
make: > Stack;
push : Stack Element > Stack ;
observers
top: Stack >? Element ;
pop: Stack >? Stack;
size: Stack --> int;
others
isEmpty: Stack ;
domains
S: Stack ;
top (S) if not isEmpty (S);
pop (S) if not isEmpty (S);
axioms
S: Stack ; E: Element ;
top (push (S, E)) = E;
pop (push (S, E)) = S;
size(make()) = 0;
size(push(S, E)) = 1 + size(S);
isEmpty(S) iff size(S)=0;
end specification"

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Size: que categoria?


!

No construtor, pois no devolve um Stack

! Como permite observar uma propriedade do Stack (o

nmero de elementos) fica debaixo do ttulo observers.

Definir o domnio minimal: podemos aplicar size a


qualquer Stack? Sim: logo a funo total

! size est definido para Stacks arbitrrios, logo

precisamos de tantos axiomas como construtores:


! size (make()) = 0;#
! size (push(S, E)) = 1 + size(S);#

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Algum observer redundante?


!

Podemos definir top em termos de size? Ou pop? No.

! Mas isEmpty tem relao prxima com size.


!

Usamos a categoria others. Em vez de deitar fora o


isEmpty, re-classificamo-lo como others, e substitumos
os dois axiomas de isEmpty com um s axioma:
!

isEmpty(S) iff size(S) = 0;#

iff
isEmpty(S) if size(S) = 0;#
! not isEmpty(S) if size(S) != 0;#
!

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Observers ou Others?
! size observers #isEmpty others#
!
Axioma mais conciso
!
isEmpty(S) iff size(S) = 0;
! size observers #isEmptyobservers#
! Mas as propriedades dos observers tm que ser expressas
contra os constructors:
! isEmpty(make());#
! not isEmpty(push(S,E));#
!
isEmpty uma operao derivada (de size()=0)#
!

Ento normalmente isEmpty others

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Especificao de Element
! O que se pede ao gnero (sort) Element?
! Na verdade nada, apenas que exista.
! A especificao de Element pode ser a mais simples

possvel:
! specification

sorts
Element
end specification"

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Funcionalidade vs. Estrutura


!

Pelo que foi dito anteriormente:


!

A especificao um mtodo formal que descreve


abstractamente o que o programa deve fazer para ser
considerado correcto e no como deve ser feito.

! Do ponto de vista do programador, a especificao

representa um conjunto de implementaes possveis (i.e., as


funes descritas nos axiomas podem ser computadas por
diferentes instrues).
!

Ao separar o o qu do como focamse os aspectos


relevantes da especificao, mesmo sem qualquer informao
sobre a linguagem a ser utilizada no desenvolvimento. Quem
cria a especificao define implicitamente a dimenso desse
conjunto de implementaes, ficando ao cargo daquele que
implementa escolher a mais apropriada.
Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Mdulos (modules)
! O significado dos smbolos externos a uma especificao (ex.

O gnero Element na spc Stack) s fica definido quando a


componente est inserida num Mdulo.

Mdulo uma funo sobrejectiva de um conjunto de


nomes (N) para especificaes, de forma a que todos os
smbolos (gneros, operaes e predicados) tenham uma
especificao.

! Uma directoria de ficheiros implicitamente define um

mdulo, com N o conjunto dos ficheiros com extenso .spc


nessa directoria, e as especificaes associadas os respectivos
contedos desses ficheiros.
Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Das especificaes para classes Java


!

J temos uma especificao de Stacks de Elements

Vejamos agora uma implementao revolucionria:

public class RevolutionaryStack implements Cloneable {

}#

public
public
public
public
public
public
public
public
public
...

RevolutionaryStack () {...};
void push (Object e) {...};
void pop () {...};
Object peek () {...};
int Size () {...};
boolean empty () {...};
boolean equals (Object other) {...};
boolean empty () {...};
void clone () {...};

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Verificao
!

Suponhamos que queremos verificar que a implementao


est conforme especificao.

! Como relacionar Stack.spc + Element.spc com

RevolutionaryStack.java e Object ?
!

Mais, dentro delas, como relacionar as operaes (eg. pop


e top) com os mtodos da classe (pop e peek)?

Isto faz-se no refinement binding

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Refinement binding
refinement
Element is class Object
Stack is class RevolutionaryStack {
make: Stack is RevolutionaryStack();
push: Stack e: Element > Stack is
void push(Object e) ;
pop: Stack ? Stack is void pop();
top: Stack ? Element is Object peek();
isEmpty: Stack is boolean isEmpty();
size: Stack int is int size ();
end refinement

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

S-ar putea să vă placă și