Esempio di un algoritmo che manca di una prova di correttezza


18

Abbiamo la logica Hoare. Perché è ancora possibile che un algoritmo sia giusto ma non ci sono prove che sia corretto? Supponiamo che l'algoritmo sia espresso in C. Quindi possiamo argomentare passo dopo passo che sta facendo quello che dovrebbe fare.

Quindi la mia domanda è:

Fammi un esempio di un algoritmo che è giusto ma non ha una prova di correttezza.

EDIT: Penso che un po 'di background possa aiutare a chiarire dove sto andando. Vorrei citare Scott Aaronson:

Dagli anni '70 si è ipotizzato che P NP potesse essere indipendente (cioè non dimostrabile né smentibile) dai sistemi assiomi standard per la matematica, come la teoria degli insiemi di Zermelo-Fraenkel. Per essere chiari, ciò significherebbe che neanche

  1. non esiste un algoritmo a tempo polinomiale per problemi NP-completi, ma non possiamo mai provarlo (almeno non nei nostri soliti sistemi formali), oppure

  2. un algoritmo polinomiale per problemi NP-completi non esistono, ma o non potremo mai dimostrare che funziona, o non potremo mai dimostrare che ferma in tempo polinomiale.

Mi riferisco alla seconda possibilità. Dal momento che Aaronson può elencarlo con tanta sicurezza come una possibilità, penso che ci debba essere un esempio esistente di tipo 2. Ecco perché sto ponendo questa domanda. Ma sembra che una risposta rapida e chiara non sia in vista.


17
Cosa significa dire che un algoritmo è corretto se non abbiamo una prova di correttezza?
David Richerby,

14
Intendi "la prova di correttezza è impossibile" o "nessuno ha dimostrato che sia corretta"?
gnasher729,

12
Gli algoritmi non devono essere corretti ... supponi di avere questo: (1) metti un secchio vuoto sul davanzale della finestra al mattino. (2) prendilo giù la sera. (3) misurare il volume di acqua nel secchio. (4) ripetere la mattina successiva. Questa è una descrizione di un algoritmo, ma non descrive nulla che possa essere, senza un tratto, chiamato "corretto". È interessante notare che la maggior parte del codice di programmazione nel mondo è scritto in questo modo particolare: semplicemente non si preoccupa della correttezza di ciò che fa affatto.
wvxvw,

@wvxvw Allora sono confuso, cosa significa che un algoritmo sia "corretto" allora? Se fa quello che doveva fare, non significa che è corretto? Se l'obiettivo del tuo scenario fosse quello di trovare la quantità media di acqua raccolta nel secchio durante la pioggia, per ogni giorno l'algoritmo non sarebbe corretto in quel caso?
Abdul

8
@chi non capisci ... non è che i programmatori non si preoccupino della correttezza del loro codice, è che per alcuni algoritmi il concetto di "correttezza" non è applicabile. Prendi un'applicazione .NET WindowsForms, che dice qualcosa sull'effetto: "metti questo pulsante con questa etichetta in questa posizione, quindi metti questo altro pulsante in questa altra posizione e così via ..." - potrebbe esserci qualche interpretazione di ciò che questo fa il programma, in base al quale ciò che fa può essere giudicato (in) corretto (es. il graphic designer dice che "sembra brutto"), ma questo è tutto.
wvxvw,

Risposte:


50

Ecco un algoritmo per la funzione identità:

  • Ingresso:n
  • Controllare se il ° stringa binaria codifica per una prova di in ZFC, e in tal caso, l'uscita0 > 1 n + 1n0>1n+1
  • Altrimenti, uscitan

La maggior parte delle persone sospetta che questo algoritmo calcoli la funzione di identità, ma non lo sappiamo e non possiamo provarlo nel framework comunemente accettato per la matematica, ZFC .


2
Sei sicuro controllare se il ° stringa binaria codifica per una prova di in ZFC0 > 1n0>1 è un algoritmo?
Dmitry Grigoryev il

23
No, ma il controllo può essere sicuramente implementato in modo algoritmico (cioè da una macchina di Turing). In realtà questo è uno dei requisiti che abbiamo per i sistemi di prova - che la validità della prova sia verificabile algoritmicamente.
Yuval Filmus,

6
@Puppy ZFC dimostra . Ma potrebbe anche dimostrare se (f) è incoerente. Quasi tutti credono che lo ZFC sia coerente, ovviamente, ma a causa dei teoremi di incompletezza non possiamo saperlo con certezza. 0 > 1¬(0>1)0>1
Chi,

