Notação Z - Decoração Z é uma linguagem que estrutura um conjunto de teorias matemáticas Convenções são utilizadas para permitir o uso desta teoria matemática estruturada na descrição de programas O uso destas convenções permite-nos descrever espaço de estados e operações
Notação Z - Decoração Espaço de estados: Conjunto de estados iniciais Operações Cada operação possui variáveis de entrada e saída As operações são especificadas pela relação entre as variáveis de entrada e saída e um par de estados (o estado antes e depois da operação)
Notação Z - Decoração Em Z, um esquema especifica um espaço de estados sobre um tipo abstrado Contador valor, limite : N valor < limite O espaço de estados aqui é formado por todas as instâncias do contador que obedecem a invariante 0 valor < limite do relacionamento entre os atributos valor e limite
Notação Z - Decoração Para uma especificação descrever sistemas é necessário um estado inicial IniciaContador Contador valor = 0 limite = 100 Teorema: Contador IniciaContador
Notação Z - Decoração Uma operação especifica um estado anterior e posterior sobre um espaço de estados O símbolo ' identifica o estado final Incrementa Contador Contador ' valor ' = valor + 1 limite ' = limite As invariantes de relacionamentos devem ser mantidas antes e depois da operação
Notação Z - Decoração Uma operação pode conter valores de entrada e saída Valores de entrada são decorados no esquema que descreve a operação com o símbolo '?' Add Contador Contador ' incr? : N valor ' = valor + incr? limite' = limite
Notação Z - Decoração Valores de saída são decorados no esquema que descreve a operação com o símbolo '!' AddComRetorno Contador Contador ' incr? : N retorno! : N valor ' = valor + incr? limite' = limite retorno! = valor '
Notação Z - Decoração O símbolo é usado para abreviar a escrita de operações em que há mudança de estado É apenas uma convenção, não é uma operação Contador valor, limite : N valor < limite Incrementa Contador valor ' = valor + 1 limite ' = limite Incrementa valor, limite : N valor ', limite ' : N valor < limite valor ' < limite ' valor ' = valor + 1 limite ' = limite
Notação Z - Decoração O símbolo Ξ é usado para abreviar a escrita de operações em que não há mudança de estado Como, é apenas uma convenção, não é uma operação Contador valor, limite : N valor < limite Incrementa Contador valor ' = valor + 1 limite ' = limite RetornaAposIncrementa Ξ Incrementa retorno! : N retorno! = valor ' RetornaAposIncrementa valor, limite : N valor ', limite ': N retorno! : N valor < limite valor ' < limite ' valor ' = valor + 1 limite ' = limite retorno! = valor '
Notação Z - Exemplo Exemplo do livro de aniversário Uma agenda para armazenar nomes e datas de aniversário [NOME, DATA] Livro lnome : P NOME aniverisario : lnomes DATA lnome = dom aniversario
Notação Z - Exemplo Adicionar um novo nome no livro AdicionaNoLivro Livro nome? : NOME data? : DATA nome? lnome aniversario ' = aniversario {nome? data?}
Notação Z - Exemplo Encontrar uma data de aniversário EncontrarAniversario Ξ Livro nome? : NAME data! : DATA nome? lnome data! = aniversario(nome?)
Notação Z - Exemplo Lembrete Lembrete Ξ Livro dia? : DATA aniversariantes! : P NOME aniversariantes! = {a : lnome aniversario(a) = dia?}
Notação Z - Exemplo Estado inicial Inicializacao Livro lnome =
Notação Z - Exemplo A especificação está correta, mas não considera entrada de dados não esperados Adição de nomes que já existem Busca de nomes que não existem O sistema deve parar? Deve continuar operando e desconsiderar entrada de dados não esperadas?
Notação Z - Exemplo Especificação adicional Identificação de possíveis erros/exceções Cada operação vai possuir uma saída resultado! Operações com sucesso retornam ok Os outros retornos são entrada_existente ou entrada_nao_existente RETORNO = {ok, entrada_existente,entrada_nao_existente}
Notação Z - Exemplo Retorno de sucesso para a opreação AdicionaNoLivro O retorno é ok AdicionaNoLivro Livro nome? : NAME data? : DATA Sucesso resultado! : RETORNO resultado! = ok nome? lnome aniversario ' = aniversario {nome? data?} AdicionaNoLivro Sucesso
Notação Z - Exemplo Para completar a operação AdicionaNoLivro falta considerar o caso de que uma entrada existir EntradaExistente Ξ Livro nome? : NOME resultado! : RETORNO nome? lnome resultado! = entrada_existente
Notação Z - Exemplo Um esquema AdicionarNoLivro mais robusto NovoAdicionarNoLivro = ^ AdicionaNoLivro Livro nome? : NAME data? : DATA nome? lnome aniversario ' = aniversario {nome? data?} Sucesso resultado! : RETORNO resultado! = ok EntradaExistente Ξ Livro nome? : NOME resultado! : RETORNO nome? lnome resultado! = entrada_existente (AdicionaNoLivro Sucesso) EntradaExistente NovoAdicionarNoLivro Livro nome? : NOME data? : DATA resultado! : RETORNO (nome? lnome aniversario ' = aniversario {nome? data?} resultado! = ok) (nome? lnome aniversario ' = aniversario resultado! = entrada_existente)
Notação Z - Exemplo No caso da operação EncontrarAniversario o nome pode não existir EncontrarAniversario Ξ Livro nome? : NAME data! : DATA nome? lnome data! = aniversario(nome?) EntradaNaoExistente Ξ Livro nome? : NOME resultado! : RETORNO nome? lnome resultado! = entrada_nao_existente NovoEncontrarAniversario = ^ (EncontrarAniversario Sucesso) EntradaNaoExistente
Notação Z - Exemplo No caso da operação Lembrete não há erro a ser registrado Se não existe aniversariante na data passada, o retorno é um conjunto vazio Lembrete Ξ Livro dia? : DATA aniversariantes! : P NOME aniversariantes! = {a : lnome aniversario(a) = dia?} Sucesso resultado! : RETORNO resultado! = ok NovoLembrete = ^ Lembrete Sucesso
Exemplo - Login Conta de usuário Criar operação para adicionar usuário Criar operação para excluir usuário Criar operação para listar senha de usuário Caracter = {a, b, c, d,..., z} Login nome : seq1 Caracter senha : seq1 Caracter nome senha #senha < 8
Exemplo - Login Conta de usuário Criar operação para adicionar usuário Caracter = {a, b, c, d,..., z} Login nome : seq1 Caracter senha : seq1 Caracter nome senha #senha < 8 ListaLogins llogins : P Login AddLogin ListaLogins l? : Login l1,l2 : Login l1 llogins l2 llogins l1.nome = l2.nome l1 = l2 l : Login l llogins l.nome l?.nome llogins ' = llogin {l?}
Exemplo - Login Conta de usuário Criar operação para excluir usuário Caracter = {a, b, c, d,..., z} Login nome : seq1 Caracter senha : seq1 Caracter nome senha #senha < 8 ListaLogins llogins : P Login DelLogin ListaLogins nome? : seq1 Caracter l1,l2 : Login l1 llogins l2 llogins l1.nome = l2.nome l1 = l2 llogins ' = llogins \ {l : Login l llogin l.nome = nome? l}
Exemplo - Login Criar operação para listar senha de usuário Caracter = {a, b, c, d,..., z} Login nome : seq1 Caracter senha : seq1 Caracter nome senha #senha < 8 ListaLogins llogins : P Login l1,l2 : Login l1 llogins l2 llogin l1.nome = l2.nome l1 = l2 ListSenha Ξ ListaLogins nome? : seq1 Caracter lsenhas! : P (seq1 Caracter) lsenhas! = {s : seq1 Caracter l Login l.nome = nome? l.senha}