Quanto è difficile ridurre la risoluzione alla parziale correttezza?


14

Se hai familiarità con la verifica del programma, è probabile che tu preferisca leggere la domanda prima dello sfondo . Se non hai familiarità con la verifica del programma, potresti comunque essere in grado di rispondere a questa domanda, ma probabilmente preferirai leggere prima lo Sfondo .

sfondo

Si afferma spesso che il controllo della correttezza parziale è indecidibile. Per motivi di discussione, scegliamo un modo molto particolare per rendere precisa questa affermazione, nello stile di Floyd - Hoare. Un diagramma di flusso è un digrafo con un nodo iniziale distinto da cui tutti i nodi sono raggiungibili. Un programma è un diagramma di flusso i cui nodi sono comandi. Esistono tre tipi di comandi (1) assunzioni assumono q , (2) asserzioni asseriscono q e (3) assegnazioni v: = e. Qui q è una formula fol (logica del primo ordine), e è un termine fol e v è una variabile.

Diciamo che un programma è parzialmente corretto quando c'è un modo per annotare ogni nodo x con una precondizione a (x) e una postcondizione b (x) tale che (1) la precondizione del nodo iniziale è valida, (2) { a (x) } x { b (x) } vale per tutti i comandi x , e (3) ( b (x) implica a (y) ) è valido per tutti i bordi da x a y . Qui le triple Hoare sono definite come segue:

  • { p } asserire q { r } significa che ( p implica ( q e r )) è valido
  • { p } assume q { r } significa che (( p e q ) implica che r ) è valido
  • { p } v: = e { r } significa che (( p con e sostituito per v ) implica che r ) è valido

Ecco una discussione ondulata sul perché del controllo questa parziale correttezza è indecidibile: una volta compilati alcuni a (x) e alcuni b (x) è necessario verificare se alcune formule fol sono valide e che è indecidibile.

