Algebraische Spezifikation

Ähnliche Dokumente
Formale Methoden in der Informatik Wiederholung klassische Logik Konkrete Datentypen (algebraische Strukturen) Abstrakte Datentypen

Abstract Data Type and the Development of Data Structures

Abstrakte Datentypen.

Mathematik und Logik

Teil IV : Abstrakte Datentypen (ADT)

Verifikation von Programmen

1. Teilklausur. Modul "OOPM Vorlesung/Übung" Gruppe A

Rekursive Funktionen

ALP I Induktion und Rekursion

Induktion und Rekursion

Grundlagen der Programmierung. Kapitel 8: Information und Repräsentation. Überblick über dieses Kapitel. Repräsentation versus Information.

2.3 Spezifikation von Abstrakten Datentypen

1 Übersicht Induktion

Grundbegriffe der Informatik Tutorium 2

Stapel (Stack, Keller)

Induktion und Rekursion

Softwaretechnik WS 16/17. Übungsblatt 01

Theorie der Informatik

Grundbegriffe der Informatik Tutorium 2

Praktische Informatik 3: Einführung in die Funktionale Programmierung Vorlesung vom : Rekursive Datentypen

Algorithmen und Programmierung

Grundlagen der Mathematik

Überblick über dieses Kapitel Grundlagen der Programmierung Kapitel 12: Information und Repräsentation

Theoretische Informatik. Alphabete, Worte, Sprachen

14 Abstrakte Klassen, finale Klassen, Interfaces

14 Abstrakte Klassen, finale Klassen, Interfaces. Auswertung von Ausdrücken. Beispiel. Abstrakte Methoden und Klassen

Logik für Informatiker

1 Abstrakte Datentypen

Σ = (z; c : z, f : z z) Σ = (z; c : z, f : z z) ( ; 17, x -x) ( ; 17, pred) ( ; true, neg) ( ; 0, suc) ({a,b} + ; a, xa xb und xb xa)

12 Abstrakte Klassen, finale Klassen und Interfaces

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

Interface. So werden Interfaces gemacht

Mathematik für Informatiker 1 Wintersemester 2013/14 Übungsblatt 6

ALP II Dynamische Datenmengen Datenabstraktion (Teil 2)

Vorlesung. Vollständige Induktion 1

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Programmierung mit Feldern OOPM, Ralf Lämmel

Grundlagen der Mathematik

Satz 7. A sei eine Teilmenge des nichttrivialen Vektorraums (V,+, ). Dann sind die folgende Aussagen äquivalent.

Diskrete Strukturen Kapitel 2: Grundlagen (Mengen)

TU8 Beweismethoden. Daniela Andrade

Aufgaben und Lösungen zum Vorkurs Mathematik: Beweismethoden Für Mittwoch den

Programmierung im Grossen

Entwicklung korrekter Programme in Coq. Thomas Strathmann

1. Typen 1.1 Typsicherheit 1.2 Typprüfung

Stacks, Queues & Bags. Datenstrukturen. Pushdown/Popup Stack. Ferd van Odenhoven. 19. September 2012

Programmieren in Java

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

Grundbegriffe der Informatik

