P Programmieren i i PPL in PPL Was Sie schon immer über funktionale Programmierung wissen wollten, aber bisher nicht zu fragen wagten g g PPL at a PPL at PPL a glance a glance • KIV ist im wesentlichen in PPL programmiert • PPL (proof programming language) ist eine ML‐artige funktionale Sprache p • PPL entstand zur Zeit von ML, Ende der 1980er • PPL setzt die damals neuesten Konzepte um, PPL setzt die damals neuesten Konzepte um beispielsweise eine virtuelle Maschine (SECD Maschine) und Bytecode Polymorphie Typisierung und Bytecode, Polymorphie, Typisierung • PPL‐Syntax ist ähnlich zu LISP (viele Klammern!) • PPL ist statisch typisiert, Typen werden inferiert 25.6.2008 Beweisbar korrekte Software — Sommersemester 2008 2 Typinferenz PPL 1> (+ 3 ″ab″) Error: types of arguments INT x STRING do not match type of built in function (INT x INT -> INT) in (+ 3 ab) PPL 1> (list 2 ″ab″) Error: Expressions (2 n) must be of same type, but their types INT x STRING are not unifiable 25.6.2008 Beweisbar korrekte Software — Sommersemester 2008 3 Typinferenz PPL Th The The [a, 25.6.2008 1>(ppltype (list ″a″ ″b″)) t type of f (LIST a b) is i (LIST (STRING)) computed substitution is ((239428) (STRING)) b] Beweisbar korrekte Software — Sommersemester 2008 4 PPL at a PPL at PPL a glance a glance • KIV hat kein – Pattern matching f and(true,true) = true fun d(t t ) t | and(_,_) = false – Modulkonzept für Code – Automatisches Currying (+ 2) : nat → nat – Lazy evaluation 25.6.2008 Beweisbar korrekte Software — Sommersemester 2008 5 Ausdrücke Ausdrücke in PPL in PPL • Ausdrücke werden interpretiert • Konstante PPL 1> 3 3 PPL 1> 25.6.2008 Beweisbar korrekte Software — Sommersemester 2008 6 Ausdrücke Ausdrücke in PPL in PPL • Ausdrücke werden interpretiert • Konstante PPL 1> 3 3 PPL 1> • Variable PPL 1> x Error: The identifier X has no definition PPL 1> (def (x 1)) PPL 1> x Wert von x Fehlermeldung 1 PPL 1> 25.6.2008 Beweisbar korrekte Software — Sommersemester 2008 7 Ausdrücke Ausdrücke in PPL in PPL • Befehl oder Funktion (f param1 param2 … paramn) param1 … paramn sind wieder Ausdrücke 25.6.2008 Beweisbar korrekte Software — Sommersemester 2008 8 Funktionen • KIV kennt 3 Arten von Funktionen – Vordefinierte Funktionen, z.B. +, equal, emptyp – Selbst definierte Funktionen – Lambda‐Ausdrücke • Wichtigstes Syntaxkonstrukt in KIV: g y Funktionsanwendung (fun p ( param1 … p paramn) ) Funktionsname Ausdruck für Argument 25.6.2008 Beweisbar korrekte Software — Sommersemester 2008 9 Funktionen • KIV kennt 3 Arten von Funktionen – Vordefinierte Funktionen, z.B. +, equal, emptyp – Selbst definierte Funktionen – Lambda‐Ausdrücke • Wichtigstes Syntaxkonstrukt in KIV: g y Funktionsanwendung (fun p ( param1 … p paramn) ) Ausdruck für Argument • Beispiel: PPL 1> (+ 3 4) 7 25.6.2008 Beweisbar korrekte Software — Sommersemester 2008 10 Funktionen • Funktionsanwendungen können geschachtelt sein. Ein Argument kann eine Funktionsapplikation sein: PPL 1> (- 7 (+ 2 3)) 25.6.2008 Beweisbar korrekte Software — Sommersemester 2008 11 Funktionen • Funktionsanwendungen können geschachtelt sein. Ein Argument kann eine Funktionsapplikation sein: PPL 1> (- 7 (+ 2 3)) • Funktionen werden mit lambda definiert: p (lambda (var1 … varn) expr) Formaler Parameter 25.6.2008 Funktionsrumpf Beweisbar korrekte Software — Sommersemester 2008 12 Funktionen • Funktionsanwendungen können geschachtelt sein. Ein Argument kann eine Funktionsapplikation sein: PPL 1> (- 7 (+ 2 3)) • Funktionen werden mit lambda definiert: p (lambda (var1 … varn) expr) Formaler Parameter Funktionsrumpf • Beispiel: PPL 1>((lambda (x y) (* ( x y)) 3 4) 12 Bisher keine Rekursion möglich 25.6.2008 Beweisbar korrekte Software — Sommersemester 2008 13 Definition von Werten Definition von Werten • def bindet beliebige PPL‐Objekte an Variablen (def (var1 expr1) def darf nicht (def (var2 expr2) innerhalb anderer PPL‐Ausdrücke ⁞ auftreten (def(varn exprn) ) • Beispiel: p PPL 1> (def (x 3) (y (list t f))) PPL 1> x 3 PPL 1> y [T F] [T, 25.6.2008 Beweisbar korrekte Software — Sommersemester 2008 14 Definition von Werten Definition von Werten • Die Ausdrücke in def werden parallel ausgewertet: PPL 1> (def (x 0)) 0 PPL 1> (def (x 3) (y (+ 1 x))) PPL 1> y 1 PPL 1> x 3 25.6.2008 Beweisbar korrekte Software — Sommersemester 2008 15 Funktionsdefinitionen • Auch Funktionsrümpfe werden mit def an Namen gebunden: PPL 1> (def (fun (lambda (x) (+ x x)))) PPL 1> 1 (f (fun 3) 6 • Was fehlt noch: Rekursion! Dafür benützt man defrec: Was fehlt noch: Rekursion! Dafür benützt man defrec: PPL 1> (defrec (fac (lambda (x) (if ( ( (= 0 x) ) 1 ( (* x ( (fac ac ( (- x 1))) ))) )))) def kann hier nicht anstelle von defrec PPL 1> (fac 4) verwendet werden, da sonst eine ggf. , gg 24 schon bestehende alte Definition von fac verwendet würde. PPL 1> 25.6.2008 Beweisbar korrekte Software — Sommersemester 2008 16 Funktionsdefinitionen • PPL ist higher‐order: Funktionen als Parameter und als Rückgabewerte sind zulässig: PPL 1> (defrec (filter (lambda (test alist)) (cond ((emptyp p yp alist) (list)) ((test (car alist)) (cons (car alist) (filter test (cdr alist)))) (t (filter test (cdr alist))) ))) PPL 1> (filter (lambda (x) (< x 10)) (list 1 2 3 11 22 33)) [1, 2, 3] 25.6.2008 Beweisbar korrekte Software — Sommersemester 2008 17 Funktionsdefinitionen • PPL ist higher‐order: Funktionen als Parameter und als Rückgabewerte sind zulässig: PPL 1> (defrec (filter (lambda (test alist)) (cond ((emptyp p yp alist) (list)) ((test (car alist)) (cons (car alist) (filter test (cdr alist)))) (t (filter test (cdr alist))) ))) PPL 1> (filter (lambda (x) (< x 10)) (list 1 2 3 11 22 33)) [1, 2, 3] PPL 1> (def (mkplusx (lambda (x) (lambda (y) (+ x y))))) PPL 1> (mkplusx 2) << A FUNCTION OF TYPE (INT -> > INT) >> PPL 1> ((mkplusx 2) 6) 8 25.6.2008 Beweisbar korrekte Software — Sommersemester 2008 18 Typausdrücke • PPL ist stark typisiert. Jeder PPL‐Ausdruck hat einen Typ. • Typfehler in Funktionsdefinitionen sind unmöglich. Typausdrücke sind: • Typausdrücke sind: <typevar> := *t*, *t2*, *t3*,… <typeexpr> := <typevar>| (<typeconstructor> <typeexpr1> … <typeexprn>) • Typkonstruktoren sind: – – – – 25.6.2008 bool, string, bool string int, int tree, tree … (0‐stellig) (0 stellig) list (1‐stellig) Alle mkpair (2 stellig) (2‐stellig) Listenelemente haben fun (n‐stellig) denselben Typ! Beweisbar korrekte Software — Sommersemester 2008 19 Typausdrücke • 25.6.2008 Einige Beispiele: A d k Ausdruck T Typ 3 (int) ″ab″ ( (string) g) (mkpair 3 t) (pair (int) (bool)) (lambda (x y) (+ x y)) (fun (int)(int)(int)) (list 3) (list (int)) nil (list *t*) (lambda (x) x) (fun *t* *t*) (lambda (x) (cons x nil)) (fun *t* (list *t*)) Beweisbar korrekte Software — Sommersemester 2008 20 Typausdrücke • • Einige Beispiele: A d k Ausdruck T Typ 3 (int) ″ab″ ( (string) g) (mkpair 3 t) (pair (int) (bool)) (lambda (x y) (+ x y)) (fun (int)(int)(int)) (list 3) (list (int)) nil (list *t*) (lambda (x) x) (fun *t* *t*) (lambda (x) (cons x nil)) (fun *t* (list *t*)) Pretty printing von Typen in KIV anders: Pretty‐printing von Typen in KIV anders: – – – – 25.6.2008 (int) ⇒ int (list (int)) ⇒ int* (fun ( ( (int) ) ( (int)) )) ⇒ int -> int (pair (int) (int)) ⇒ [ int | int ] Beweisbar korrekte Software — Sommersemester 2008 21 Vordefinierte Funktionen Vordefinierte Funktionen • Es gibt in PPL eine Reihe von vordefinierten Funktionen, z.B.: – +, ‐, *, div – <, >, = – (list arg1,…,argn), car, cdr, emptyp, member, append – (mkpair arg1 arg2), fst, snd – (and arg1 … argn), or, not • Details siehe Praktikumsdoku 25.6.2008 Beweisbar korrekte Software — Sommersemester 2008 22 Listenfunktionen • Listen sind in PPL vordefiniert. Wichtige Funktionen: • nil oder (list): Erzeugt leere Liste expr2): Fügt expr1 Fügt expr1 vorne an Liste vorne an Liste • (cons expr1 expr2): expr2 and • (append expr1 expr2): expr2): Hängt expr2 Hängt expr2 hinten an hinten an expr1 an • (car ( expr): Liefert das erste Element von expr ) Li f t d t El t • (cdr expr): Liefert die Restliste (ohne das erste Element) von expr 25.6.2008 Beweisbar korrekte Software — Sommersemester 2008 23 Beispiele zu Listen Beispiele zu Listen PPL 1 PPL [2 [2, PPL [2] PPL F PPL 25.6.2008 1> (car (cons 1 (list 2 3))) 1> (cdr (append (list 1 2) (list 3 4))) 3 3, 4] 1> (cons 2 nil) 1> (emptyp (cons t nil)) 1> Beweisbar korrekte Software — Sommersemester 2008 24 Kontrollstrukturen • PPL kennt nur wenige Kontrollstrukturen: g – Fallunterscheidungen – Definition lokaler Variablen – backtracking 25.6.2008 Beweisbar korrekte Software — Sommersemester 2008 25 Fallunterscheidung • Fallunterscheidungen werden mit cond oder if durchgeführt: – (if condexpr thenexpr elseexpr) – (cond (test1 expr1) (test2 expr2) ⁞ (t exprn)) • Beispiele: B i i l PPL 1> (if t (+ 2 3) 0) 5 PPL 1> (cond ((emptyp (list)) 0) (t 1)) ( )) 0 25.6.2008 Beweisbar korrekte Software — Sommersemester 2008 26 Lokale Variablen Lokale Variablen • Lokale Variablen werden mit let* deklariert: (let* ((var1 expr1) (var2 expr2) ⁞ (varn exprn)) expr) p ) • Zuerst wird expr1 ausgewertet und das Ergebnis an var1 gebunden, dann expr2, in der var1 gebunden dann expr2 in der var1 benutzt benutzt werden kann, usw. • Das Ergebnis des let* Das Ergebnis des let* ist expr ist expr • Bei let (statt let*) werden expr1,…,exprn parallel ausgewertet ll l 25.6.2008 Beweisbar korrekte Software — Sommersemester 2008 27 Lokale Variablen Lokale Variablen • Beispiel: PPL 1> (let* ((x (+ 2 5)) (y (+ x x )) ) (+ y y )) 28 PPL 1> 25.6.2008 Beweisbar korrekte Software — Sommersemester 2008 28 backtracking • KIV hat ein generisches System für Exceptions und Exception‐Handler g p g • Hier nur ein wichtiger Spezialfall für backtracking • backtracking ist in PPL sehr leicht zu realisieren • backtracking wird mit dem Kommando (fail) wird mit dem Kommando (fail) ausgelöst oder durch andere vordefinierte Funktionen wie makettree refine, wie makettree, refine infer, infer match • Die Fortsetzungsstelle für die Programmausführung wird mit orL it L deklariert: d kl i t (orL expr1 expr2) Wird zuerst ausgewertet 25.6.2008 Falls fail in expr1 wird expr2 ausgewertet Beweisbar korrekte Software — Sommersemester 2008 29 Backtracking • Beispiele PPL 1> (orL 3 4) 3 PPL 1> (orL (fail) (+ 3 (fail)) 4) 4 PPL 1> (equal (fail) (fail)) Error: operation FAIL failed 25.6.2008 Beweisbar korrekte Software — Sommersemester 2008 30 Schnittstelle zum Dateisystem Schnittstelle zum Dateisystem • Laden von PPL‐Source‐Dateien: load und require PPL 1> (load ″~/ppl/proplogic″) ;;; loading proplogic ;;; loaded proplogic • exit in einer Datei beendet das Laden an dieser Stelle • Schnittstelle zum Dateisystem: cd, pwd PPL 1> (cd ″~″) T PPL 1> (pwd) /home/dominik 25.6.2008 Beweisbar korrekte Software — Sommersemester 2008 31 Ein‐‐/Ausgabe Ein • Textausgabe: PPL 1> x wird PPL 1> 10 PPL 1> 4 25.6.2008 before (def (x (before ″x wird initialisiert″ 3))) initialisiert (def (y (before (+ x 7) (+ x 1)))) y Beweisbar korrekte Software — Sommersemester 2008 32 Ein‐‐/Ausgabe Ein • Mit read kann man Eingaben vom Benutzer verlangen (read x (<typ> expr)) Datentyp der Eingabe 25.6.2008 Ausdruck für das Ergebnis des read Beweisbar korrekte Software — Sommersemester 2008 33 Ein‐‐/Ausgabe Ein • Beispiel für read: PPL 1> (read x ((INT) x)) PPL 2> ″c″ c PPL 2> exit Error: no positive type case for read found in function <-PPL PPL 1> ( (def (y ( (read x (( ((INT) ) ( (* x x))))) ))))) PPL 2> 4 4 PPL 2> exit it PPL 1> y 16 25.6.2008 Beweisbar korrekte Software — Sommersemester 2008 34 Formeln Formeln und Sequenzen in KIV und Sequenzen in KIV • Datentypen für Formeln (fl) und Sequenzen (seq) sind in KIV fest eingebaut p g g g • Werden am PPL‐Prompt wie folgt eingegeben: 1. Durch direkte Konstruktion der PPL‐Datenstruktur PPL 1> (mkall (mkvl1 (list (mkxov ( k (mkxov (mkeq (mkxov (mksym (mkxov (mksym all s s, s0 s0. s = s0 PPL1> (mksym ″s″)) ( k (mksym ″ 0″)))) ″s0″)))) ″s″)) ″s0″)))) 2. Über den Parser PPL 1> % ″all s , s0 . s = s0″ all s, s0. s = s0 PPL 1> 25.6.2008 Beweisbar korrekte Software — Sommersemester 2008 35 Formeln Formeln und Sequenzen in KIV und Sequenzen in KIV • Man benötigt allerdings zuerst eine geeignete Signatur • Variante 1: Aus Projekt laden PPl 1> (resetsig) PPL 1> 1 (def (dvg (load-devgraph-dir-til-ok (mkdirectory ″?/lib/basic″)))) PPL 1> (add-specsig-dvg ″nat″ dvg) T PPL 1> %″0 +1 = 0 + 1″ Top‐level Spezifikation, 0 +1 = 0 + 1 deren Signatur man PPL 1> nutzen will 25.6.2008 Beweisbar korrekte Software — Sommersemester 2008 36 Formeln Formeln und Sequenzen in KIV und Sequenzen in KIV • Variante 2: Eingabe am PPL‐Prompt PPL 1> %″sorts s ;″ [s] PPL 1> %″variables s, s0, s1 : s ;″ [s, s0, s1] • Aus Formeln kann man Sequenzen bauen: PPL 1> (def (formel1 %″not n +1 +1 = 0 +1″)) PPL 1> (def (formel2 %″ex n . not (n = 0 +1)″)) PPL 1> (def (seq q (mkseq q (mkfl1 (list formel1 %″true″)) (mkfl1 (list formel2))))) PPL 1> seq not n +1 +1 = 0 +1, true |- ex n. not n = 0 +1 25.6.2008 Beweisbar korrekte Software — Sommersemester 2008 37 Beweisbäume Beweisbäume in KIV in KIV • (Beweis‐)Bäume sind ebenfalls ein fest in KIV eingebauter Datentyp • Ein Beweisbaum ist entweder – Eine Sequenz PPL 1> (ppltype seq) The type of SEQ is (TREE) The computed substitution is NIL 25.6.2008 Beweisbar korrekte Software — Sommersemester 2008 38 Beweisbäume Beweisbäume in KIV in KIV – Ein zusammengesetzer Baum PPL 1> 1 ( (ppltype l di dis_r) ) The type of DIS_R is (TREE) The computed substitution is NIL 25.6.2008 Beweisbar korrekte Software — Sommersemester 2008 39 Beweisregeln Beweisregeln als Bäume als Bäume • Sequenzenkalkülregeln werden als Bäume repräsentiert Konklusion und Prämissen enthalten Metavariablen, die durch K kl i dP ä i h l M i bl di d h pattern‐matching instanziiert werden – Formeln: $phi, $phi $psi – Formellisten: $Gamma, $Delta – Programme: P $ l h $beta $alpha, $b t – Boolesche Werte: $epsilon 25.6.2008 Beweisbar korrekte Software — Sommersemester 2008 40 Matching von Formelpatterns von Formelpatterns PPL 1> (def (seq (mkseq (mkfl1 (list)) (mkfl1 (list %″n = n or n < n″) )))) |- n = n or n < n PPL 1> (concl dis_r) $Γ |- $ϕ or $ψ, $Δ PPL 1> (matchp seq (concl dis_r)) T 25.6.2008 Beweisbar korrekte Software — Sommersemester 2008 41 Beweisbäume konstruieren Beweisbäume konstruieren • Beweisbäume werden durch Regelanwendungen konstruiert , ein Beweisbaum an einer offenen • In PPL heißt das, daß Prämisse um einen Regelbaum erweitert wird. Dazu: 1. Matchen der Konklusion des Regelbaums und der Prämisse g des Beweisbaums 2. Instanziieren der Prämisse des Regelbaums 3. Kombination der beiden Teilbäume zu einem neuen Baum • Dies erledigt die Funktion refine g e e 25.6.2008 Beweisbar korrekte Software — Sommersemester 2008 42 refine PPL 1> seq |- n = n or n < n PPL 1> (refine seq 1 dis_r) ** A TREE ** 25.6.2008 Beweisbar korrekte Software — Sommersemester 2008 43 refine PPL 1> (def (id (lambda (x) x))) PPL 1> (orL (refine (id seq) 1 neg_r) (before ″Pech gehabt″ seq)) Pech gehabt |- n = n or n < n PPL 1> 25.6.2008 Beweisbar korrekte Software — Sommersemester 2008 44 refine und und backtracking und backtracking PPL 1> (orL (refine(id (refine(id (refine(id (refine(id ** A TREE ** PPL 1> 25.6.2008 seq) seq) seq) seq) Beweisbar korrekte Software — Sommersemester 2008 1 1 1 1 neg_r) con_r) imp_r) dis_r)) 45 Fehlersuche • PPL hat einen Debugger: Siehe Praktikumsdoku • Funktionsaufrufe werden mit dem Tracer überwacht. Er g gibt bei jedem Funktionsaufruf die Parameterwerte und j beim Verlassen der Funktion den Ergebniswert aus. Aufruf erfolgt mit (trace fun) • Aufruf erfolgt mit (trace • Will man nur manche Argumente sehen: (trace (fun 0 2 3)) Ergebnis ausgeben Aufrufparameter 2 und 3 ausgeben und 3 ausgeben • Das Tracen wird beendet mit ( t (untrace f ) fun) 25.6.2008 Beweisbar korrekte Software — Sommersemester 2008 46 Der Tracer Der Tracer PPL 1> (trace reverse-h) (reverse-h) PPL 1> (reverse (list 1)) +++ REVERSE-H +++++++++++++++++++ first argument: [1] second argument: [] ++++++ REVERSE-H ++++++++++++++++ first argument: [] second argument: g [1] ------ REVERSE-H ---------------[1] --- REVERSE-H ------------------[1] 25.6.2008 Beweisbar korrekte Software — Sommersemester 2008 47