Execução simbólica é um caso de interpretação abstrata?

Respostas:

22

Não conheço um artigo relacionado à comparação entre execução simbólica e interpretação abstrata. Também não acho que seja necessário. Ler as descrições originais dessas duas técnicas deve ser suficiente.

  • King, Execução Simbólica e Teste de Programa , 1976
  • Primo, Primo, Interpretação Abstrata: um Modelo de Rede Unificada para Análise Estática de Programas por Construção de Aproximação de Pontos Fixos , 1977

(Por outro lado, se houver alguma conexão inesperada, vale a pena descrever. Mas duvido muito que seja esse o caso.)

A idéia principal da execução simbólica é que, em um ponto arbitrário da execução, você pode expressar os valores de todas as variáveis ​​como funções dos valores iniciais. A idéia principal da interpretação abstrata é que você pode explorar sistematicamente todas as execuções de um programa por uma série de super aproximações. (Eu posso ouvir vários entusiastas da IA ​​gemendo na aproximação anterior.)

Assim, pelo menos na formulação original, a execução simbólica não estava preocupada em explorar todas as execuções possíveis. Você pode ver isso mesmo no título: inclui a palavra 'testing'. Mas aqui está mais da Seção 8: "Para programas com árvores de execução infinitas, o teste simbólico não pode ser exaustivo e nenhuma prova absoluta de correção pode ser estabelecida".

Por outro lado, a interpretação abstrata visa explorar todas as execuções. Para isso, utiliza vários ingredientes, um dos quais muito semelhante à idéia principal de execução simbólica. Esses ingredientes são (1) estados abstratos, (2) união e ampliação (portanto, 'treliça' no título).

Estados abstratos.O estado concreto de um programa em um determinado momento é basicamente uma captura instantânea do conteúdo da memória (incluindo o próprio código do programa e o contador do programa). Isso tem muitos detalhes, o que é difícil de rastrear. Ao analisar uma propriedade específica, você pode ignorar grandes partes do estado concreto. Ou você pode querer se importar apenas se uma variável específica é negativa, zero ou positiva, mas não se importa com seu valor exato. Em geral, você deseja considerar uma versão abstrata do estado concreto. Para que isso funcione, você deve ter uma propriedade de comutatividade: se você pegar um estado concreto, executar uma instrução e abstrair o estado resultante, deverá obter o mesmo resultado como se abstraísse o estado inicial e, em seguida, execute o mesmo declaração, mas no estado abstrato. Esse diagrama de comutatividade aparece nos dois artigos. Essa é a ideia comum. Novamente, a interpretação abstrata é mais geral, pois não determina como abstrair um estado - apenas diz que deve haver uma maneira de fazê-lo. Por outro lado, a execução simbólica diz que você usa expressões (simbólicas) que mencionam os valores iniciais.

Juntando e Alargando. Se a execução do programa atingir uma determinada instrução de duas maneiras diferentes, a execução simbólica não tenta mesclar as duas análises. É por isso que a citação acima fala sobre árvores de execução, em vez de punhais. Mas lembre-se de que a interpretação abstrata quer abranger todas as execuções. Portanto, ele solicita uma maneira de mesclar as análises de duas execuções no ponto em que elas têm o mesmo contador de programa. (A junção poderiaseja muito burro ({a} junte-se a {b} = {a, b}), de modo que seja equivalente ao que a execução simbólica faz.) Em geral, a união em si não é suficiente para garantir que você acabará analisando todas as execuções. (Em particular, a junção burra mencionada anteriormente não funcionará.) Considere um programa com loops: "n = input (); para i no intervalo (n): dostuff ()". Quantas vezes você deve dar a volta no circuito e continuar se juntando? Nenhuma resposta fixa funciona. Assim, é necessário algo mais, e isso está aumentando , o que pode ser visto como uma heurística. Suponha que você tenha percorrido o circuito três vezes e tenha aprendido que "i = 0 ou i = 1 ou i = 2". Então você diz: hmmm, ... vamos ampliar e você obtém "i> = 0". Novamente, a interpretação abstrata não diz como fazer o alargamento - apenas diz quais propriedades o alargamento deve ter para dar certo.

(Desculpe por esta resposta longa: eu realmente não tive tempo para reduzi-la.)

Radu GRIGore
fonte
5

Eu acho que isso é feito em um sentido muito superficial. O primeiro passo da interpretação abstrata é identificar uma semântica de coleta concreta. Em vez de descrever a evolução de um único estado, a coleta de semântica descreve a evolução de conjuntos de estados. Como a execução simbólica raciocina sobre as representações de conjuntos de estados, pode-se argumentar que representa a semântica concreta do programa. Não conheço uma correspondência mais precisa sendo elaborada.

Vijay D
fonte
Obrigado. Mas se SE representa a semântica concreta, então qual é a semântica abstrata. Sem a semântica abstrata, não se pode dizer que é um caso de IA. Você poderia explicar um pouco mais? A propósito, eu li o seu artigo, os solucionadores SAT são AI, é realmente interessante.
Qsp
3
Primeiro, abstração é uma noção reflexiva, o que significa que toda estrutura é uma abstração trivial de si mesma através da função de identidade. Segundo, a execução simbólica não computará toda a semântica concreta porque apenas alguns caminhos do programa são explorados; portanto, nesse sentido, há uma abstração subestimada.
Vijay D
2

Veja Patrick Cousot. Métodos iterativos de construção e aproximação de pontos de correção de operadores monótonos em árvores, analisam sessões instantâneas de programas (Métodos iterativos para construção e aproximação de pontos de correção de operadores monótonos em treliças, análise estática de programas). Thèse is Sciences Mathématiques, Universidade Joseph Fourier, Grenoble, França, 21 de março de 1978. https://cs.nyu.edu/~pcousot/publications.www/CousotTheseEsSciences1978.pdf (infelizmente em francês), página (3) -27 a (3) -29

Patrick Cousot
fonte