• Keine Ergebnisse gefunden

Rechner¨ubung zu Theorembeweiser und ihre Anwendungen

N/A
N/A
Protected

Academic year: 2022

Aktie "Rechner¨ubung zu Theorembeweiser und ihre Anwendungen"

Copied!
19
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Rechner¨ ubung zu Theorembeweiser und ihre Anwendungen

Prof. Dr.-Ing. Gregor Snelting Dipl.-Inf. Univ. Daniel Wasserrab

Lehrstuhl Programmierparadigmen IPD Snelting

Universit¨at Karlsruhe (TH)

(2)

Teil IV

Rekursive Datentypen und primitive Rekursion

(3)

Deklaration von Funktionen

Festlegen von Namen und Signatur einer Funktion:Deklaration dazu in Isabelle das Schl¨usselwortconsts:

consts length :: "’a list nat"

Vorsicht! Gibt der Funktion noch keinerlei Semantik!

Wird in den ¨Ubungen verwendet, um Funktionen einzuf¨uhren, die sie selbst noch definieren (also mit Semantik versehen) sollen

(4)

Rekursive Datentypen

Viele Datentypen mit Selbstbezug, z.B.

nat¨urliche Zahl (ungleich 0) ist Nachfolger einer nat¨urlichen Zahl nichtleere Liste ist Liste mit zus¨atzlichem Kopfelement

nichtleere Menge ist Menge mit einem zus¨atzlichen Element Formalisierung in Isabelle/HOL am Bsp. nat¨urliche Zahlen:

datatype nat = 0 | Suc nat

Also Konstruktoren von nat: 0 und Suc (Pr¨afix)

(5)

Rekursive Datentypen

Viele Datentypen mit Selbstbezug, z.B.

nat¨urliche Zahl (ungleich 0) ist Nachfolger einer nat¨urlichen Zahl nichtleere Liste ist Liste mit zus¨atzlichem Kopfelement

nichtleere Menge ist Menge mit einem zus¨atzlichen Element Formalisierung in Isabelle/HOL am Bsp. nat¨urliche Zahlen:

datatype nat = 0 | Suc nat

Also Konstruktoren von nat: 0 und Suc (Pr¨afix)

(6)

Parametertypen

verschiedene Typen in Containerdatentypen: Parametertyp ’a

kann bei Verwendung entprechen initialisiert werden (muss aber nicht) Beispiel: Listen mit Typparameter

datatype ’a list = Nil ("[]")

| Cons ’a "’a list" (infixr "#" 65) Konstruktoren von list: [] und # (Infix) (x#[] = [x]) Funktionsdeklaration kann jetzt z.B. so aussehen:

consts foo :: "nat list bool"

consts bar :: "nat bool list nat"

consts zip :: "’a list ’a"

(7)

Parametertypen

verschiedene Typen in Containerdatentypen: Parametertyp ’a

kann bei Verwendung entprechen initialisiert werden (muss aber nicht) Beispiel: Listen mit Typparameter

datatype ’a list = Nil ("[]")

| Cons ’a "’a list" (infixr "#" 65) Konstruktoren von list: [] und # (Infix) (x#[] = [x]) Funktionsdeklaration kann jetzt z.B. so aussehen:

consts foo :: "nat list bool"

consts bar :: "nat bool list nat"

consts zip :: "’a list ’a"

(8)

Parametertypen

verschiedene Typen in Containerdatentypen: Parametertyp ’a

kann bei Verwendung entprechen initialisiert werden (muss aber nicht) Beispiel: Listen mit Typparameter

datatype ’a list = Nil ("[]")

| Cons ’a "’a list" (infixr "#" 65) Konstruktoren von list: [] und # (Infix) (x#[] = [x]) Funktionsdeklaration kann jetzt z.B. so aussehen:

consts foo :: "nat list bool"

consts bar :: "nat bool list nat"

consts zip :: "’a list ’a"

(9)

primrec

Definitionvon Funktionen ¨uber rekursive Datentypen:primrec kombiniert Deklaration und Definition (fr¨uhereconstsl¨oschen!)

ein Parameter der Funktion muss in seine Konstruktoren aufgeteilt werden Beispiel:

primrec length :: "’a list nat"

where "length [] = 0"

| "length (x#xs) = Suc(length xs)"

primrec tl :: "’a list ’a list"

where "tl [] = []"

|"tl (x#xs) = xs"

(10)

primrec

Es m¨ussen nicht alle Konstruktoren spezifiziert werden:

primrec hd :: "’a list ’a"

where "hd(x#xs) = x"

primrec last :: "’a list ’a"

where "last(x#xs) = (if xs=[] then x else last xs)"

(11)

@ und rev

weiterer Infixoperator: @h¨angt Listen zusammen Beispiel: [0,4]@[2] = [0,4,2]

revdreht Listen um, also rev [0,4,2] = [2,4,0]

Wie lautet die entsprechende Deklaration/Definition?

primrec rev :: "’a list ’a list" where "rev [] = []"

| "rev(x#xs) = rev(xs) @ [x]"

(12)

@ und rev

weiterer Infixoperator: @h¨angt Listen zusammen Beispiel: [0,4]@[2] = [0,4,2]

revdreht Listen um, also rev [0,4,2] = [2,4,0]

Wie lautet die entsprechende Deklaration/Definition?

primrec rev :: "’a list ’a list" where "rev [] = []"

| "rev(x#xs) = rev(xs) @ [x]"

(13)

@ und rev

