Beispiel eines Algorithmus, dem ein Korrektheitsnachweis fehlt


18

Wir haben Hoare-Logik. Warum ist es immer noch möglich, dass ein Algorithmus richtig ist, aber es gibt keinen Beweis dafür, dass er richtig ist? Angenommen, der Algorithmus wird in C ausgedrückt. Dann können wir Schritt für Schritt argumentieren, dass er das tut, was er tun soll.

Meine Frage lautet also:

Geben Sie mir ein Beispiel für einen Algorithmus, der richtig ist, aber keinen Beweis für die Richtigkeit hat.

EDIT: Ich denke, ein kleiner Hintergrund kann helfen zu klären, wohin ich gehe. Lassen Sie mich Scott Aaronson zitieren:

Seit den 1970er Jahren wird spekuliert, dass P NP unabhängig von den Standard-Axiomsystemen für Mathematik wie der Zermelo-Fraenkel-Mengen-Theorie sein könnte (dh weder nachweisbar noch widerlegbar). Klar wäre das auch

  1. Es gibt keinen Polynom-Zeit-Algorithmus für NP-vollständige Probleme, aber wir können ihn niemals beweisen (zumindest nicht in unseren üblichen formalen Systemen)

  2. ein Polynom-Algorithmus für NP-vollständige Probleme tut existieren, aber entweder wir können nie beweisen , dass es funktioniert, oder wir können nie beweisen , dass es in polynomialer Zeit anhält.

Ich beziehe mich auf die zweite Möglichkeit. Da Aaronson es so sicher als eine Möglichkeit auflisten kann, denke ich, dass es ein existierendes Beispiel vom Typ 2 geben muss. Deshalb stelle ich diese Frage. Aber eine schnelle und klare Antwort scheint nicht in Sicht.


17
Was bedeutet es zu sagen, dass ein Algorithmus korrekt ist, wenn wir keinen Beweis für die Richtigkeit haben?
David Richerby

14
Meinen Sie "der Beweis der Richtigkeit ist unmöglich" oder "niemand hat bewiesen, dass es richtig ist"?
gnasher729

12
Algorithmen müssen nicht korrekt sein ... Angenommen, Sie haben Folgendes: (1) Stellen Sie morgens einen leeren Eimer auf die Fensterbank. (2) nimm es abends runter. (3) Messen Sie das Wasservolumen im Eimer. (4) am nächsten Morgen wiederholen. Dies ist eine Beschreibung eines Algorithmus, die jedoch nichts beschreibt, was ohne Dehnung als "korrekt" bezeichnet werden kann. Interessanterweise ist der meiste Programmcode auf der Welt so geschrieben: Es geht nur nicht um die Korrektheit dessen, was er überhaupt tut.
wvxvw

@wvxvw Ich bin verwirrt. Was bedeutet es, wenn ein Algorithmus dann "korrekt" ist? Wenn es tut, was es tun soll, heißt das nicht, dass es richtig ist? Wenn das Ziel Ihres Szenarios darin bestand, die durchschnittliche Wassermenge zu ermitteln, die während des Niederschlags im Eimer gesammelt wurde, wäre der Algorithmus in diesem Fall dann nicht korrekt?
Abdul

8
@chi du verstehst nicht ... es ist nicht so, dass sich Programmierer nicht um die Richtigkeit ihres Codes kümmern, es ist so, dass für einige Algorithmen das Konzept der "Richtigkeit" nicht anwendbar ist. Nehmen Sie eine .NET WindowsForms-Anwendung, die etwas zu dem Effekt sagt: "Setzen Sie diese Schaltfläche mit dieser Beschriftung an diese Position, dann setzen Sie diese andere Schaltfläche an diese andere Position und so weiter ..." - es könnte eine Interpretation dessen geben, was dies ist Programm tut, unter dem, was es tut, als (in) korrekt beurteilt werden kann (zB Grafikdesigner sagt, es sieht "hässlich aus"), aber das ist so weit wie es geht.
wvxvw

Antworten:


50

Hier ist ein Algorithmus für die Identitätsfunktion:

  • Eingabe: n
  • Überprüfen Sie, ob die te Binärzeichenfolge in ZFC einen Beweis von 0 > 1 codiert , und geben Sie in diesem Fall n + 1 ausn0>1n+1
  • Andernfalls geben Sie n

Die meisten Leute vermuten, dass dieser Algorithmus die Identitätsfunktion berechnet, aber wir wissen es nicht und wir können es im allgemein akzeptierten Rahmen für Mathematik, ZFC, nicht beweisen .


2
Sind Sie sicher, dass es sich bei der Prüfung, ob die te Binärzeichenfolge einen Beweis von 0 > 1 in ZFC codiert,n0>1 um einen Algorithmus handelt?
Dmitry Grigoryev

23
Nein, aber die Prüfung kann auf jeden Fall algorithmisch (dh durch eine Turing-Maschine) durchgeführt werden. Tatsächlich ist dies eine der Anforderungen, die wir an Beweissysteme stellen - dass die Beweisgültigkeit algorithmisch überprüfbar ist.
Yuval Filmus

6
@Puppy ZFC beweist . Es könnte sich aber auch als 0 > 1 erweisen, wenn (f) es inkonsistent ist. Fast jeder glaubt natürlich, dass ZFC konsistent ist, aber aufgrund der Unvollständigkeitssätze können wir das nicht sicher wissen. ¬(0>1)0>1
Chi