1
@Nathaniel Niente affatto. Ad esempio, puoi facilmente dimostrare la correttezza di ogni algoritmo del libro di testo. Questo algoritmo differisce in quanto si basa sulla coerenza di ZFC, che è qualcosa che ZFC stesso non può provare.
Yuval Filmus,


9

La maggior parte degli algoritmi non è stata dimostrata corretta nella logica Hoare. Il motivo principale è che tali prove di correttezza sono estremamente costose a partire da gennaio 2017, probabilmente di diversi ordini di grandezza rispetto alla "mera" programmazione. C'è un sacco di lavoro in corso per ridurre questo costo dall'automazione, ma è una lotta in salita.

Un altro motivo per cui un algoritmo potrebbe non avere una prova di correttezza, e uno che è più rilevante nella pratica rispetto ai fenomeni di incompletezza citati da Yuval e Chi, è che potremmo non sapere quale sia questa specifica. Questo problema ha due dimensioni.

  • I clienti non sanno cosa vogliono. Questo è un problema ben noto nell'ingegneria del software e gli ingegneri del software hanno sviluppato molti approcci per affrontarlo.

  • Le specifiche sono difficili. Un buon esempio è la correttezza degli algoritmi crittografici. Solo di recente Micali & Goldwasser hanno vinto i premi Turing per aver specificato cosa significa sicurezza crittografica. Si noti tuttavia che tale definizione è (per quanto ne so) per "crittografia teorica" ​​in cui si dispone di un parametro di sicurezzanche vanno oltre i numeri naturali e gli avversari sono macchine Turing probabilistiche a tempo polinomiale. Per quanto ne so (per favore correggimi se sbaglio) c'è una discrepanza tra teoria e pratica e algoritmi concreti come AES e SHA256 non rientrano esattamente nell'ambito di tali specifiche teoriche. Non penso che ci siano specifiche complete per tali algoritmi, quindi non possiamo, in linea di principio, verificarli nel senso, ad esempio, della logica Hoare.


AES rientra nell'ambito delle definizioni di sicurezza crittografica. (Devi usare definizioni di sicurezza concrete piuttosto che definizioni asintotiche, ma dovresti farlo comunque se vuoi sicurezza nella pratica.)
DW

@DW Interessante. Non ne ero a conoscenza. Come viene aggirata la natura asintotica della crittografia teorica? Potete per favore indicarmi un articolo su questo? Che dire delle funzioni hash crittografiche concrete?
Martin Berger,

en.wikipedia.org/wiki/Concrete_security e i riferimenti ivi elencati. Le funzioni hash sono un caso più complesso, perché dipende da cosa le usi, ma le complessità sono in gran parte ortogonali alla sicurezza asintotica rispetto alla sicurezza concreta.
DW

2
Per la crittografia, sono necessari due algoritmi: uno che crittografa, uno che decodifica. Uno di questi non può essere corretto da solo. Possono essere corretti solo in una coppia (si dimostra che la decrittografia di un input crittografato produce l'originale). Ma per la crittografia, vuoi che non sia crackabile ed è qualcosa che non puoi catturare con "correttezza".
gnasher729,

1
@DW Devo essere in qualche modo in disaccordo. Mentre i documenti di Rogaway e Bellare suggeriscono che in qualche modo consentono prove di sicurezza dei primitivi è fuorviante. Entrambi gli articoli riguardano essenzialmente i protocolli (ovvero presuppongono che primitivi come AES, SHA, RSA ecc.) Siano sicuri e quindi provino le cose da lì. Il problema essenziale di provare i primitivi stessi rimane sicuro. Se hai qualche riferimento per la prova della sicurezza dei primitivi sarei interessato. Il secondo documento, ad esempio, presuppone che RSA sia difficile, il che rappresenta un grosso problema.
DRF

5

PP{P}c{Q}QQ{P}c{Q}
PP,QQ

P(n)P(0)P(1)P(2)nN. P(n)

MnP(n)Mn. P(n)Mn. P(n)


5

Problema: stampare "Sì" se ogni numero pari ≥ 4 è la somma di due numeri primi e "No" se esiste un numero pari ≥ 4 che non è la somma di due numeri primi.

Algoritmo: stampa "Sì"

Molte persone pensano che l'algoritmo sia corretto. Non ci sono prove noto, ed è possibile che non vi sia alcuna prova.


3

Qualsiasi algoritmo che sia corretto ma non sappiamo quanto tempo impiega per essere eseguito può essere trasformato in un algoritmo che si arresta in un periodo di tempo garantito ma non siamo sicuri che sia corretto.

nn+10log(n)20n

P=NP

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.