weiterer Infixoperator: @h¨angt Listen zusammen Beispiel: [0,4]@[2] = [0,4,2]

revdreht Listen um, also rev [0,4,2] = [2,4,0]

Wie lautet die entsprechende Deklaration/Definition?

primrec rev :: "’a list ’a list"

where "rev [] = []"

| "rev(x#xs) = rev(xs) @ [x]"

(14)

Strukturelle Induktion

Beweise ¨uber rekursive Datentypen mittels struktureller Induktion d.h. Induktion ¨uber Konstruktoren des Datentyps

In Isabelle/HOL:

lemma hd_Cons_tl: "xs 6= [] = hd xs # tl xs = xs"

apply(induct xs) apply auto done

wendet strukturelle Induktion mit Datentypkonstruktoren von xsan automatische Taktik beendet Beweis

(15)

Probleme mit Induktion

Problem: zu spezielle Induktionshypothesen lemma "(rev xs = rev ys) = (xs = ys)"

Induktion auf xserm¨oglicht L¨osen des[]-Falles bei Induktionsschritt bleibt:

Va xs.

(rev xs = rev ys) = (xs = ys) = (rev (a # xs) = rev ys) = (a # xs = ys)

nicht l¨osbar!

ys kann nicht gleichxsund a # xs sein!

(16)

Probleme mit Induktion

Problem: zu spezielle Induktionshypothesen lemma "(rev xs = rev ys) = (xs = ys)"

Induktion auf xserm¨oglicht L¨osen des[]-Falles bei Induktionsschritt bleibt:

Va xs.

(rev xs = rev ys) = (xs = ys) = (rev (a # xs) = rev ys) = (a # xs = ys) nicht l¨osbar!

ys kann nicht gleichxsund a # xs sein!

(17)

Probleme mit Induktion

Idee: ysmuss im Induktionsschritt freie Variable sein!

L¨osung: ysnacharbitrarySchl¨usselwort in Induktionsanweisung damit Induktionsschritt f¨ur ysmeta-allquantifiziert:

apply(induct xs arbitrary:ys) Resultiert in Induktionsschritt:

Va xs ys.

(V

ys. (rev xs = rev ys) = (xs = ys)) = (rev (a # xs) = rev ys) = (a # xs = ys) Heuristiken f¨ur (bisher scheiternde) Induktionen:

alle freien Variablen (außer Induktionsvariable) mit arbitrary Induktion immer ¨uber das Argument, ¨uber das die Funktion rekursiv definiert ist

(18)

Probleme mit Induktion

Idee: ysmuss im Induktionsschritt freie Variable sein!

L¨osung: ysnacharbitrarySchl¨usselwort in Induktionsanweisung damit Induktionsschritt f¨ur ysmeta-allquantifiziert:

apply(induct xs arbitrary:ys) Resultiert in Induktionsschritt:

Va xs ys.

(V

ys. (rev xs = rev ys) = (xs = ys)) = (rev (a # xs) = rev ys) = (a # xs = ys) Heuristiken f¨ur (bisher scheiternde) Induktionen:

alle freien Variablen (außer Induktionsvariable) mit arbitrary Induktion immer ¨uber das Argument, ¨uber das die Funktion rekursiv definiert ist

(19)

Probleme mit Induktion

Idee: ysmuss im Induktionsschritt freie Variable sein!

L¨osung: ysnacharbitrarySchl¨usselwort in Induktionsanweisung damit Induktionsschritt f¨ur ysmeta-allquantifiziert:

apply(induct xs arbitrary:ys) Resultiert in Induktionsschritt:

Va xs ys.

(V

ys. (rev xs = rev ys) = (xs = ys)) = (rev (a # xs) = rev ys) = (a # xs = ys) Heuristiken f¨ur (bisher scheiternde) Induktionen:

alle freien Variablen (außer Induktionsvariable) mit arbitrary Induktion immer ¨uber das Argument, ¨uber das die Funktion rekursiv definiert ist

Referenzen

ÄHNLICHE DOKUMENTE

Die Differenz aus 45 und 22 ist der Subtrahend in einer Differenz, wo der Minuend die Summe aller nat¨ urlichen Zahlen von 1 bis 20 ist.. Berechne die

Wichtig: Ein Modell von ZFC “kennt” nur diejenigen Mengen (und Funktionen, usw.), die als Objekte erster Stufe (“Elemente”) in diesem Modell repr¨ asentiert sind; “von

Ein metrischer Raum (M , d ) heißt vollst¨ andig, wenn jede Cauchyfolge in M konvergiert.. Ist ein normierter Raum vollst¨ andig, so heißt

Wenn die Aussage des Lemmas falsch ist, dann k¨ onnen wir annehmen: Es gebe eine nat¨urliche Zahl n ungleich 1, die nicht Nachfolger einer nat¨urlichen Zahl ist.. Da die Existenz

Aufgabe 1.4 Zeigen Sie, dass es keine σ -Algebra gibt, die aus einer unendlichen, aber abzähl- baren Anzahl von Elementen besteht. Abgabetermin:

eliminiert die passende Pr¨ amisse und ersetzt Beweis der Konklusion der Regel durch Beweise der weiteren Pr¨ amissen der Regel. andere vorhandene Pr¨ amissen bleiben

meist nicht gewollt, da schlecht Aussagen dar¨ uber m¨ oglich Besser: entsprechende Variable gleich festlegen.. Methodik: rule_tac v1 =

Analog: Ganze Pr¨ amissen instantiieren ebenso eckige Klammer,. Schl¨ usselwort OF ,