1
@ Nathaniel Überhaupt nicht. Sie können zum Beispiel die Korrektheit jedes Lehrbuchalgorithmus leicht nachweisen. Dieser Algorithmus unterscheidet sich darin, dass er auf der Konsistenz von ZFC beruht, was ZFC selbst nicht beweisen kann.
Yuval Filmus

1
@ Nathaniel: Wenn Sie möchten, lassen Sie uns diese Diskussion im Chat fortsetzen .
user21820

9

Die meisten Algorithmen haben sich in der Hoare-Logik nicht als richtig erwiesen. Der Hauptgrund dafür ist, dass solche Korrektheitsnachweise ab Januar 2017 extrem teuer sind, wahrscheinlich um mehrere Größenordnungen im Vergleich zur reinen Programmierung. Es wird viel gearbeitet, um diese Kosten durch Automatisierung zu senken, aber es ist ein harter Kampf.

Ein weiterer Grund, warum ein Algorithmus möglicherweise keinen Korrektheitsnachweis hat und der in der Praxis relevanter ist als die von Yuval und Chi erwähnten Unvollständigkeitsphänomene, besteht darin, dass wir möglicherweise nicht wissen, was diese Spezifikation ist. Dieses Problem hat zwei Dimensionen.

  • Die Kunden wissen nicht, was sie wollen. Dies ist ein bekanntes Problem in der Softwareentwicklung, und Softwareentwickler haben viele Ansätze entwickelt, um damit umzugehen.

  • Die Spezifikation ist schwierig. Ein gutes Beispiel ist die Korrektheit kryptografischer Algorithmen. Erst kürzlich wurde Micali & Goldwasser mit dem Turing-Preis für die Angabe der Bedeutung der kryptografischen Sicherheit ausgezeichnet. Beachten Sie jedoch, dass diese Definition (soweit mir bekannt ist) für "theoretische Kryptographie" gilt, bei der Sie einen Sicherheitsparameter nÜber natürliche Zahlen reichend, und Gegner sind polynomielle zeitprobabilistische Turing-Maschinen. Nach meinem besten Wissen (bitte korrigieren Sie mich, wenn ich mich irre) besteht eine Diskrepanz zwischen Theorie und Praxis, und konkrete Algorithmen wie AES und SHA256 liegen nicht ganz im Geltungsbereich dieser theoretischen Spezifikationen. Ich glaube nicht, dass es eine vollständige Spezifikation für solche Algorithmen gibt, daher können wir sie im Prinzip nicht im Sinne von z. B. Hoare-Logik verifizieren.


AES liegt im Bereich der Definitionen der kryptografischen Sicherheit. (Sie müssen konkrete Sicherheitsdefinitionen anstelle von asymptotischen Definitionen verwenden, sollten dies jedoch trotzdem tun, wenn Sie in der Praxis Sicherheit wünschen.)
DW

@ DW Interessant. Mir war das nicht bewusst. Wie wird die asymptotische Natur der theoretischen Kryptographie umgangen? Kannst du mich bitte auf ein Papier dazu hinweisen? Was ist mit konkreten kryptografischen Hash-Funktionen?
Martin Berger

en.wikipedia.org/wiki/Concrete_security und die dort aufgeführten Referenzen. Hash-Funktionen sind komplexer, da es davon abhängt, wofür Sie sie verwenden. Die Komplexität ist jedoch weitgehend orthogonal zur asymptotischen Sicherheit im Vergleich zur konkreten Sicherheit.
DW

2
Für die Verschlüsselung benötigen Sie zwei Algorithmen: einen, der verschlüsselt, einen, der entschlüsselt. Einer von ihnen kann nicht alleine richtig sein. Sie können nur paarweise richtig sein (Sie beweisen, dass das Entschlüsseln einer verschlüsselten Eingabe das Original ergibt). Aber für die Verschlüsselung möchten Sie, dass sie nicht geknackt werden kann und das können Sie nicht mit "Korrektheit" erfassen.
gnasher729

1
@DW da muss ich etwas widersprechen. Während die Papiere von Rogaway und Bellare großartig andeuten, dass sie in irgendeiner Weise Sicherheitsnachweise von Primitiven zulassen, ist dies irreführend. In beiden Beiträgen geht es im Wesentlichen um Protokolle (dh sie gehen davon aus, dass Grundelemente wie AES, SHA, RSA usw. sicher sind) und beweisen dann die Dinge von dort aus. Das wesentliche Problem, die Sicherheit der Primitiven selbst zu beweisen, bleibt bestehen. Wenn Sie Referenzen für Beweise für die Sicherheit von Primitiven haben, wäre ich interessiert. Das zweite Papier geht beispielsweise davon aus, dass RSA schwierig ist, was ein sehr offenes Problem darstellt.
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

Problem: Geben Sie "Ja" aus, wenn jede gerade Zahl ≥ 4 die Summe zweier Primzahlen ist, und "Nein", wenn es eine gerade Zahl ≥ 4 gibt, die nicht die Summe zweier Primzahlen ist.

Algorithmus: "Ja" drucken

Die meisten Leute denken, dass der Algorithmus korrekt ist. Es gibt keinen bekannten Beweis, und es ist durchaus möglich , dass es ist kein Beweis.


3

Jeder Algorithmus, der korrekt ist, von dem wir jedoch nicht wissen, wie lange die Ausführung dauert, kann in einen Algorithmus umgewandelt werden, der in einer garantierten Zeitspanne anhält, bei dem wir uns jedoch nicht sicher sind, ob er korrekt ist.

nn+10log(n)20n

P=NP

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.