int x = 3; int y = 11; public A () { this.x = z; y *= z;

Funktionale Programmierung Teil 2 Methodik: Spezifikation, Implementierung, Verifikation

Institut für Programmierung und Reaktive Systeme 17. Juli Programmieren II. Übungsklausur

Grundbegriffe der Informatik

Einstieg in die Informatik mit Java

1.2 Eigenschaften der ganzen Zahlen

Übergang von funktionaler zu OOP. Algorithmen und Datenstrukturen II 1

Institut für Programmierung und Reaktive Systeme. Java 6. Markus Reschke

Elementare Beweistechniken

Deklaration einer Klasse Innere innerhalb Klassen einer in Ja anderen v a Klasse

Übungsblatt Programmierung und Software-Entwicklung Generizität, Interfaces, Listen, Sortieralgorithmen & JUnit

Praktische Informatik 3: Funktionale Programmierung Vorlesung 3 vom : Algebraische Datentypen

Handout zu Beweistechniken

2.3 Implementierung und Anwendung von ADT Anwendung von ADT... am Beispiel "Stapel"

Übung Algorithmen und Datenstrukturen

Aufgaben und Lösungen zum Vorkurs Mathematik: Beweismethoden Für Donnerstag den x > 1 3x > 3 3x + 3 > 6 6x + 3 > 3x + 6.

Verkettete Datenstrukturen: Listen

12. Dynamische Datenstrukturen

Schwerpunkte. Verkettete Listen. Verkettete Listen: 7. Verkettete Strukturen: Listen. Überblick und Grundprinzip. Vergleich: Arrays verkettete Listen

Praktische Informatik 3: Funktionale Programmierung Vorlesung 4 vom : Typvariablen und Polymorphie

6.1 Natürliche Zahlen. 6. Zahlen. 6.1 Natürliche Zahlen

Informatik I Tutorium WS 07/08

Logik für Informatiker

5 Logische Programmierung

Beispiele für Ausdrücke. Der imperative Kern. Der imperative Kern. Imperativer Kern - Kontrollstrukturen. Deklarationen mit Initialisierung

2.4 Datenabstraktion und Objektorientierung Datenabstraktion in Programmiersprachen

2.5 Listen. Kurzschreibweise: [42; 0; 16] Listen werden mithilfe von [] und :: konstruiert.

Grundkurs Mathematik I

Brückenkurs Mathematik

Vollständige Induktion

Donnerstag, 11. Dezember 03 Satz 2.2 Der Name Unterraum ist gerechtfertigt, denn jeder Unterraum U von V ist bzgl.

3. Dokumentieren und Testen Advanced Programming Techniques Prof. Dr. Bernhard Humm FB Informatik, Hochschule Darmstadt

5. Januar Universität Bielefeld AG Praktische Informatik. Programmieren in Haskell. Stefan Janssen. Abstrakte Datentypen.

6. Verkettete Strukturen: Listen

Programmieren in Haskell

Klausur: Java (Liste P)

Programmieren in Java -Eingangstest-

3. Übungsbesprechung Programmkonstruktion

Informatik I. Informatik I Iteration vs. Rekursion. Iteration vs. Rekursion Iteration vs. Rekursion. 20. Iteration vs.

Client-Server-Beziehungen

Transkript:

top(pop(push(42,empty))) =? http://shemesh.larc.nasa.gov/fm/fm-humor.html Algebraische Spezifikation OOPM, Ralf Lämmel

610 Wie beschreiben wir das erwartete Verhalten von einem ADT? public class IntStack { private IntListEntry top = null; public void push(int item) { IntListEntry e = new IntListEntry(); e.item = item; e.next = top; top = e; Testfälle? Vor-/Nachbedingungen? } public boolean isempty() { return top == null; } public int top() { return top.item; } public void pop() { top = top.next; } }

611 So beschreiben wir das erwartete Verhalten von einem Algorithmus! Angenommen: Dann ist dies zu zeigen: { x >= 0 && y > 0 } q = 0; r = x; while (r >= y) { r = r - y; q = q + 1; } { x == y q + r && r < y && r >= 0 && q >= 0 } Vorbedingung Zusicherungen Nachbedingung Vor Programmausführung muss gelten, dass... Nach Programmausführung gilt, dass...

612 Optionen zur Verhaltensbeschreibung von ADTs Testfälle Keine vollständige Beschreibung. Siehe ADT-Vorlesung. Vor- und Nachbedigungen Nur eingeschränkt möglich. Wir benötigen Zugriff auf die Geschichte von Kapseln. Algebraische Spezifikationen Wie heute besprochen.

613 Algebraische Spezifikation von IntStack: Konstruktoren empty push : IntStack : int IntStack IntStack Operationen zur kanonischen Repräsentation Repräsentation von Kellern: empty, push(42,empty), push(88,push(42,empty)),...

614 Algebraische Spezifikation von IntStack: Operationen isempty : IntStack Boolean top pop : IntStack int : IntStack IntStack Alle Operationen außer den Konstruktoren. Die ultimative Frage: was ergeben Anwendungen von Operationen auf kanonische Repräsentationen? top(push(88,push(42,empty))) =?

615 Algebraische Spezifikation von IntStack: Gleichungen Der leere Keller ist leer. isempty(empty) isempty(push(t,l)) top(push(t,l)) pop(push(t,l)) = true = false = t = l Ein durch push entstandener Keller ist nicht leer. Der zuletzt eingekellerte Werte wird durch top zurückgegeben. pop gibt den Keller zurück, auf welchen zuletzt eingekellert wurde.

616 Anwendung von Gleichungen zur Normalisierung push(88,pop(push(42,empty))) pop(push(t,l)) = l push(88,empty) Wir wenden Gleichungen solange an, bis nichts mehr geht (oder für immmer).

617 Algebraische Spezifikation von IntStack Konstruktoren empty : IntStack push : int IntStack IntStack Operationen isempty top pop : IntStack Boolean : IntStack int : IntStack IntStack Gleichungen isempty(empty) = true isempty(push(t,l)) = false top(push(t,l)) = t pop(push(t,l)) = l

618 Algebraische Spezifikation von Boolean specification Boolean sorts Boolean constructors true : Boolean false : Boolean operations not and or equations... : Boolean Boolean : Boolean Boolean Boolean : Boolean Boolean Boolean Verwendung einer Spezifikationssprache; siehe die Schlüsselwörter.

619 Gleichungen zu Boolean equations not(true) = false not(false) = true and(false,false) = false and(false,true) = false and(true,false) = false and(true,true) = true...

620 Anwendung von Gleichungen zur Normalisierung not(and(not(false),false) not(false) = true not(and(true,false)) and(true,false) = false not(false) not(false) = true true Wir wenden Gleichungen solange an bis nichts mehr geht (oder für immmer).

621 Alternative Axiomatisierungen von and and(false,false) = false and(false,true) = false and(true,false) = false and(true,true) = true and(true,b) = b and(b,true) = b and(false,b) = false and(b,false) = false and(true,true) = true and(b1,b2) = false Definition basierend auf erschöpfender Fallunterscheidung von Booleschen Argumenten Verwendung von Variablen beim Matchen (Die Gleichungen schließen einander immer noch aus!) Wir haben eine speziellere und eine allgemeinere Gleichung.

622 Definition versus Folgerung and(false,false) = false and(false,true) = false and(true,false) = false and(true,true) = true Wir können diese Gleichungen als die primäre Definition von and ansehen. and(b1,b2) = and(b2,b1) and(b1,and(b2,b3)) = and(and(b1,b2),b3) Die Eigenschaften der Kommutativität und Assoziativität folgen aus der primären Definition.

623 Definition versus Folgerung and(true,b) = b and(b,true) = b and(false,b) = false and(b,false) = false Alternative and(b1,b2) = and(b2,b1) and(b1,and(b2,b3)) = and(and(b1,b2),b3)

624 Unterscheidung von Definition und Folgerung in der Spezifikationssprache equations and(false,false) = false and(false,true) = false and(true,false) = false and(true,true) = true corollaries and(b1,b2) = and(b2,b1) and(b1,and(b2,b3)) = and(and(b1,b2),b3) Wir sollten beweisen, dass die Folgerungen tatsächlich aus den anderen Gleichungen folgen.

625 Unterscheidung von Definition und Folgerung in der Spezifikationssprache equations and(true,b) = b and(b,true) = b and(false,b) = false and(b,false) = false Alternative corollaries and(b1,b2) = and(b2,b1) and(b1,and(b2,b3)) = and(and(b1,b2),b3) Wir sollten beweisen, dass die Folgerungen tatsächlich aus den anderen Gleichungen folgen.

626 and(b1,b2) = and(b2,b1)? Konventionen: LHS (linke Seite; left-hand side) RHS (rechte Seite; right-hand side) Zu zeigen dass LHS = RHS für alle Belegungen von b1 und b2 vermöge Gleichungen der Wahrheitstabelle [1] and(false,false) = false [2] and(false,true) = false [3] and(true,false) = false [4] and(true,true) = true

627 and(b1,b2) = and(b2,b1)? Beweis per Fallunterscheidung Fall 1: b1 = false Fall 1a: b2 = false LHS: and(false,false) = false wegen [1] RHS: and(false,false) = false wegen [1] Fall 1b: b2 = true LHS: and(false,true) = false wegen [2] RHS: and(true,false) = false wegen [3] Fall 2: b1 = true Fall 2a: b2 = false LHS: and(true,false) = false wegen [3] RHS: and(false,true) = false wegen [2] Fall 2b: b2 = true LHS: and(true,true) = true wegen [4] RHS: and(true,true) = true wegen [4] [1] and(false,false) = false [2] and(false,true) = false [3] and(true,false) = false [4] and(true,true) = true Q.E.D.

628 Algebraische Spezifikation - Wozu? Algebraische Spezifikation als Modellierungsform Spezifikation mit mathematischer Interpretation Ausführbare Spezifikationen Grundlage korrekter Implementation Anwendbarkeit mathematischer Beweismethoden Deklarative Programmierung Beschreibung des Was ; nicht des Wie Abstraktion von operationaler Semantik Fokussierung auf Programmeigenschaften

629 Eine Sprache für (konstruktive) algebraische Spezifikationen specification... imports... sorts... } constructors... variables... operations... equations... corollaries... } Name der Spezifikation zur Wiederverwendung Import von Spezifikationen zur Signatur = Beschreibung möglicher Terme Gleichungen spezifizieren Teilmengen gleicher Terme.

