L'interpretazione astratta è un concetto molto generale e, a seconda di chi chiedi, riceverai spiegazioni diverse perché concetti versatili ammettono molteplici prospettive. Il punto di vista in questa risposta è mio e non credo che sia generale.
Durezza computazionale come motivazione
Cominciamo con problemi di decisione, le cui soluzioni hanno una struttura come questa:
C'è spesso un limite inferiore NP-duro sulla procedura. Il controllo delle proprietà semantiche dei programmi è persino indecidibile. Cosa possiamo fare?
Facciamo due osservazioni. Innanzitutto, a volte possiamo risolvere istanze specifiche del problema anche se non possiamo risolvere il problema generale. In secondo luogo, applicazioni come l'ottimizzazione del compilatore tollerano l'approssimazione in quanto è utile un compilatore che elimini alcune ma non tutte le fonti di inefficienza. Per rendere precisa questa intuizione, dobbiamo rispondere:
- Cosa significa formalmente risolvere alcune, ma non tutte le istanze problematiche?
- Qual è una soluzione approssimativa a un problema decisionale?
Idea di interpretazione astratta 1: modifica la dichiarazione del problema
Per me, una visione fondamentale dell'interpretazione astratta è quella di cambiare la formulazione del problema in modo che invece di chiedere una risposta Sì / No , chiediamo una risposta Sì / No / Forse .
Di conseguenza, ogni problema ha una soluzione temporale banale e costante (output Forse ). Ora possiamo spostare la nostra attenzione sulla derivazione di una procedura che non sempre produce Forse . Per tornare alle domande precedenti, una soluzione che funziona per alcune istanze problematiche è quella che ritorna Forse su problemi che non può risolvere. Inoltre, Forse è un'approssimazione di Sì e No perché non siamo certi di quale sia la risposta.
Questa idea non è limitata ai problemi di decisione. Considera questi problemi relativi ai programmi.
- Quali righe di codice nel programma sono morte (non verranno mai eseguite)?
- Quali variabili nel programma hanno valori costanti?
- Quali affermazioni nel programma sono state violate?
In tutte queste situazioni, possiamo passare da una soluzione esatta a una approssimativa considerando soluzioni che presentano alcune incertezze.
- Che cos'è un insieme di righe di codice che è morto?
- Che cos'è un insieme di variabili nel programma che hanno valori costanti?
- Qual è una serie di affermazioni nel programma che non sono state violate?
I set prodotti non devono necessariamente essere i più grandi. Questa idea è estremamente generale e si applica a problemi che hanno poco a che fare con l'analisi del programma.
- mn[ a , b ]
- mnK
- Invece di chiedere gli incarichi soddisfacenti a una formula, possiamo chiedere un set che contenga gli incarichi soddisfacenti.
Si noti che non solo abbiamo modificato il problema, ma lo abbiamo anche rigorosamente generalizzato perché una soluzione al problema originale è ancora una soluzione al problema modificato. La grande domanda senza risposta ora è: come possiamo trovare una soluzione approssimativa?
Idea interpretativa astratta 2: caratterizzazione a virgola fissa delle soluzioni originali
tSR e a c h (s)StR e a c h (s)
X= { s } ∪ { w | v è in X e ( v , w ) è un margine }
nnS
La caratterizzazione a virgola fissa è una decisione di progettazione. Esistono molte diverse caratterizzazioni di un insieme di soluzioni. Ognuno di essi può avere diversi vantaggi. Nel caso dei linguaggi di programmazione, abbiamo più struttura che limitarci a gestire un grafico. Le equazioni in punti fissi a cui teniamo possono essere definite mediante induzione sulla struttura del programma di input. Questa idea non è specifica per i programmi. Quando si applica l'interpretazione astratta ad elementi di un linguaggio strutturato come grammatica, formula logica, programma, espressione aritmetica, ecc., Possiamo definire punti fissi mediante induzione sulla struttura di un oggetto sintattico.
Dando questa caratterizzazione a virgola fissa, ci stiamo impegnando per un modo specifico di soluzioni informatiche. In realtà non calcoleremo questo punto fisso perché è difficile almeno quanto risolvere il problema originale, il che ci porta al passaggio successivo.
Idea di interpretazione astratta 3: approssimazione a punto fisso
FLsolMMLML
LMFsol
L'intuizione alla base del trasferimento a virgola fissa potrebbe essere penetrante. Possiamo pensare a un punto fisso come al limite di una catena (possibilmente transfinita) di elementi. Il calcolo di soluzioni approssimative equivale ad approssimare questo limite, cosa che possiamo fare approssimando elementi della catena.
StSt
Idea di interpretazione astratta 4: algoritmi di approssimazione a punto fisso
Tutto ciò che è stato visto finora è stato un risultato di esistenza matematica. Il passaggio finale consiste nel calcolare l'approssimazione. Quando il reticolo delle approssimazioni è finito (o se la condizione della catena ascendente / discendente è soddisfatta), possiamo usare una semplice procedura iterativa. Se il reticolo è infinito, una procedura iterativa potrebbe non essere sufficiente, sebbene il calcolo di un punto fisso possa essere comunque decidibile. In questa situazione, vengono utilizzate molte tecniche per approssimare ulteriormente la soluzione o per passare a una soluzione esatta più velocemente di un algoritmo di iterazione ingenuo. Nel contesto del calcolo di una soluzione, senti termini come ampliamento , restringimento , iterazione della strategia , accelerazione , ecc.
Sommario
A mio avviso, l'interpretazione astratta fornisce una base matematica per la nozione di astrazione nello stesso modo in cui la logica matematica fornisce una base matematica per il ragionamento. Le soluzioni a molti problemi a cui teniamo hanno caratterizzazioni come punti fissi. Questa osservazione non si limita ai problemi del linguaggio di programmazione e nemmeno all'informatica. Le soluzioni approssimative possono essere caratterizzate come approssimazioni di punti fissi e sono calcolate con algoritmi specializzati. Queste caratterizzazioni e algoritmi sfrutteranno la struttura dell'istanza del problema. Nel caso dei programmi, questa struttura è data dalla sintassi della lingua.
Calcolare approssimazioni a problemi che non hanno una metrica naturale è un'arte costantemente sviluppata e raffinata dai professionisti. L'interpretazione astratta è una teoria matematica per la scienza dietro questa arte.
Riferimenti
Ci sono molti buoni tutorial sull'interpretazione astratta che puoi leggere.
- Un'introduzione casuale a Abstract Interpretation , Patrick Cousot (lavoro congiunto con Radhia Cousot), Workshop on Systems Biology and Formals Methods (SBFM'12)
- Una dolce introduzione alla verifica formale dei sistemi informatici mediante interpretazione astratta , Patrick e Radhia Cousot, Marktoberdorf Summer School 2010.
- Lezione 13: Astrazione Parte I , Patrick Cousot, Interpretazione astratta, Corso MIT.
- Introduzione all'interpretazione astratta , Samson Abramsky e Chris Hankin, Interpretazione astratta delle lingue dichiarative, 1987.
- Interpretazione astratta e applicazione ai programmi logici , Patrick e Radhia Cousot, 1992. Le prime due sezioni hanno una panoramica generale di alto livello con diversi esempi.