Was ist die Bedeutung einer Annahme in scala im Vergleich zu einer Behauptung?
Scala scheint zu definieren 3 Arten von Aussagen: assert
, require
und assume
.
Soweit ich das verstehe, ist der Unterschied (im Vergleich zu einem generischen Behauptung) von require
ist, dass es speziell dafür gedacht für die überprüfung der Eingaben (Argumente, eingehende Nachrichten etc.). Und was ist der Sinn des assume
dann?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn du dir den code in
Predef.scala
Sie werden sehen, dass alle drei sehr ähnlichen job:Gibt es auch Versionen, die zusätzliche Argumente für die Berichterstattung (siehe http://harrah.github.com/browse/samples/library/scala/Predef.scala.html).
Der Unterschied liegt im Typ der Ausnahme, die Sie werfen, und die Fehlermeldung, die Sie erzeugen.
Jedoch statische Dame behandeln könnte alle drei unterschiedlich. Die Absicht ist für
assert
eine Bedingung angegeben werden, dass eine statische Prüfung soll der Versuch zu beweisen,assume
verwendet werden für eine Bedingung, die der Stein annehmen kann, um zu halten, währendrequire
gibt eine Bedingung, dass der Aufrufer muss sicherstellen,. Wenn eine statische Prüfung findet eine Verletzung derassert
er hält es für einen Fehler im code, während, wennrequire
verletzt wird, übernimmt Sie die Anrufer Schuld.Der Unterschied
Den Unterschied zwischen assert() und Annahme (.) ist, dass
Den vorgesehenen Verbraucher /Zusammenhang mit assert() testen, wie eine Scala JUnit-test, während die Annahme() ist "als ein Mittel, design-by-contract-Stil-Spezifikation von pre - und post-Bedingungen auf Funktionen, mit der Absicht, dass diese Daten könnten verwendet werden, eine statische Analyse-tool" (ein Auszug aus dem scaladoc).
Statischer Analyse und model checking
Im Rahmen der statischen Analyse, wie Adam Zalcman hat darauf hingewiesen, assert() ist ein all-Ausführung-Pfade Behauptung, um zu prüfen, eine Globale invariante, während die Annahme() funktioniert lokal zu pare nach unten die Menge, zu überprüfen, dass der Analysator muss. annehmen() wird verwendet im Zusammenhang mit übernehmen-Garantie Argumentation, die eine " Teile und herrsche Mechanismus, um Hilfe von model-Checkern davon ausgehen, etwas über die Methode, so wie zur Bewältigung des state explosion problem, das entsteht, wenn man versucht, zu überprüfen, alle Pfade, die das Programm einnehmen kann. Zum Beispiel, wenn Sie wusste, dass Sie bei der Gestaltung eines Programms, einer Funktion f1(n1 : Int, n2:Int) NIE bestanden n2 < n1, dann besagt diese Annahme explizit würde helfen, den analyzer nicht haben zu prüfen, eine MENGE von Kombinationen von n1 und n2.
In der Praxis
In der Praxis, da solche ganze Programm model checker sind meist noch Theorie, schauen wir uns an, was die scala-compiler und-interpreter funktioniert:
Mehr
Mehr von der hervorragenden scaladoc zu diesem Thema:
Behauptungen
Einer Reihe von
assert
Funktionen sind für die Verwendung als eine Möglichkeit, zu dokumentieren und dynamische überprüfung von Invarianten im code. assert-Anweisungen können zur Laufzeit erstellte, indem Sie die Kommandozeilen-argument-Xdisable-assertions
zu denscala
Befehl.Varianten
assert
für die Verwendung mit statischen Analyse-tools sind ebenfalls vorhanden:assume
,require
undensuring
.require
und Gewährleistung sind ausschließlich für die Verwendung als Mittel des design-by-contract-Stil-Spezifikation von pre - und post-Bedingungen auf Funktionen, mit der Absicht, dass diese Daten könnten verwendet werden, eine statische Analyse-tool. Zum Beispiel,Die Erklärung der addNaturals besagt, dass die Liste von Ganzzahlen übergeben sollte enthalten nur Natürliche zahlen (d.h. nicht negativ), und dass das zurückgegebene Ergebnis wird natürlich auch sein. erforderlich ist ein Unterschied zu behaupten, dass wenn die Bedingung fehlschlägt, dann ist der Aufrufer der Funktion ist die Schuld, anstatt einen logischen Fehler gemacht wurden, die innerhalb addNaturals selbst. gewährleistet ist eine form geltend machen, dass die Gewährleistung der Funktion ist die Bereitstellung von im Hinblick auf seine Rückkehr Wert.
)
Ich im zweiten Adams Antwort, hier sind nur einige kleine Ergänzungen:
Wenn
assume
verletzt ist, wird das Verifizierungs-tool schweigend Pflaumen den Pfad, d.h. folgt nicht dem Pfad noch tiefer.Daher
assume
wird oft verwendet, um zu formulieren, Voraussetzungen,assert
zu formulieren, die die post-Bedingungen.Diese Konzepte werden von vielen tools, wie z.B. die concolic Test-tool KLEE, software bounded model-checking-tools wie CBMC und LLBMC, und teilweise auch durch statische code-Analyse-tools auf Basis der abstrakten interpretation. Der Artikel Auf der Suche nach Gemeinsamkeiten: Wählen Sie Geltend machen, Übernehmen stellt diese Konzepte und versucht, eine Vereinheitlichung.