Curso Prático de Métodos Formais Revisando Pré-Condições e Provando Refinamentos de Especificações em Z (Alexandre Mota e Augusto Sampaio) Tópicos Abordados Exemplo: A Tabela de Símbolos (TS) Pré-condições: Estruturando Provando Refinamentos – Mesmo Estado – Estados Diferentes Exemplo: A Tabela de Símbolos [VAL,SYM] Update D State s?: SYM v?: VAL s? dom st st’ = st {s? v?} Delete D State s?: SYM s? dom(st) st’={s?} st ST == SYM VAL State st: ST NotPresent X State s?: SYM rep!: Report s? dom(st) rep!=Symbol_not_present Report ::= Ok | Symbol_not_present ^ [rep!:Report | rep!=Ok] Success = StDelete ^ = (Delete Success) NotPresent Pré-condição: Estruturando Disjunções: - or. Por exemplo, considere StDelete: pre StDelete pre Delete pre NotPresent A estruturação é realizada a partir do cálculo intermediário das pré-condições envolvidas. Para o exemplo acima temos: theorem preStDelete " State; s?:SYM; v?: VAL pre Delete pre NotPresent Passos da prova: 1. try lemma preStDelete; 2. cases; (cálculos intermediários) 3. prove by reduce; 4. next; (próximo predicado) 5. prove by reduce; (2 objetivo) 6. next; (objetivo OU) 7. prove by reduce; (objetivo final) Refinamento de Operações (Mesmo Estado) Verificar se operações compostas refinam operações simples; As obrigações são: a aplicabilidade e a corretude. Há simplificação dos teoremas pois o esquema Retrieve é a relação identidade Delete StDelete ??? theorem aplicMesmoEstado pre Delete pre StDelete theorem corrMesmoEstado pre Delete StDelete Delete Estratégia para Refinamento Os teoremas de refinamento usam as pré-condições mais de uma vez; Portanto, neste caso é interessante guardar o resultado; Desta forma, deve-se calcular as pré-condições; Armazenar os resultados obtidos como esquemas; Introduzir estes resultados nas obrigações de prova. \begin{schema}{Delete} ... \end{schema} \begin{schema}{preDeleteRes} ... \end{schema} \begin{theorem}{aplicacao} ... preDeleteRes ... \end{theorem} Refinamento de Dados (funcional) No caso geral, é necessário estabelecer uma relação entre os dois estados (abstrato e concreto); Aqui, consideraremos que esta relação é sempre funcional. Inicialização: Cinit Retr’ Ainit Aplicabilidade: pre Aop Retr pre Cop Corretude: pre Aop Retr Cop Retr’ Aop Refinamento de Dados (Geral) Propor um novo estado; Propor um esquema Retrieve; Propor refinamentos para as operações; Construir as obrigações de prova como teoremas; Provar os teoremas. Refinamento de Dados (Exemplo 1) State1 st1: seq(SYM VAL) Retrieve1 State State1 Update1 D State1 s?: SYM v?: VAL st = ran st1 s? dom(ran st1) st1’ = st1 ^ (s?, v?) A estratégia geral para o cálculo de refinamento é calcular as pré-condições envolvidas e usar estes resultados nos teoremas de aplicabilidade e corretude. Refinamento de Dados (Exemplo 1 - continuação) Calcular a pré-condição de Update e de Update1; Armazenar como esquemas; Usar esquema em teoremas. Exemplo: Calcular SymtabA SymtabC, considerando simplesmente as operações Update e Update1 preUpdateRes State s?: SYM v?: VAL preUpdate1Res State1 s?: SYM v?: VAL s? dom st s? dom (ran st1) Refinamento de Dados (Exemplo 1 - continuação) theorem inicializacao Init1 \land Retr1’ \implies Init theorem aplicacao preUpdateRes \land Retr1 \implies preUpdate1 theorem corretude preUpdateRes \land Retr1 \land Update1 \land Retr1’ \implies Update Refinamento de Dados (Exemplo 2) Report ::= Yes | No Especificação Abstrata Especificação Concreta State b: bag IN State1 s: seq IN find X State n?: IN rep!: Report find1 X State1 n?: IN rep!: Report n? dom b rep! = Yes n? ran s rep! = Yes Refinamento de Dados (Exemplo 2 - Escolha do Retr) Alternativa 1: Retr1 State State1 b = items s Alternativa 2: Retr2 State State1 dom b = ran s " n dom b b(n) = #(s |` {n})