16 - Theorie der Programmierung [ID:8069]
50 von 370 angezeigt

Herzlich willkommen! Wir beschäftigen uns heute mit einem allseitigen Lieblingsthema Induktion.

Ja, wir stellen es unter eine etwas neue Überschrift. Wir machen eben Induktion über

Datentypen. Was wir heute machen, ist in Wirklichkeit nicht neu, aber man kann eben nicht behaupten,

dass es vom letzten Semester noch so fest sitzt, dass es sich nicht lohnen würde,

vielleicht noch mal eine Sitzung darauf zu verwenden. Also, Induktion über Datentypen,

das ist im Prinzip die gute alte strukturelle Induktion über Grammatiken, wie wir sie letztes

Semester kennengelernt haben. Wir machen das jetzt in unserer etwas neuen Notation,

also angepasst auf unsere Syntax für Datentypen. Das, was dann tatsächlich vielleicht ein bisschen

neu ist, ist das, was ich letztes Mal schon angekündigt habe, dass wir eben eine Version

des Ganzen für mehrsortige Datentypen uns nochmal sorgfältiger angucken. Wer ganz genau im

Gleun-Skript nachliest, beziehungsweise in der Handreichung auch zur Induktion dazu,

aber insbesondere auch das Kapitel über strukturelle Induktion im Skript, der sieht

da den Inhalt der heutigen Veranstaltung auch schon drin. Das haben wir nur in Gleunen nicht

so besonders betont. Also, im Prinzip besteht fast alles, was ich heute mache, aus Beispielen. Also,

ich führe diese Prinzipien jetzt nicht nochmal ein. Wie gesagt, durchargumentiert, warum das

korrekte Prinzipien sind, haben wir an sich schon. Wir sehen uns also nur Beispiele an.

Und führen zu diesen Berufe erstmal wieder einen neuen Beispiel-Datentyp ein, den wir bisher nicht

eingeführt hatten, also vor der letzten Sitzung, deswegen nicht, weil er parametrisiert ist. Wir

hatten im einsortigen Fall uns die natürlichen Zahlen angeguckt. Im mehrsortigen Fall gleich

dieses kompliziertere Beispiel eines Datentypen mit zwei gegenseitig rekursiv definierten Anteilen,

deutlich harmloser, aber trotzdem zweisortig ist der Datentyp der Listen. Ich schreibe die

Sortenmenge jetzt nicht nochmal hin, aber man sieht eben, dieser Datentyp ist eben insgesamt

zweisortig. Also, es gibt einmal den Typ der Listen und es gibt dann diese Sorte der Datenelemente

in der Liste, die wir als Parameter markieren und die deswegen nicht induktiv generiert wird,

sondern einfach als gegeben angesehen ist. So, dieser Datentyp hat hoffentlich bekannte

Konstruktoren, einmal eine konstante NIL, die wir uns als die leere Liste vorstellen und dann

ein Konstruktor cons, der ist binär, er nimmt sich ein Datenelement und eine Liste und produziert

daraus wieder eine Liste. So, ich füre den nur deswegen ein, um jetzt gleich eine rekursive

Definition einer Funktion darüber hinschreiben zu können, für die ich dann einen einfachen,

induktiven Beweis führen will. Ja, und die rekursive Funktion, die ich hinschreiben will,

ist einfach die Konkatenation von Listen. So, ich will jetzt mal Curry-Schreibweise verwenden,

um gleich so ein bisschen Klammern zu sparen. Ja, also ich schreibe das jetzt so, wie ich es in

Haskell auch schreiben würde, das heißt, der Typ des Ganzen ist so ein gecurrieder Typ hier mit

zwei Funktionspfeilen statt ein endcurrieder Typ, wo also hier, also cons schreibe ich gemäß

unserer Konvention der Datentyp-Syntax hier in, erstmal uncurried, also mit zwei expliziten

Argumenten. Sie werden gleich feststellen, dass ich, also wenn ich das tatsächlich schreibe,

ich in Wirklichkeit das curried verwende, das verursacht hoffentlich keine allzu großen

Irritationen. So, na, ja, wir haben das im Prinzip schonmal angedeutet, wir machen jetzt also

primitive Rekursion und zwar primitive Rekursion über das erste Argument. Konkert hat ja zwei

Argumente, wir können uns im Prinzip aussuchen, worüber wir Rekursion machen. Wir stellen fest,

dass also Rekursion über das zweite Argument hier nicht so richtig zielführend ist, weil dann das

Element, das wir von der einen Liste abspalten, in der Mitte des Ganzen steht. Wir machen also

primitive Rekursion über das erste Argument, das heißt unser erster Fall ist hier, dass wir nil

von links mit irgendeiner Liste konkatenieren. Gut, was rauskommt, ist offensichtlich einfach

wieder die Liste selbst. So, und der andere Fall ist, dass wir hier einen Konstruktor-Pattern

bekommen mit diesem Const-Konstruktor. Sagen wir Const X K vielleicht, damit hier das zweite

Argument wieder L heißen kann. Also, Const X K und das Ganze komponiert oder konkateniert mit L

müssen wir definieren. Gut, müsste bekannt sein. Wir konkatenieren zunächst mal hier die Restliste

K mit L und an das, was wir dann kriegen, hängen wir nochmal das Element X vorne dran.

Muss auch mal sein. Ja, und jetzt wollen wir eben über Konkatenation einen einfachen Beweis

Teil einer Videoserie :

Zugänglich über

Offener Zugang

Dauer

01:22:48 Min

Aufnahmedatum

2017-06-29

Hochgeladen am

2017-07-02 08:40:04

Sprache

de-DE

Einbetten
Wordpress FAU Plugin
iFrame
Teilen