Esquemas e suas operações
Forma geral:
Ident.
Declarações
Predicado
ou
Ident. =^ [Declarações | 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
given sets
[Pessoa, Fone]
Agenda =^ [ag: Pessoa Fone; con: IP Pessoa | con = dom ag]
ou, alternativamente,
Agenda
ag: Pessoa Fone
con: IP Pessoa
con = dom ag
Renomeação em esquemas
Forma geral:
– nomeEsquema [nomeNovo / nomeAtual]
Exemplo: Aniversarios =^ Agenda[aniv/ag]
Resulta em
Aniversarios
aniv: Pessoa Fone
con: IP Pessoa
con = dom aniv
Inclusão de Esquemas
Forma geral:
Ident.
nomeEsquema
Declarações
Predicado
Exemplo:
ContaAg
Agenda
qtd: IN
qtd = # con
ContaAg
ag: Pessoa Fone
con: IP Pessoa
qtd: IN
con = dom ag
qtd = # con
Decoração de esquemas
Forma geral: nomeEsquema’
Exemplo:
ContaAg’
ag’: Pessoa Fone
con’: IP Pessoa
qtd’: IN
con’ = dom ag’
qtd’ = # con’
Convenções sobre esquemas
Forma geral: nomeEsquema
Usado em operações para denotar
mudança de estado
Exemplo:
Agenda
Agenda
Agenda’
Agenda
ag, ag’: Pessoa Fone
con, con’:IP 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:
Agenda
Agenda
ag=ag’
con=con’
Agenda
ag, ag’: Pessoa Fone
con, con’: IP Pessoa
con = dom ag
con’ = dom ag’
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
ERRO
Sucesso
Agenda
m!: Resultado
p?: Pessoa
m! = opOK
m!: Resultado
p? con
m! = pessoaInexistente
^ (Consulta Sucesso) ERRO
Consulta =
0
Outras operações
nomeEsquema1 nomeEsquema2
– Junta declarações
– Implicação dos predicados
nomeEsquema1 nomeEsquema2
– Junta declarações
– Equivalência dos predicados
Operação ocultamento (“hiding”)
Corresponde a quantificar
existencialmente variáveis em questão
Exemplo: QualquerFone = Consulta0\(p?)
QualquerFone
Agenda
f!: Fone
p?:Pessoa
p? con
f! = ag(p?)
Composição seqüencial
Sejam O1 e O2 dois esquemas como
operações
O1;O2 representa a composição
seqüencial entre O1 e O2
Significando que o estado final de O1 irá
coincidir com o estado inicial de O2
entrada(?){
S
O1
S’ = S
O2
Estado intermediário
S’
}saída (!)
Composição seqüencial
Sejam O1 e O2 os seguintes esquemas:
O1
O2
x, x’: T
x, x’: T
P(x, x’)
Q(x, x’)
A composição seqüencial de O1 e O2, O1 ; O2, é definida por:
^ (O [x /x’] O [x /x]) \ (x )
O1 ; O2 =
1 0
2 0
0
ou
O1 ; O2
x, x’: T
x0:T P(x, x0) Q(x0, x’)
Exercício: se p? dom ag então Inclui0 ; Exclui0 Agenda,
onde
Exclui0 =^ [ 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: IP ...
– Esquemas:
nomeTipo
...
...
Tipos em Z
Os naturais ( IN), inteiros (Z) e reais ( IR)
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 subexpressões que compõem o conjunto
arbitrário, através de um processo de
normalização
Processo de normalização
Seja Pares == { n: IN | 2 * n }
y: Pares
R: X Y
f: X Y
s: seq X
y: IN
y Pares
R: IP(X Y)
f: IP(X Y)
fXY
s: IP(X Y)
s seq X
Esquema como tipo
Semelhante aos registros de PASCAL
Componentes são acessados através
da operação de projeção (.)
Agenda
ag: Pessoa Fone
con: IP Pessoa
con = dom ag
a, b: Agenda
a . ag = b . ag
Projeção
Mapeamentos (“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