Maneira sintética e maneira analítica

A maioria de nós, incluindo outros pesquisadores formais do projeto de verificação, confia na maneira “analítica” de verificação do programa. Isto é, programa primeiro, verificação mais tarde. No entanto, usar essa maneira significa que escrevemos um programa em um determinado idioma e, depois disso, verificamos o programa que satisfaz a especificação que queremos; A linguagem de programação não tem restrições sobre seus programas que podem ocorrer em relação à especificação. Por outro lado, ao usar idiomas “sintéticos” como o COQ, especificamos a especificação com precisão e primeiro. Agradecendo que há generalização da correspondência de curry-howard, o programa pode ser gerado se e somente se provarmos que a especificação do programa estiver correta.

Aqui vimos duas maneiras opostas de verificação do programa, analítico vs sintético.
Eu não mencionaria o que é melhor porque os dois lados têm pontos fracos.
Por exemplo, a maneira sintética sempre pode ter um programa trivial. (Mesmo se escrevermos especificações S_1, … S_N e se esquecermos de adicionar uma especificação S_ {n+1} Que precisamos, sempre podemos ter o programa sintético trivial. E, a técnica de prova em linguagem sintética, como o COQ, às vezes é muito mais difícil que a verificação formal da análise do programa usando aproximação. )

Condição de guarda

Em relação ao compilador de canetas, atualmente definimos a árvore de sintaxe, seu gráfico de programas e a matriz de representação, ou seja, estamos desenvolvendo o lado analítico.
Particularmente, em relação ao gráfico do programa, não decidimos como lidar com loops no gráfico.
Uma das maneiras analíticas de verificação de loop é a “análise invariante”, que é estudada na teoria da lógica de Hoare. No entanto, a análise invariante precisa de especificar o que é o invariante e pode ser difícil encontrá -la nos casos. Então como lidar com loops? Para a pergunta, gostaríamos de aplicar uma maneira sintética ao compilador de caneta. É chamado de “condição de guarda”.
A condição de guarda afirma que a condição da ramificação do loop possui estrutura de dados indutiva e, cada vez que atingimos a condição, precisamos encolher a estrutura e deve encolher apenas uma “estrutura pontual”, quebrando o loop.
Por exemplo, o CoQ Compiler usa a condição de guarda para garantir que os programas no Coq parem e são analisados ​​estaticamente.

Muitos compiladores, como solidez, usam inteiro, mas podemos não precisar.
Em vez disso, temos números naturais (números positivos e números inteiros como no estilo Coq).
Números negativos podem ser representados por números naturais em contabilidade de entrada dupla.
Podemos não precisar de números inteiros de maneiras formais.

Às vezes, dizemos que a condição do ramo de loop é “noeteriano” se satisfazer a condição de guarda, uma vez que a sequência da condição está descendo e tem o fim, pois sequências descendentes na geometria algébrica são noeterianas se tiver o ponto final nomeado de um grande matemático “Emmy Noether”.

Códigos de opções formais

Em tais suposições, não podemos usar o EVM ADD Diretório opcode para adicionar dois números desde ADD Funciona exatamente como definido no EVM.
Temos estruturas de dados indutivas e precisamos incorporá -las ao EVM. Como o código EVM incorporado funciona e é chamado no EVM, a verificação estática não significa, mesmo se verificarmos o código cuidadosamente no tempo de compilação. Portanto, na incorporação da estrutura de dados, temos que definir a adição formal FADD para ser adição com a verificação da condição de contorno, FMUL para ser multiplicação com a verificação da condição de contorno e assim por diante. Obviamente, os preços do gás dos códigos de operações formais devem ser baratos.

Fontesethresear

By victor

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *