KIV-Beweise in Scala. 25. Juni 2013 G. Schellhorn, D. Haneberg: Formale Methoden im Software Engineering 253 / 300

Ähnliche Dokumente
Sequentielle Programme, Hoare-Logik und Dynamische Logik

Was Sie schon immer über funktionale Programmierung wissen wollten, aber bisher nicht zu fragen wagten

Semantik von Formeln und Sequenzen

Noethersche Induktion

Noethersche Induktion

Dynamische Logik. A. Salwicki 1970 ( algorithmische Logik ), V.R. Pratt 1976, D. Harel 1977

Theoretische Informatik: Logik, M. Lange, FB16, Uni Kassel: 3.8 Aussagenlogik Der Sequenzen-Kalkül 99. Sequenzen

Formale Methoden der Softwaretechnik 1 Vorlesung vom : Grundlage von Isabelle

! 1. Erste Schritte! 2. Einfache Datentypen! 3. Anweisungen und Kontrollstrukturen! 4. Verifikation! 5. Reihungen (Arrays) II.1.4. Verifikation - 1 -

Theorem Proving. Software Engineering in der Praxis. Prädikatenlogik. Software Engineering in der Praxis Wintersemester 2006/2007

n 1. Erste Schritte n 2. Einfache Datentypen n 3. Anweisungen und Kontrollstrukturen n 4. Verifikation n 5. Reihungen (Arrays)

Strukturierte Spezifikation: Anreicherung um nichtrekursive und rekursive Definitionen

Formale Systeme. Aussagenlogik: Sequenzenkalkül. Prof. Dr. Bernhard Beckert WS 2010/2011 KIT INSTITUT FÜR THEORETISCHE INFORMATIK

Ausdrücke in Scala. Funktionale Programmierung. Christoph Knabe FB VI

Software Entwicklung 1

Software Entwicklung 1. Fallstudie: Arithmetische Ausdrücke. Rekursive Klassen. Überblick. Annette Bieniusa / Arnd Poetzsch-Heffter

Praktikum Funktionale Programmierung Teil 2: Typecheck und Transformation

Praktische Informatik 3: Funktionale Programmierung Vorlesung 11 vom : Monaden als Berechnungsmuster

Formale Systeme. Prof. Dr. Bernhard Beckert, WS 2016/ KIT Die Forschungsuniversita t in der Helmholtz-Gemeinschaft

Formale Systeme. Prof. Dr. Bernhard Beckert, WS 2017/ KIT Die Forschungsuniversita t in der Helmholtz-Gemeinschaft

Logik I. Symbole, Terme, Formeln

Praktische Informatik 3

Formale Systeme. Prof. Dr. Bernhard Beckert. Winter 2008/2009. Fakultät für Informatik Universität Karlsruhe (TH)

Grundlagen der Programmierung 3 A

4. Kontrollstrukturen Programmieren / Algorithmen und Datenstrukturen 1 Prof. Dr. Bernhard Humm FB Informatik, Hochschule Darmstadt

Die Definition eines Typen kann rekursiv sein, d.h. Typ-Konstruktoren dürfen Elemente des zu definierenden Typ erhalten.

Einführung in die Theoretische Informatik

{P} S {Q} {P} S {Q} {P} S {Q} Inhalt. Hoare-Kalkül. Hoare-Kalkül. Hoare-Tripel. Hoare-Tripel. Hoare-Tripel

Temporallogik und parallele Programme. 2. Juli 2013 G. Schellhorn, D. Haneberg: Formale Methoden im Software Engineering 269 / 304

Intuitionistische Lineare Logik

1. Erste Schritte 2. Einfache Datentypen 3. Anweisungen und Kontrollstrukturen 4. Verifikation 5. Reihungen (Arrays) II.1.4. Verifikation - 1 -

Vollständigkeit. Klassifikation von Operationen

Einführung IMP-Syntax Reduktionssemantik Maschinen-Semantik. Teil IV. Semantik imperativer Sprachen

Verarbeitung unendlicher Datenstrukturen Jetzt können wir z.b. die unendliche Liste aller geraden Zahlen oder aller Quadratzahlen berechnen:

Grundlagen der Programmierung 3 A

Haskell, Typen, und Typberechnung. Grundlagen der Programmierung 3 A. Überladung und Konversion in Haskell. Typisierung in Haskell

Formale Systeme. Prädikatenlogik 2. Stufe. Prof. Dr. Bernhard Beckert WS 2009/2010 KIT INSTITUT FÜR THEORETISCHE INFORMATIK

Formale Methoden im Software Engineering

Theoretische Informatik und Logik Übungsblatt 4 (SS 2017) Lösungen

Was bisher geschah Modellierung in Logiken: klassische Prädikatenlogik FOL(Σ, X) Spezialfall klassische Aussagenlogik AL(P)

1. Erste Schritte 2. Einfache Datentypen 3. Anweisungen und Kontrollstrukturen 4. Verifikation 5. Reihungen (Arrays) II.1.4. Verifikation - 1 -

Formale Systeme. Tableaukalku l (ohne Gleichheit) Prof. Dr. Bernhard Beckert, WS 2015/ KIT I NSTITUT F U R T HEORETISCHE I NFORMATIK

2. Klausur Einführung in die Theoretische Informatik Seite 1 von Welche der folgenden Aussagen zur Aussagenlogik ist falsch?

Der KIV-Kalkül Simplifier und Heuristiken

Die abstrakte Klasse Expression:

How To Prove A Propositional Logic

Korrektheit und Hoare-Kalkül für Imperative Programme

Informatik I - Programmierung Globalübung Hoare-Kalkül. Thomas Weiler. Fachgruppe Informatik RWTH Aachen. T. Weiler, RWTH Aachen - 1 -

12 Abstrakte Klassen, finale Klassen und Interfaces

Paradigmen der Programmierung

Gentzen-Kalküle. bestehen aus mehreren, recht komplexen Axiomen, und wenigen Schlußregel (für Aussagenlogik: nur einer, für Prädikatenlogik drei).

Statische Codeanalyse

Einführung in Haskell

Formale Techniken der Software-Entwicklung

Beweisen mit Semantischen Tableaux

Angewandte Mathematik und Programmierung

Vortrag. Vortrag im Rahmen der Master-Vorlesung Semantik von Programmiersprachen an der FH München, Fachbereich Informatik

Grundlagen der Logik

Kapitel 6. Programme mit Schleifen. Wir betrachten jetzt eine einfache imperative Programmiersprache IMP. IMP verfügt

Der Sequenzenkalkül. Charakterisierung der logischen Schlussfolgerung: Sequenzenkalkül für die Prädikatenlogik

Was bisher geschah. deklarative Programmierung. funktionale Programmierung (Haskell):

Fortgeschrittene Funktionale Programmierung

Formale Systeme. Prof. Dr. Bernhard Beckert, WS 2017/ KIT Die Forschungsuniversita t in der Helmholtz-Gemeinschaft

Formale Systeme. Prof. Dr. Bernhard Beckert, WS 2016/ KIT Die Forschungsuniversita t in der Helmholtz-Gemeinschaft

Klausur Formale Systeme Fakultät für Informatik SS 2017

Praktikum Funktionale Programmierung Teil 1: Lexen und Parsen

Lösungen zum Aufgabenblatt 10 Logik und modelltheoretische Semantik

Zusammenfassung. Definition. 1 (x i ) 1 i n Sequenz von Registern x i, die natürliche Zahlen beinhalten. 2 P ein Programm. Befehle: 1 x i := x i + 1

Einführung in die Logik (Vorkurs)

ALP I. Funktionale Programmierung

Stratego/XT und ASF+SDF Meta-Environment. Paul Weder Seminar Transformationen Datum:

- Welche konkreten Invarianten müssen gelten? Berücksichtigen: Invarianten aus Modell und Implem.

Klausur Formale Systeme Fakultät für Informatik SS Prof. Dr. Bernhard Beckert. 31. Juli Die Bearbeitungszeit beträgt 60 Minuten.

Haskell, Typen, und Typberechnung. Grundlagen der Programmierung 3 A. Einige andere Programmiersprachen. Typisierung in Haskell

2 Theorie der semantischen Typen

4.1 Motivation. Theorie der Informatik. Theorie der Informatik. 4.1 Motivation. 4.2 Syntax der Prädikatenlogik. 4.3 Semantik der Prädikatenlogik

Grundlegende Datentypen

Einführung in die Programmiertechnik

Kapitel 11. Prädikatenlogik Quantoren und logische Axiome

Grundlagen der Programmierung 2. Operationale Semantik

Mehrsortige Strukturen

Programmierung und Modellierung

Klausur Formale Systeme Fakultät für Informatik WS 2015/2016

WS 2012/2013. Robert Giegerich. 21. November 2012

Konzepte von Programmiersprachen

Einführung Funktionsweise von BLAST Praxis? BLAST. David Dueck

Grundlegende Datentypen

Semantik von Formeln und Sequenzen

Programmieren in Java

Korrektheit imperativer Algorithmen

Wozu formale Logik? Programmiersprachen Logik im Fingerhut. Formeln. Logik im Fingerhut (24. Januar 2005) Belegung und Interpretation

Abschnitt 11: Korrektheit von imperativen Programmen

Generizität, Abstraktion, Rekursion

Zuerst wird die Bedingung ausgewertet. Ist sie erfüllt, wird der Rumpf des while-statements ausgeführt. Nach Ausführung des Rumpfs wird das gesamte

HASKELL KAPITEL 2.1. Notationen: Currying und das Lambda-Kalkül

Labor Compilerbau. Jan Hladik. Sommersemester DHBW Stuttgart. Jan Hladik (DHBW Stuttgart) Labor Compilerbau Sommersemester / 20

Transkript:

KIV-Beweise in Scala 25. Juni 2013 G. Schellhorn, D. Haneberg: Formale Methoden im Software Engineering 253 / 300

Scala und KIV Im zweiten Scala-Versuch wollen wir Beweise programmieren. Zunächst einen Aussagenlogik-Beweiser, dann einen für partielle Korrektheit. Für die Programmierung brauchen wir Teile des aktuellen KIV-Codes. Der KIV-Code ist recht gross (300KLoC) und hat sicher noch Bugs. Ihr müsst davon aber nur wenige Teile kennen. 25. Juni 2013 G. Schellhorn, D. Haneberg: Formale Methoden im Software Engineering 254 / 300

Wiederholung: Syntax von Ausdrücken Ausdrücke e EXPR s (Σ, X ) der Sorte s S über der Signatur Σ und über den Variablen X sind rekursiv definiert durch x aus X s ist ein Ausdruck der Sorte s Sind e 1,..., e n Ausdrücke der Sorten s 1,..., s n und op : s 1,..., s n s, dann ist op(e 1,..., e n ) ein Ausdruck der Sorte s Bem.: Schreibe c statt c() für Konstanten (n = 0) Sind e 1, e 2 Ausdrücke der Sorte s, so ist e 1 = e 2 eine Formel (i. e. ein Ausdruck der Sorte bool) Ist ϕ eine Formel und x eine Variable, so sind x.ϕ und x.ϕ Formeln EXPR(Σ, X ) := s S EXPR s(σ, X ), For(Σ, X ) := EXPR bool (Σ, X ) Terme t T (Σ, X ) sind Ausdrücke ohne Quantoren und Gleichheit. 25. Juni 2013 G. Schellhorn, D. Haneberg: Formale Methoden im Software Engineering 255 / 300

Scala und KIV: Ausdrücke Expressions sind ein freier Datentyp (hier leicht vereinfacht): package types sealed abstract class Expr // Operation case class Op(val name:string, val typ:type) extends Expr // Variable case class Xov(val name:string, val sort:type) extends Expr // Applikation case class Ap(val fct:expr, val termlist:list[expr]) extends Expr //Allquantor case class All(val vl:list[xov], val fma:expr) extends Expr //Existenzquantor case class Ex(val vl:list[xov], val fma:expr) extends Expr... 25. Juni 2013 G. Schellhorn, D. Haneberg: Formale Methoden im Software Engineering 256 / 300

Scala und KIV: Parsen Die rohen Konstuktoren All, Ap etc. machen keinen Typcheck Konstruktoren mit Typcheck sind mkap, mkall etc. Formeleingabe als z.b. mkall(list(x),op( true,... )) möglich In der Praxis nicht gemacht. Stattdessen Aufruf des Parsers Eingabe wie in KIV parser.scalaparse.parse expr( x. true ) (wie in KIV) parse seq(arg:string):seq (Sequenzen), parse spec(arg:string):spec (Spezifikationen) Um Ausdrücke und Sequenzen korrekt zu parsen (Mixfix-Notation!), muss KIV eine Spezifikation kennen : Das geht mit setcurrentspecsig(sp:spec):unit setcurrentspeclistsig(spl:list[spec]):unit 25. Juni 2013 G. Schellhorn, D. Haneberg: Formale Methoden im Software Engineering 257 / 300

Scala und KIV: Pretty-Printing Die rohe Ausgabe von Formeln ist nur für Debugging relevant Normalerweise Ausgabe mit pretty-printer: printer.prettyprint.xpp(arg:any):string mit Sonderzeichen printer.prettyprint.pp(arg:any):string ASCII-Ausgabe Funktioniert für beliebiges Argument arg:spec, arg:expr, etc. Für Beweisbäume (gleich) ist das Ergebnis nur ** A TREE **. Es wird zusätzlich ein Baumfenster (wie in KIV) geöffnet. 25. Juni 2013 G. Schellhorn, D. Haneberg: Formale Methoden im Software Engineering 258 / 300

Scala und KIV: Sequenzen und Bäume Sequenzen und Beweisbäume sind ebenfalls ein Datentyp: package types sealed abstract class Tree case class Seq(ant:List[Expr], suc:list[expr]) extends Tree case class Vtree(concl:Seq, subtr:list[tree]) extends Tree Regelbäume lassen sich graphisch (wie in KIV) anzeigen: Entweder per pretty-printer oder direkt mit printtree.painttree.pp painttree(t:tree):unit. 25. Juni 2013 G. Schellhorn, D. Haneberg: Formale Methoden im Software Engineering 259 / 300

Scala und KIV: Aussagenlogische Regeln Es ist in KIV nicht erlaubt, beliebig Bäume zusammenzubauen Stattdessen: Es gibt vordefinierte Regelbäume für Aussagenlogik: system.basicrules.con r ist der Regelbaum für conjunction right Analog: dis r, equiv l, neg l, imp r, ax etc. Allerdings: Passen nur auf die erste Formel rechts/links (der Antezedent ist eine Liste von Formeln, keine Menge) Deshalb zusätzlich: leftrotate left, leftrotate right bzw. righttrotate left, righttrotate right zum Rotieren im ant bzw. suc. 25. Juni 2013 G. Schellhorn, D. Haneberg: Formale Methoden im Software Engineering 260 / 300

Scala und KIV: Aufbau von Bäumen Beispielregel: $Γ $ϕ, $ $Γ $ψ, $ $Γ $ϕ $ψ, $ con r Regelbäume enthalten Metavariablen wie $ϕ, $ψ und $Γ, $ als Platzhalter für Formeln bzw. Formellisten. Metavariablen kommen in normalen Beweisen nicht vor. 25. Juni 2013 G. Schellhorn, D. Haneberg: Formale Methoden im Software Engineering 261 / 300

Scala und KIV: Aufbau von Bäumen Gegeben ein bestehender Baum (am Anfang: eine Sequenz) so lassen sich Instanzen von Regeln anbauen. refine(tree:tree,i:int,rule:tree):tree wendet die Regel rule auf die i-te Prämisse P (1-basiert) des Baums tree an. Bei der Anwendung werden in ganz R die Metavariablen so durch die konkreten Formeln aus der Regel instanziert (ergibt I(rule)), so dass die Konklusion C der Regel zu P = I(C) wird. rule C P I(rule) P tree tree G G 25. Juni 2013 G. Schellhorn, D. Haneberg: Formale Methoden im Software Engineering 262 / 300