Weitere Beispiele (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau 630

631 Eine Spezifikation für die natürlichen Zahlen Repräsentation von natürlichen Zahlen: sorts Nat zero, succ(zero), succ(succ(zero)), succ(succ(succ(zero))),... constructors zero : Nat // "0" succ : Nat Nat // Successor operations add : Nat Nat Nat // Addition mult : Nat Nat Nat // Multiplication factorial : Nat Nat // Factorial function equations...

632 Eine Spezifikation für die natürlichen Zahlen specification Nat sorts Nat variables n, m : Nat constructors zero : Nat // "0" succ : Nat Nat // Successor Benennung der Spezifikation Vereinbarung von Variablen operations add : Nat Nat Nat // Addition mult : Nat Nat Nat // Multiplication factorial : Nat Nat // Factorial function zero, succ(zero), succ(succ(zero)),... Variablen sind universell quantifiziert in Gleichungen. Man kann also jeden Term der Sorte einsetzen. equations add(zero,n) = n add(succ(n),m) = succ(add(n,m)) mult(zero,n) = zero mult(succ(n),m) = add(m,mult(n,m)) factorial(zero) = succ(zero) factorial(succ(n)) = mult(succ(n),factorial(n))

633 Definition versus Folgerung equations add(zero,n) = n add(succ(n),m) = succ(add(n,m)) mult(zero,n) = zero mult(succ(n),m) = add(m,mult(n,m)) factorial(zero) = succ(zero) factorial(succ(n)) = mult(succ(n),factorial(n)) Beachte die Argumentmuster basierend auf Konstruktoren (und Variablen). corollaries add(m,n) = add(n,m) add(m,add(n,k)) = add(add(m,n),k)... Wir mögen uns weitere, nichtkonstruktive Gleichungen gestatten, aber diese müssen wir markieren und nicht bei der Normalisierung verwenden sondern vielmehr als implizierte Eigenschaften annehmen oder herleiten.

634 Spezifikation von Listen über Nat Repräsentation von Listen: sorts NatList constructors nil : NatList cons : Nat NatList NatList nil, cons(42,nil), cons(88,cons(42,nil)),... Statt: {}, {42}, {88,42} operations append : NatList NatList NatList snoc : NatList Nat NatList... equations...

635 Spezifikation von Listen über Nat specification NatList imports Nat Modularisierung basiert auf Importierung von Spezifikationen. sorts NatList variables l, l1, l2 : NatList constructors nil cons operations : NatList : Nat NatList NatList append : NatList NatList NatList snoc... equations : NatList Nat NatList append(nil,l) = l append(cons(n,l1),l2) = cons(n,append(l1,l2)) snoc(l,n) = append(l,cons(n,nil))... {42, 88} [42, 88] cons(42,cons(88,nil)) Definitionen dürfen auch Substitution benutzen.

636 Implementation algebraischer Spezifikationen Zielstellung Abbildung der Spezifikationen auf Java. Es gibt Sprachen die keine Codierung verlangen: F#, Scala, Haskell,... Prototypische Implementation ausreichend. Eine Vorgehensweise Sorte wird Schnittstelle. Es gibt diverse Optionen und Spezialfälle. Operationen sind Methoden der Schnittstelle. Konstruktoren werden Klassen. Die Klassen implementieren die Schnittstelle. Die Klassen haben Attribute für Konstruktorenargumente.

637 Sorte versus Schnittstelle sorts Nat constructors zero : Nat // "0" succ : Nat Nat operations // Successor add : Nat Nat Nat // Addition mult : Nat Nat Nat // Multiplication factorial : Nat Nat // Factorial function public interface Nat { Nat add(nat m); Nat mult(nat m); Nat factorial(); } this steht für die erste Argumentposition.

638 Konstruktoren versus Klassen sorts Nat constructors zero : Nat // "0" succ : Nat Nat // Successor public class Zero implements Nat {... } public class Succ implements Nat { } private Nat n; public Succ(Nat n) { this.n = n; }...

639 Gleichungen für den zero -Fall equations add(zero,n) = n add(succ(n),m) = succ(add(n,m)) mult(zero,n) = zero mult(succ(n),m) = add(m,mult(n,m)) factorial(zero) = succ(zero) factorial(succ(n)) = mult(succ(n),factorial(n)) public class Zero implements Nat { public Zero() { } public Nat add(nat n) { return n; } public Nat mult(nat m) { return new Zero(); } public Nat factorial() { return new Succ(new Zero()); } }

640 Gleichungen für den succ -Fall equations add(zero,n) = n add(succ(n),m) = succ(add(n,m)) mult(zero,n) = zero mult(succ(n),m) = add(m,mult(n,m)) factorial(zero) = succ(zero) factorial(succ(n)) = mult(succ(n),factorial(n)) public class Succ implements Nat { private Nat n; public Succ(Nat n) { this.n = n; } } Anteil für den Konstruktor public Nat add(nat m) { return new Succ(n.add(m)); } public Nat mult(nat m) { return m.add(n.mult(m)); } public Nat factorial() { return mult(n.factorial()); }

641 Diskussion dieser Implementationsstrategie Seiteneffektfreiheit Die Methoden verändern keine bestehenden Objekte. Ineffizienz Die Vermeidung von int erscheint potentiell unvernünftig. Ad-hoc Zuordnung von Operationen zu Klassen Die Sorte des ersten Argumentes entscheidet. Beschränkungen durch Substitution definierte Funktionen verschachtelte Muster Matching in mehreren Argumenten

Beweise von Eigenschaften (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau 642

643 Ausgewählte Eigenschaften natürlicher Zahlen succ kann von links nach aussen gezogen werden. add(succ(x),y) = succ(add(x,y)) auch von rechts. add(x,succ(y)) = succ(add(x,y)) add ist assoziativ. add(x,add(y,z)) = add(add(x,y),z) add ist kommutativ. add(x,y) = add(y,x)

644 Beweistechniken Nicht immer ausreichend Anwendung von Gleichungen Beschränkung auf endliche Wertebereiche Erschöpfende Fallunterscheidung Strukturelle Induktion Anwendbarkeit auf Eigenschaften von Nat, List<T> usw.

Satz: Für alle x,y : Nat gilt: add(succ(x),y) = succ(add(x,y)) Zu zeigen trivial add(succ(x),y) = succ(add(x,y)) Beweis ( Forme LHS in RHS um. ) add(succ(x),y) = succ(add(x,y)) { Wende [2] an. n := x m := y } Substitutionen werden nachfolgend weggelassen. [1] add(zero,n) = n [2] add(succ(n),m) = succ(add(n,m)) Q.E.D. (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau 645

Satz: Für alle x,y : Nat gilt: add(x,succ(y)) = succ(add(x,y)) Annahme add ist kommutativ, d.h.: add(x,y) = add(y,x) Zu zeigen: add(x,succ(y)) = succ(add(x,y)) Beweis add(x,succ(y)) = add(succ(y),x) { Kommutativität } = succ(add(y,x)) { [2] } = succ(add(x,y)) { Kommutativität } Der Succ Satz [1] add(zero,n) = n [2] add(succ(n),m) = succ(add(n,m)) Q.E.D. (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau 646

Satz: add ist assoziativ. Zu zeigen add( x, add( y, z )) = add( add( x, y ), z ) Beweis: Induktion über x [1] add(zero,n) = n [2] add(succ(n),m) = succ(add(n,m)) (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau 647

648 Beweis mittels vollständiger Induktion Behauptung: A(k) gilt für alle natürlichen Zahlen k Beweisschema Induktionsanfang (IA) Zu zeigen dass A(0) gilt. Induktionsschritt (IS) Sei k eine beliebige natürliche Zahl. Induktionsvoraussetzung (IV): A(k) gilt. Induktionsbehauptung (IB): A(k+1) gilt. Beweis: Zeige dass IB gilt unter Verwendung von IV. im Beispiel: add(x,add(y,z)) = add(add(x,y),z) gilt für alle natürlichen Zahlen x.

649 Warum klappt das? k = 0: gezeigt durch IA. k = 1: Beweis von IS zeigt: A(0) A(1) k = 2: Beweis von IS zeigt: A(1) A(2)...

Satz: add ist assoziativ. Zu zeigen add(x,add(y,z)) = add(add(x,y),z) Beweis: Induktion über x Induktionsanfang: x = zero Zu zeigen: add(zero,add(y,z)) = add(add(zero,y),z) Beweis add(zero,add(y,z)) = add(y,z) { [1] } = add(add(zero,y),z) { [1] } [1] add(zero,n) = n [2] add(succ(n),m) = succ(add(n,m)) Q.E.D. (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau 650

Satz: add ist assoziativ. Induktionsschritt: x = k IV: add(k,add(y,z)) = add(add(k,y),z) IB: add(succ(k),add(y,z)) = add(add(succ(k),y),z) Beweis add(succ(k),add(y,z)) = succ(add(k,add(y,z)) { [2] } = succ(add(add(k,y),z) { IV } = add(succ(add(k,y)),z) { [2] } = add(add(succ(k),y),z) { [2] } [1] add(zero,n) = n [2] add(succ(n),m) = succ(add(n,m)) Q.E.D. (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau 651

Zusammenfassung ADTs können ( algebraisch ) spezifiziert werden. Eigenschaften von algebraischen Spezifikation Präzise (verglichen zu imperativen/oo-programmen) Formal (verwendbar für mathematische Beweise) Ausführbar (im funktionalen oder OO-Paradigma) Implementiertierbar Ausblick Komplexitätsanalyse Objektorientierung

http://www.qwantz.com/fanart/dino-comic-proof.png Weitere induktive Beweise Fakultatives Material (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau 653

Satz: add ist kommutativ. Zu zeigen: add(x,y) = add(y,x) Beweis: Induktion über x Induktionsanfang: x = zero Zu zeigen: add(zero,y) = add(y,zero) Beweis: Induktion über y Übungsaufgabe [1] add(zero,n) = n [2] add(succ(n),m) = succ(add(n,m)) (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau 654 Fakultatives Material

Satz: add ist kommutativ. Induktionsschritt: x = k IV: add(k,y) = add(y,k) IB: add(succ(k),y) = add(y,succ(k)) Beweis add(succ(k),y) = succ(add(k,y)) { [2] } = succ(add(y,k)) { IV } = add(y,succ(k)) { Der Succ Satz } [1] add(zero,n) = n [2] add(succ(n),m) = succ(add(n,m)) Q.E.D. (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau 655 Fakultatives Material

656 Satz: add ist kommutativ. Oops! Beweis von Succ Satz benutzt Kommutativität. Beweis von Kommutativität benutzt Succ Satz. Was tun? Beweise Succ Satz per Induktion. Übungsaufgabe Fakultatives Material

657 Von Vollständiger Induktion zur Strukturellen Induktion Induktion immer über kanonische Repräsentation Induktionsanfang Fälle für nichtrekursive Konstruktoren Induktionsschritt Fälle für rekursive Konstruktoren Fakultatives Material

658 Eigenschaften von Listen append(nil,l) = l append(cons(t,l1),l2) = cons(t,append(l1,l2)) length(nil) = zero length(cons(t,l)) = succ(length(l)) reverse(nil) = nil reverse(cons(t,l)) = append(reverse(l),cons(t,nil)) append bewahrt Länge. length(append(l1,l2)) = add(length(l1),length(l2)) append ist assoziativ. append(l1,append(l2,l3)) = append(append(l1,l2),l3) Zweimal reverse ist Identität. reverse(reverse(l)) = l Fakultatives Material

659 Satz: append bewahrt die Länge. Zu zeigen: length(append(l1,l2)) = add(length(l1),length(l2)) Beweis: Induktion über l1 Induktionsanfang: l1 = nil Zu zeigen: length(append(nil,l2)) = add(length(nil),length(l2) Beweis length(append(nil,l2)) = length(l2) { [append@nil] } = add(zero,length(l2)) { [add@zero] } = add(length(nil),length(l2)) { [length@nil] Q.E.D. Fakultatives Material

660 Satz: append bewahrt die Länge. Induktionsschritt: l1 = k IV: length(append(k,l2)) = add(length(k),length(l2)) IB: length(append(cons(t,k),l2)) = add(length(cons(t,k)),length(l2)) für beliebige t Beweis length(append(cons(t,k),l2)) = length(cons(t,append(k,l2))) { append@cons } = succ(length(append(k,l2))) { length@cons } = succ(add(length(k),length(l2))) { IV } = add(succ(length(k)),length(l2)) { add@succ } = add(length(cons(t,k)),length(l2)) { length@cons } Q.E.D. Fakultatives Material