Un modo tipico di codificare la terminazione in parziale correttezza è quello di aggiungere alcune asserzioni speciali che essenzialmente dicono "dall'ultima volta che sono stato eseguito, ci sono stati progressi verso la terminazione". Queste asserzioni di avanzamento devono essere posizionate in modo tale che tutte le camminate infinite sul diagramma di flusso (che iniziano dal nodo iniziale) contengano infinite asserzioni di avanzamento. Per essere più specifici, supponiamo che le asserzioni di avanzamento abbiano sempre la forma asserire u < v , dove u e v sono numeri interi positivi, sono precedute dall'assegnazione u : = f e sono seguite dall'assegnazione v : = u . Qui f è a funzione variante , u è il suo valore corrente e v è il suo valore precedente. Ora, dal momento che parliamo di "numeri interi positivi" e li confrontiamo, dobbiamo assicurarci che sia disponibile un po 'più di fol: diciamo che l'aritmetica di Peano è disponibile. (Non mi sento fortemente in merito a questa scelta. Sentiti libero di ignorare se conveniente.) Naturalmente, f può usare qualsiasi altra funzione e costante menzionata nel programma. (Si noti che l'aggiunta di ipotesi all'inizio del programma equivale all'introduzione di assiomi non logici.)

Ora, se il programma con affermazioni sullo stato di avanzamento è ancora parzialmente corretto, allora sappiamo che il programma originale termina.

Domanda

Dato un programma conclusivo, sembra difficile trovare funzioni varianti per le asserzioni sui progressi. Ma quanto è difficile? (So ​​che anche con l'enorme sfondo di cui sopra, ho ancora lasciato questa domanda un po 'aperta, o mal definita, a seconda di come vuoi guardarla.)

Per dirla diversamente: sto cercando un riferimento che formalizzi il problema di ridurre la risoluzione alla parziale correttezza e poi dica qualcosa sulla sua complessità. Una risposta che fa tutto questo sarebbe ovviamente benvenuta.


Fammi controllare se lo capisco. Quello che ci stai chiedendo ci darebbe, tra l'altro, un algoritmo che prende un programma che calcola una funzione ricorsiva totale e produce una prova di un'affermazione che la funzione è totale (sotto forma di funzioni varianti e prove che sono adatte )? Mi sembra terribilmente impensabile.
Andrej Bauer,

Andrej, sembra impensabile anche a me. Quello che sto chiedendo è una prova che è impensabile.
Radu GRIGore,

Risposte:


7

Un modo per rispondere a questo è considerare la complessità computazionale dei problemi di decisione per le classi di correttezza parziale e query di terminazione che sono note per essere decidibili. L'interpretazione astratta che utilizza il dominio poliedrico può inferire le annotazioni di correttezza parziale che menzionate nei casi in cui le annotazioni richieste sono congiunzioni di disuguaglianze lineari. Il calcolo della post-condizione astratta è esponenziale nel numero di variabili. Quindi c'è il sovraccarico di trovare il punto fisso. Vedi i primi articoli di Cousot per ulteriori informazioni su questo e sulla biblioteca di Apron se vuoi giocarci direttamente.

La ricerca di funzioni varianti è decidibile quando le funzioni variante sono lineari. Non sono riuscito a trovare una completa caratterizzazione della complessità di questo, ma "Termination of Linear Programs" di Tiwari ha una sezione che discute della complessità. Vedi anche "Un metodo completo per la sintesi di funzioni di classificazione lineare" di Podelski e Rybalchenko. Inoltre, Byron Cook ha lavorato per sfruttare l'interpretazione astratta per aiutare a costruire argomenti di terminazione. Vedere, ad esempio, "Classifica astrazioni" e "Analisi di varianza da analisi di invarianza". Questi possono fornire ulteriori informazioni sulla relazione tra correttezza parziale e risoluzione.

link:


1
Spero che non ti dispiaccia che io modifichi la tua risposta e renda attivi i collegamenti.
Andrej Bauer,

4

C'è un'ovvia riduzione dalla necessaria mancata risoluzione alla parziale correttezza, vale a dire:

P non termina mai quando avviato in uno stato iniziale soddisfacente φ iff { φ } P {false} è valido.

Sono consapevole che questa è un'altra non risposta. Il suo vantaggio è che è più corto di quelli sopra.


3

C'è una tecnologia standard - di solito indecidibile, ovviamente - per popolare il tuo grafico con le sue condizioni pre e post, vale a dire la semantica di precondizione liberale più debole , che è una forma di semantica del trasformatore predicato che fornisce le precondizioni più deboli per la soddisfazione della specifica o non -termination. Questa è essenzialmente una teoria completa della correttezza parziale per tali lingue e, in verità, della piena correttezza

È gesso e formaggio a decidere quale di terminazione e parziale correttezza è dove si trova il duro lavoro, dal momento che entrambi sono così gravemente indecidibili. Ma la correttezza parziale è aggrovigliata con problemi di progettazione del linguaggio, sia per i linguaggi di programma che per quelli di specifica, mentre la difficoltà di terminazione è di un tipo pulito: per qualsiasi teoria usata per dimostrare la terminazione ci saranno algoritmi che terminano, ma non è possibile dimostrare che a quella teoria. Ad esempio, i calcoli nel calcolo lambda polimorfico puro devono terminare, ma l'aritmetica di Peano non può provarlo.

La mia impressione è che il lavoro sull'interpretazione astratta , aperto da Patrick Cousot, sia stato il più dinamico in questo settore, ma non pretendo di essere un esperto.


Stavo cercando di chiedere la complessità di inferire funzioni varianti. Scusa se non sono stato chiaro! Come curiosità, Rustan Leino ha fatto un esempio ieri sera (in un pub) che mi ha suggerito fortemente che wlp non funziona così come wp & sp per il tipo di programmi che descrivo qui. Dovrò ricontrollare quando arrivo in un posto più adatto al lavoro :)
Radu GRIGore

@Radu: c'è stato del lavoro svolto sulle prove di terminazione automatiche, con un bel lavoro fatto per Prolog. Posso trovare alcuni riferimenti quando trovo il tempo.
Charles Stewart,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.