Esquemas e suas operações
Forma geral:
Ident.
Declarações ou Ident. = [Declarações | Predicado]
Predicado
^
Esquemas são estruturas que agrupam variáveis e predicados que restringem seus valores. Seu nome possui escopo global, mas as declarações e
predicados possuem escopo local
Exemplos de esquemas
[Pessoa, Fone]
Agenda = [ag: Pessoa Fone; con: P Pessoa | con = dom ag]
ou, alternativamente, Agenda
ag: Pessoa Fone con: P Pessoa
con = dom ag
^ I
I
given sets
Renomeação em esquemas
Forma geral:
– nomeEsquema [nomeNovo / nomeAtual]
Exemplo: Aniversarios = Agenda[aniv/ag] ^
I
Aniversarios
aniv: Pessoa Fone con: P Pessoa
con = dom aniv
Resulta em
Inclusão de Esquemas
Forma geral:
Ident.
nomeEsquema Declarações Predicado
Exemplo:
I
ContaAg Agenda
qtd: N
qtd = # con
I
ContaAg
ag: Pessoa Fone con: P Pessoa
qtd: N
con = dom ag qtd = # con
I
Decoração de esquemas
Forma geral: nomeEsquema’
Exemplo:
I
ContaAg’
ag’: Pessoa Fone con’: P Pessoa
qtd’: N
con’ = dom ag’
qtd’ = # con’
I
Convenções sobre esquemas
Forma geral: nomeEsquema
Usado em operações para denotar mudança de estado
Exemplo:
Agenda Agenda
Agenda’ I
Agenda
ag, ag’: Pessoa Fone con, con’: P Pessoa
con = dom ag con’ = dom ag’
Convenções sobre esquemas
Forma geral: nomeEsquema
Usado em operações para denotar que não há mudança de estado
Exemplo:
I Agenda
ag, ag’: Pessoa Fone con, con’: P Pessoa
con = dom ag con’ = dom ag’
ag = ag’
con = con’
Agenda
Agenda ag=ag’
con=con’
Usando e em operações
Inclui0
Agenda p?: Pessoa f?: Fone
ag’ = ag {p? f?}
con’ = con {p?}
Consulta0
Agenda p?: Pessoa f!: Fone p? con f! = ag(p?)
Variáveis de entrada (?)
Variável de saída (!)
Conjunção e disjunção de esquemas
Seja Resultado ::= opOK | pessoaInexistente Sucesso
m!: Resultado m! = opOK
ERRO
Agenda p?: Pessoa
m!: Resultado p? con
m! = pessoaInexistente
Consulta = (Consulta^ 0 Sucesso) ERRO
Outras operações
nomeEsquema
1 nomeEsquema
2– Junta declarações
– Implicação dos predicados
nomeEsquema
1 nomeEsquema
2– Junta declarações
– Equivalência dos predicados
Operação ocultamento (“ hiding”)
Corresponde a quantificar
existencialmente variáveis em questão
Exemplo: QualquerFone = Consulta
0\(p?)
QualquerFone
Agenda f!: Fone
p?:Pessoa
p? con f! = ag(p?)
Composição seqüencial
Sejam O
1e O
2dois esquemas como operações
O
1; O
2representa a composição seqüencial entre O
1e O
2
Significando que o estado final de O
1irá coincidir com o estado inicial de O
2O
1 S’ = SO
2{
entrada(?)
}
saída (!)Estado intermediário S
S’
Composição seqüencial
Sejam O1 e O2 os seguintes esquemas:
O1 x, x’: T P(x, x’)
O2 x, x’: T Q(x, x’)
A composição seqüencial de O1 e O2, O1
;
O2, é definida por:O1
;
O2 = (O1[x0/x’] O2[x0/x]) \ (x0) ouO1
;
O2 x, x’: T x0:T P(x, x0) Q(x0, x’)
Exercício: se p? dom ag então Inclui0
;
Exclui0 Agenda, ondeExclui0 = [ Agenda; p?:Pessoa |
p? con ag’ = {p?} ag con’ = con\{p?}]
^
^
Operação piping
Semelhante à composição seqüencial, exceto por considerar as comunicações ao invés do estado
Portanto, P>>Q significa que as saídas de P corresponderão as entradas de Q
O predicado referente ao estado será simplesmente a conjunção dos
predicados de P e de Q
Tipos em Z
Há quatro formas de introduzir tipos em Z:
– Given sets: [ ... ]
– Produto cartesiano: ... ...
– Conjunto das partes: P ...
– Esquemas: nomeTipo I
...
...
Tipos em Z
Os naturais ( N), inteiros (Z) e reais ( R) são usualmente assumidos como pré- definidos
Conjuntos arbitrários são permitidos em declarações, mas nem sempre são tipos
– O tipo é derivado (inferência) das sub- expressões que compõem o conjunto arbitrário, através de um processo de normalização
I I
Processo de normalização
Seja Pares == { n: N | 2 * n } I
y: Pares y: N
y Pares I
R: X Y R: P(X Y) I
f: X Y f: P(X Y)
f X Y I
s: seq X s: P(X Y)
s seq X
I
Esquema como tipo
Semelhante aos registros de PASCAL
Componentes são acessados através da operação de projeção ( . )
I
Agenda
ag: Pessoa Fone con: P Pessoa
con = dom ag
a, b: Agenda
a
.
ag = b.
ag ProjeçãoMapeamentos (“bindings”)
Um esquema como tipo pode ser visto como um binding de variável para valor
Por exemplo: seja a: Agenda, tal que
ag{(josé,32213423)}, con {josé}
Então, aplicando o operador de projeção sobre a, referente a ag, nos dá
– a . ag = {(josé, 32213423)}
O operador
Aplica-se a nomes de esquemas,
retornando seu binding característico
Por exemplo: seja a: Agenda, tal como antes então
a = ag {(josé,32213423)}, con {josé}
Seu uso comum é Agenda’= Agenda, que implica ag’=ag con’=con
Um esquema é dito normalizado quando suas declarações estão normalizadas