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.