Induktion


[Seminar "Einführung in Haskell"] - [Inhalt] - [zurück] - [weiter]

Übersicht


Strukturelle Induktion

Unter Induktion wird ein logisches Verfahren verstanden, bei dem vom Besonderen auf das Allgemeine geschlossen wird, z.B. von einer einzelnen Beobachtung auf eine Theorie. In diesem Unterkapitel geht es darum, die Möglichkeiten von rekursiv definierten Funktionen über einen rekursiven Datentypen zu beurteilen. Dazu bietet sich die Methode der strukturellen Induktion an. Die Induktion ist auch in vielen anderen Bereichen wie z.B. bei Listen anwendbar. Dies wird aus den folgenden Vorträgen des Seminars hervorgehen.
Im Falle der natürlichen Zahlen kann das Prinzip der strukturellen Induktion wie folgt erklärt werden:
Um zu zeigen, dass eine Eigenschaft P(n) für jede endliche Zahl n aus Nat gilt, ist es ausreichend zu zeigen, dass:
Die Induktion ist aus dem gleichen Grund gültig, aus dem rekursive Definitionen gültig sind: Jede endliche Zahl ist entweder Zero oder entspricht der Form Succ n, wenn n eine endliche Zahl ist. Durch die Prüfung des ersten Falls wird nachgewiesen, dass P(Zero) gültig ist. Die Prüfung des zweiten Falls ergibt, dass die Funktion Succ Zero wahr ist, wenn sie bereits für Zero wahr ist. Mit dem selben Argument ist sie gültig für Succ(Succ Zero) usw.

Dieses Prinzip der Induktion muss ausgeweitet werden, um sicherzustellen, dass alle Ausdrücke gültig sind. Die Erweiterung wird aber auf den nächsten Abschnitt (s. vollständige Induktion) verschoben.

Als Beispiel wird geprüft, ob Zero + n = n für alle endlichen Zahlen gültig ist. Das bedeutet, dass Zero links-assoziativ bzgl. (+) ist.
Zur Erinnerung ist (+) definiert durch die zwei Gleichungen (die Nummerierung dient der Orientierung):

 
     (1.) m + Zero   = m
     (2.) m + Succ n = Succ(m + n)

Beweis: Dieser wird geführt durch Induktion auf n. Präziser wird jetzt für P(n) die Induktionshypothese Zero + n = n benutzt. Zur Einführung sind die betreffenden Stellen im Code unterstrichen, was aber in den nächsten Beispielen ausdrücklich unterlassen wird.

Fall 1 (Zero): Es muss gezeigt werden, dass Zero + Zero = Zero gilt. Dies ergibt sich aber schnell aus der 1. Gleichung für (+).
Fall 2 (Succ n): Hier muss gezeigt werden, dass Zero + Succ n = Succ n ergibt. Dies wird erreicht durch die Vereinfachung des linken Ausdrucks:

 
       Zero + Succ n
       
     = {2. Gleichung für (+)}
       
       Succ(Zero + n)
       
     = {Induktionshypothese}
       
       Succ n

Dieses Beispiel zeigt das Vorgehen, das für den induktiven Beweis genutzt wird. Dabei wird jeder Fall einzeln behandelt.



Als zweites und etwas komplizierteres Beispiel wird ein bekanntes mathematisches Gesetz angeführt, das für alle endlichen natürlichen Zahlen x, m und n gilt:

 
       x^(m + n) = (x^m)*(x^n)

Für den Beweis werden, neben der oben schon wiederholten Definition für (+), auch die Definitionen für (*) und (^) aus dem vorherigen Kapitel benötigt. Sie lauteten:

 
      (1.) m * Zero   =   Zero
      (2.) m * Succ n =   (m * n) + m
      
      (1.) m ^ Zero   =   Succ Zero
      (2.) m ^ Succ n =   (m^n) * m

Beweis: Die Prüfung wird durch Induktion auf n durchgeführt. Als Induktionshypothese dient die obige Gleichung:

 
       x^(m + n) = (x^m)*(x^n)

Es ist wichtig, die Variable zu nennen, auf die die Induktion durchgeführt wird. In diesem Fall gibt es die drei Möglichkeiten x, m und n.

Fall 1 (Zero): Die Idee ist, in der Hypothese n durch Zero zu substituieren und dann beide Seiten unabhängig zu vereinfachen.

Wird diese schrittweise Substitution durchgeführt, ergibt sich für die linke Seite der Gleichung:

 
       x^(m + Zero)
       
     = {1. Gleichung für (+)}
       
       x^m