Scala und KIV: Failures (1) refine wirft Error, falls der Baum nicht genug Prämissen hat, Test mit i > tree.premno. generated.treefuns.prem(tree,i) und generated.treefuns.prems(tree) ergeben die i-te Prämisse bzw. alle Prämissen eines tree (1-basiert) des Baums tree Eine Regel kann nicht anwendbar sein die Regelanwendung schlägt fehl = refine wirft die Standardexception Failure. Für con r. Wenn Sukzedent leer, oder erste Formel keine Konjunktion, schlägt refine fehl. 25. Juni 2013 G. Schellhorn, D. Haneberg: Formale Methoden im Software Engineering 263 / 300

Scala und KIV: Failures (2) Fehlschläge sind ein Prinzip beim Beweisen: Regeln, Heuristiken, Simplifierregeln können alle fehlschlagen. spezielle Unterstützung: orl(scalaexpr1,scalaexpr2) wertet zunächst scalaexpr1 aus (z.b. ein refine). Falls das nicht fehlschlägt ist das auch das Ergebnis. Nur falls es fehlschlägt, wird auch scalaexpr2 ausgewertet und liefert das Ergebnis Gewolltes Fehlschlagen durch Aufruf von fail: (i.e. def fail = throw Failure) Bem: orl ist in scala als lazy Funktion realisiert. Erspart es überall zu Schreiben: try {scalaexpr1} catch {x:failure => scalaexpr2} 25. Juni 2013 G. Schellhorn, D. Haneberg: Formale Methoden im Software Engineering 264 / 300

Scala und KIV: Generisches Matching Zu refine gibt es die Verallgmeinerung: mvmatch[s,t](pattern:t, concrete:t, toinst:s):s Stellt fest, ob die Metavariablen in pattern so instanziert werden können, dass concrete herauskommt. (ob pattern auf concrete matcht ) Falls das nicht fehlschlägt, werden die Metavariablen in toinst instanziert, und die Instanz ist das Ergebnis. Variante: mvmatchp(pattern:t, concrete:t):boolean macht einen Test, ob pattern auf concrete matcht. Nützliche Anwendung im Praktikumsversuch: val whilepat = parse seq( $Γ [while $ε do $α]$ϕ ) mvmatch(whilepat, seq, parse prog( $α)) 25. Juni 2013 G. Schellhorn, D. Haneberg: Formale Methoden im Software Engineering 265 / 300

Programmierung eines VCG Für s Praktikum wollen wir einen VCG ( Verification Condition Generator ) für partielle Korrektheit programmieren Ein VCG reduziert Korrektheitsaussagen für Programme auf prädikatenlogische Goals (automatisch, wenn Invarianten gegeben sind). Es zeigt sich: Die Programmierung ist analog zum Aussagenlogischen Beweiser 25. Juni 2013 G. Schellhorn, D. Haneberg: Formale Methoden im Software Engineering 266 / 300

Regeln für Hoare-Kalkül Die DL-Regeln für den Hoare-Kalkül sind analog zu den aussagenlogischen Regeln implementiert Sie enthalten Metavariablen für Programme $α,$β 2 Beispiele (vollständige Listen in der Praktikumsdoku): $Γ $ϕ $Γ [skip]$ϕ skip rule $Γ, $ε [$β] $ϕ $Γ, $ε [$α]$ϕ $Γ [if $ε then $α else $β]$ϕ if forward rule Es gibt kein Normalisieren wie in KIV: Die Regel compound rule muss selbst angewandt werden 25. Juni 2013 G. Schellhorn, D. Haneberg: Formale Methoden im Software Engineering 267 / 300

Spezielle Regeln: besondere Regeln für den Versuch: while rule(inv:expr):tree liefert die while-regel mit eingefüllter konkreter Invariante INV $Γ Inv Inv, $ε [$α]inv Inv, $ε $ϕ $Γ [while $ε do $α]$ϕ (while rule Inv) prakt assign tactic(tree:tree,i:int):tree wendet die Zuweisungsregel mit passender Substitution auf die i-te Prämisse an (x0 neue Variable). x0 = $τ, $Γ ($ϕ) x0 $x $Γ [$x := $τ]$ϕ prakt assign tactic) 25. Juni 2013 G. Schellhorn, D. Haneberg: Formale Methoden im Software Engineering 268 / 300