domingo, 26 de outubro de 2008

Comando: Instantiate

Parte I - Uso do instante para eliminar quantificador existencial da conclusão.

Problema:

As vezes, para concluir uma prova (teorema da inicialização, por exemplo), pode ser necessário resolver um problema com o formato:

[set of premiss \implies] \exist variable : TYPE @ predicate

Nesta situação, o quantificador existencial precisa ser eliminado. Para realizar isto, o especificador precisa encontrar uma witness para eliminar o quantificador existencial utilizando o comando instantiate. Em alguns casos, é necessário definir a witness para depois poder utilizá-la. Na notação acima, o que está entre colchetes é opcional.


Uma vez em posse da witness, utiliza-se o comando instantiate para instrui o provador a aplicar a one-point-rule e transformar o predicado para o predicado.

[set of premiss \implies] witness \in TYPE \land predicate[witness/variable]
\lor \exist variable : TYPE @predicate


O segundo passo da transformação é mostrado a seguir e é aplicado se a parte opcional destaca entre colchetes estiver presente no predicado.

set of premiss \land (\not (witness \in TYPE \land predicate[witness/predicate])) \implies \exist variable @predicate



Seja C um predicado contendo um quantificador existencial. Seja A um conjunto de premissas. Então, o resultado de um comando de instanciação da variável declarada em C resulta nos seguintes passos de prova:

1. A => C
2. A => B or C
3. A and NOT(B) => C

Do passo 1 para o 2 é aplicado a One-Point-Rule:





Do passo 2 para o passo 3 é aplicado transformação lógica.





quarta-feira, 22 de outubro de 2008

Usando Grules

O uso de grules aumenta significativamente o grau de automação de uma prova, pois em situações específicias elimina a necessidade do especificador lidar com problemas referentes a tipos e restrições de valores durante a prova de teoremas (Domain Check e Preconditions por exemplo). Abaixo descrevo como inserir uma grule no Sistema Policial e depois apresento um conjunto de exemplos de situações em que grules podem ser utilizadas.

A quarta versão do Sistema Policial não adiciona nenhuma mudança substancial. Apenas foi adicionado na prova uma regra de automação do tipo grule. O teorema

\begin{theorem}{grule gCPFMaxType}
CPF \in \power \num
\end{theorem}

é usado para dizer ao Z/Eves qual tipo maximal de CPF, sem que seja necessário realizar a expansão de CPF. Isto é, se durante a prova de alguma operação o Z/Eves produzir como objetivo de prova o predicado:

CPF \in \power \num

Então este predicado será convertido a true sem que seja necessário invocar a definição de CPF.

O Z/Eves gera grules quando são definidas constantes em axiomatic-box e generic-box como pode ser observado no Reference Manual 1.5, pag. 20. Free types e schemas também geram grules (descobri isto mexendo). Para mais informações sobre grule consulte o Z/Eves User's Guide 2.3, pag. 41. Um link para um arquivo contendo um conjunto de exemplos ilustrando o uso de grules no Z/Eves está disponível no final da página. Abaixo, discuto estes exemplos.

Grules_Example01 - São definidos dois tipos. É apresentado um teorema em que o predicado envolve o tipo maximal dos tipos defindos antes. Note que para provar este teorema o especificador precisa instruir o Z/Eves manualmente (realizando expansão - i.e., Invoke).

Grules_Example02 - O mesmo exemplo anterior, só que agora foi criada uma grule para informar ao Z/Eves o tipo maximal de B. Para provar o teorema sobre o tipo de B não é necessário expandir B.

Voce deveria notar nos dois exemplos anteriores que o Z/Eves não criou nenhum teorema para os tipos inseridos pelo usuário. Foram inseridos given sets e abbreviations. Nestas situações o especificador deve se encarregar de criar grules para os tipos, se houver necessidade.

Grules_Example03 - Um exemplo maior, utilizando given sets e schemas. Note que quando um schema é definido e é utilizado como tipo, o Z/Eves gera automaticamente a grule SchemaName$declaration. Note também que, se um schema é definido e não é utilizado como tipo, o Z/Eves não gera a regra de automação do tipo grule para o schema. Neste exemplo, o tipo C não foi utilizado como tipo e por isso o Z/Eves não gerou uma grule associada a TIPO_C.

Grules_Example04 - O exemplo anterior, com uma grule adicionada para TIPO_C. A grule não está provada. Não consegui realizar a prova desta grule. Se conseguir, envie-me a resolução. Thanks ;-)

Grules_Example05 - Neste exemplo uma grule é utilizada para adicionar informação sobre restrição de valor. Para isto, dois valores, minvalue e maxvalue, foram definidos através de um axiomatic-box. Ainda no axiomatic-box há uma rule relacionando os dois valores através do predicado: minvalue \leq maxvalue

No teorema ListInitialisation um dos goals é mostrar que: 0 \leq minvalue. A grule foi utilizada para evitar que o especificador tivesse que lidar com a expansão de \nat ao realizar a prova de ListInitialisation.

Este teorema foi propositalmente posto em dois lugares, antes e depois da grule. Pretendeu-se assim mostrar o ganho de automação com o uso da grule.

Note que este exemplo difere bastante dos anteriores, pois usou grules para adicionar informação sobre uma restrição de valor e não sobre tipos.


A quarta versão do sistema policial está disponível em: http://www.dcc.ufba.br/~diego052/experimento/zevesblog/SistemaPolicial_v4.zip


O arquivo de exemplos de uso de grules está disponível em: http://www.dcc.ufba.br/~diego052/experimento/zevesblog/Grules_Examples_01-05.zip