Für die rechte Seite ergibt sich:

 
       (x^m) * (x^Zero)
       
     = {1. Gleichung für (^) bzgl. (x^Zero)}
       
       (x^m) * Succ Zero
       
     = {2. Gleichung für (*)}  
     
       (x^m) * Zero + (x^m)
       
     = {1. Gleichung für (*) bzgl. (x^m) * Zero}
     
       Zero + (x^m)
       
     = {Im ersten Beispiel nachgewiesene Induktionshypothese}          
       
       x^m

Beide Seiten ergeben das selbe vereinfachte Ergebnis, also sind sie gleich. Die Vereinfachung des rechten Ausdrucks ist die kompliziertere der beiden, da sie den Beweis enthält, dass Succ Zero rechts-assoziativ bzgl. der Multiplikation ist.

Fall 2 (Succ n): Die Idee dabei ist ebenfalls, in der Hypothese n durch Succ n zu substituieren und dann beide Seiten unabhängig zu vereinfachen.

Durch die Substitution ergibt sich für die linke Seite der Gleichung:

 
       x^(m + Succ n)
       
     = {2. Gleichung für (+)}
       
       x^Succ(m + n)
       
     = {2. Gleichung für (^)}
     
       (x^(m + n)) * x
       
     = {Induktionshypothese}
     
       ((x^m) * (x^n)) * x

Für die rechte Seite ergibt sich nun:

 
       (x^m) * (x^Succ n)
       
     = {2. Gleichung für (^) bzgl. (x^Succ n)}
       
       (x^m) * ((x^n) * x)

Die beiden Vereinfachungsergebnisse unterscheiden sich voneinander. Sie sind aber gleich unter der Annahme, dass (*) assoziativ ist. Der Beweis dieser Tatsache wird aus Gründen der Übersichtlichkeit unterlassen.

Die Prüfung erfolgt immer durch eine fast automatische Schrittfolge:
Der einzig entscheidende Prozess bei der Induktion ist die Wahl der richtigen Variablen. In diesem Beispiel existieren drei Variablen, aber nur zwei davon führen zum gewünschten Ziel (m und n). Die Induktion auf n wurde im obigen Beispiel schon behandelt. Im nachfolgenden Beispiel wird nun der (etwas kompliziertere) Beweis dargestellt, wenn die Entscheidung auf m fällt:

Beweis: Diesmal durch Induktion auf m.

Fall 1 (Zero): Es ergibt sich für die linke Seite der Gleichung:

 
       x^(Zero + n)
       
     = {Forderung 1: Zero + n = n für alle n}
       
       x^n

Für die rechte Seite ergibt sich:

 
       (x^Zero) * (x^n)
       
     = {1. Gleichung für (^)}
     
       Succ Zero * (x^n)

     = {Forderung 2: Succ Zero * n = n für alle n} 
           
       x^n

Die beiden Forderungen sind, dass Zero links-assoziativ bzgl. (+) ist und das Succ Zero links-assoziativ bzgl. (*) ist. Ein Beweis dieser beiden Forderungen wird aber an dieser Stelle unterlassen.

Fall 2 (Succ m): Es ergibt sich für die linke Seite der Gleichung:

 
       x^(Succ m + n)
       
     = {Forderung 1: Succ m + n = Succ(m + n)}
     
       x^Succ(m + n)
       
     = {2. Gleichung für (^)}  
       
       (x^(m + n)) * x
       
     = {Induktionshypothese}
     
       ((x^m) * (x^n)) * x

Für die rechte Seite ergibt sich:

 
       (x^Succ m) * (x^n)
       
     = {2. Gleichung für (^)}
     
       ((x^m) * x) * (x^n)

Nun ist erkennbar, dass eine zweite Annahme benötigt wird, um festzustellen, das beide Seiten gleich sind. Es muss bewiesen werden, dass (*) kommutativ sowie assoziativ, also x * y = y * x ist.
Die Induktion auf m ist komplizierter als die erste auf n, da sie vier Annahmen enthält. Diese Annahmen müssen, jede für sich, wiederum durch Induktion bewiesen werden.

Ziel dieses Abschnitts war es zu verdeutlichen, dass die Wahl der Variablen entscheidend für den weiteren Verlauf der Substitution ist. In diesem Fall ist es vernünftig, mit der Induktion auf n zu beginnen, da (+) durch Rekursion auf seinem zweiten Argument definiert ist. Dadurch ist der erste Schritt des Beweises auf der linken Seite einfach und ebenso wird der Rest des Beweises einfacher.


[nach oben]

Vollständige Induktion


Nachdem im letzten Abschnitt auf die Induktion in vereinfachter Form eingegangen wurde, soll in diesem Abschnitt die vollständige Induktion behandelt werden. Das bedeutet, dass es nicht nur die Prinzipien der Induktion von endlichen Zahlen aus Nat gibt, sondern es soll ebenso dargestellt werden, dass dies auch für jede partielle Zahl möglich ist.
Um die Induktion zu vervollständigen, müssen allerdings drei Beweise angetreten werden:
Die im letzten Abschnitt vorgestellte Induktion wird also um den Fall der undefinierten Zahlen ergänzt. Es könnte der zweite Fall ausgelassen werden, aber dann kann nur festgestellt werden, dass P(n) für jede partielle Zahl gilt. Der Grund für die Gültigkeit des Prinzips ist, dass jede partielle Zahl entweder oder der Form Succ n für einige Zahlen n entspricht.

Diese "Zero-Problematik" wird im Folgenden am Beispiel von m + n = n für alle Zahlen m und alle partiellen Zahlen n gezeigt.
Beweis: Dieser wird durch Induktion einer partiellen Zahl auf n durchgeführt.

Fall 1 (): Die Gleichung m + = folgt in einem Schritt durch "case exhaustion" in der Definition von (+). Das bedeutet, dass weder auf die Muster von Zero noch auf die von Succ n zutrifft.

Fall 3 (Succ n): Für die linke Seite ergibt sich:

 
       m + Succ n
       
     = {2. Gleichung für (+)}
       
       Succ(m + n)
       
     = {Induktionshypothese}
       
       Succ n

Ist die rechte Seite ebenfalls Succ n, so ist es bewiesen.

Der ausgelassene zweite Fall m + Zero = Zero ist falsch, was bedeutet, dass die Gleichung m + n = n für endliche Zahlen nicht gilt.
Durch dieses Vorgehen ist es einfach, Induktion auf partielle Zahlen anzuwenden. Ebenso ist es möglich zu zeigen, dass eine Gleichung für unendliche Zahlen gilt, wenn sie für partielle Zahlen gilt. Dies soll hier aber nicht weiter vertieft werden. Im Folgenden wird einfach angenommen, dass m + infinity = infinity für alle Zahlen m gilt.


[nach oben]

Programmsynthese

In den vorangegangenen Beweisen wurden Funktionen definiert und durch Induktion bestimmte Eigenschaften nachgewiesen. Anders herum ist es aber auch möglich, die Induktion zu nutzen, um Definitionen von Funktionen zu synthetisieren. Mit anderen Worten, die Programme so zu erstellen, dass sie den gewünschten Eigenschaften entsprechen.

Die Programmsynthese soll durch ein einfaches Beispiel dargestellt werden. Angenommen die Subtraktion von natürlichen Zahlen wird durch folgende Gleichung spezifiziert:

 
       (m + n) - n = m  für alle n und m

Diese Spezifikation stellt keine sehr konstruktive Definition von (-) dar, sondern enthält lediglich eine zu erfüllende Eigenschaft. Trotzdem kann die gegebene Gleichung benutzt werden, um aus ihr mittels Induktion eine passende Definition für (-) zu synthetisieren.
Im Gegensatz zu vorhergehenden Beweisen, wird jetzt die Gleichung als Ganzes hergenommen. Grund: Eine unabhängige Vereinfachung auf beiden Seiten ist wegen noch fehlender Regeln nicht möglich.

Fall 1 (Zero): Vereinfachung, indem n durch Zero substituiert wird:

 
       (m + Zero) - Zero = m
       
     ≡  {1. Gleichung für (+)}
     
        m - Zero = m 

Hieraus wird m - Zero = m genutzt, um diesen Fall zu erfüllen. Das Symbol '≡' dient dazu, Berechnungsschritte abzugrenzen, da hier nicht mehr mit Werten von Datentypen, sondern mit mathematischen Behauptungen umgegangen wird.

Fall 2 (Succ n): Es wird vereinfacht, indem n durch Succ n substituiert wird:

 
       (m + Succ n) - Succ n = m
       
     ≡  {2. Gleichung für (+)}
     
       Succ(m + n) - Succ n = m 
        
     ≡  {Hypothese (m + n) - n = m}
     
       Succ(m + n) - Succ n = (m + n) - n

Wird m + n in der letzten Gleichung durch m ersetzt, so kann Succ m - Succ n = m - n benutzt werden, um die Vorgaben zu erfüllen. Durch diese Vereinfachungen wurde nun Folgendes abgeleitet:

 
       m - Zero        = m
       Succ m - Succ n = m - n

... und genau das ist die Definition für (-), die bereits im Abschnitt Rekursive Datenstrukturen behandelt wurde.


[Seminar "Einführung in Haskell"] - [Inhalt] - [zurück] - [weiter] - [nach oben]