• 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 VIII

Wechselseitige Rekursion

(3)

wechselseitige Rekursion

Probleme bei bisheriger Rekursion: was tun bei mehreren Datentypen, die sich gegenseitig Datentypen, die eine Liste ihres eigenen Typs bei der Definition verwenden?

Beispiel: B¨aume mit beliebigem Verzweigungsgrad jeder Knoten verwaltet eine Liste von Nachfolgerb¨aumen Datentyp einfach wie bisher definiert:

datatype ’a tree = Leaf ’a

| Node ’a "’a tree list"

Datentyp wechselseitig rekursiv definiert f¨ur sich und Liste seiner Typen

(4)

wechselseitige Rekursion

Probleme bei bisheriger Rekursion: was tun bei mehreren Datentypen, die sich gegenseitig Datentypen, die eine Liste ihres eigenen Typs bei der Definition verwenden?

Beispiel: B¨aume mit beliebigem Verzweigungsgrad jeder Knoten verwaltet eine Liste von Nachfolgerb¨aumen Datentyp einfach wie bisher definiert:

datatype ’a tree = Leaf ’a

| Node ’a "’a tree list"

Datentyp wechselseitig rekursiv definiert f¨ur sich und Liste seiner Typen

(5)

wechselseitige Rekursion

Wollen H¨ohenfunktion f¨ur solche B¨aume definieren Ansatz:

primrec height :: "’a tree nat"

and heights :: "’a tree list nat"

where "height (Leaf l) = 1"

| "height (Node n ts) = ?

heights ts + 1"

| "heights [] = 0"

| "heights (t#ts) = max (height t) (heights ts)" brauchen Definition der H¨ohe f¨ur Liste von B¨aumen!

dazu gleichzeitige Definition der Funktionheight f¨ur’a tree und heights f¨ur’a tree list

sowohl primrecals auchfunverwendbar

(6)

wechselseitige Rekursion

Wollen H¨ohenfunktion f¨ur solche B¨aume definieren Ansatz:

primrec height :: "’a tree nat"

and heights :: "’a tree list nat"

where "height (Leaf l) = 1"

| "height (Node n ts) = heights ts + 1"

| "heights [] = 0"

| "heights (t#ts) = max (height t) (heights ts)"

brauchen Definition der H¨ohe f¨ur Liste von B¨aumen!

dazu gleichzeitige Definition der Funktionheight f¨ur’a tree und heights f¨ur’a tree list

sowohl primrecals auchfunverwendbar

(7)

wechselseitige Rekursion

Wollen H¨ohenfunktion f¨ur solche B¨aume definieren Ansatz:

primrec height :: "’a tree nat"

and heights :: "’a tree list nat"

where "height (Leaf l) = 1"

| "height (Node n ts) = heights ts + 1"

| "heights [] = 0"

| "heights (t#ts) = max (height t) (heights ts)"

brauchen Definition der H¨ohe f¨ur Liste von B¨aumen!

dazu gleichzeitige Definition der Funktionheight f¨ur’a tree und heights f¨ur’a tree list

sowohl primrecals auchfunverwendbar

(8)

Beweisen mit wechselseitig rekursiv definierten Datentypen

Wir wollen nun zeigen, dass die H¨ohe jedes Baums gr¨oßer als 1 ist 1. Versuch:

lemma

shows

"height t > 0"

and "heights ts 0"

apply(induct t)

(9)

Beweisen mit wechselseitig rekursiv definierten Datentypen

Wir wollen nun zeigen, dass die H¨ohe jedes Baums gr¨oßer als 1 ist 1. Versuch:

lemma

shows

"height t > 0"

and "heights ts 0"

apply(induct t)

komisches subgoal:?P2.0 []

(10)

Beweisen mit wechselseitig rekursiv definierten Datentypen

Wir wollen nun zeigen, dass die H¨ohe jedes Baums gr¨oßer als 1 ist 1. Versuch:

lemma

shows

"height t > 0"

and "heights ts 0"

apply(induct t)

komisches subgoal:?P2.0 []

wir haben keine Aussage ¨uber die H¨ohe von Baumlisten!

(11)

Beweisen mit wechselseitig rekursiv definierten Datentypen

Wir wollen nun zeigen, dass die H¨ohe jedes Baums gr¨oßer als 1 ist 2. Versuch:

lemma

shows

"height t > 0" and "heights ts 0"

apply(induct t)

(12)

Beweisen mit wechselseitig rekursiv definierten Datentypen

Wir wollen nun zeigen, dass die H¨ohe jedes Baums gr¨oßer als 1 ist 2. Versuch:

lemma

shows

"height t > 0" and "heights ts 0"

apply(induct t and ts)

m¨ussen beide Parameter getrennt durchandangeben

(13)

Beweisen mit wechselseitig rekursiv definierten Datentypen

Wir wollen nun zeigen, dass die H¨ohe jedes Baums gr¨oßer als 1 ist 2. Versuch:

lemma

shows

"height t > 0" and "heights ts 0"

apply(induct t and ts)

Problem: wegen generischem Elementyp ’awerdentund ts

unterschiedliche Typen zugeordnet!t::"’a tree", ts::"’b tree list"

(14)

Beweisen mit wechselseitig rekursiv definierten Datentypen

Wir wollen nun zeigen, dass die H¨ohe jedes Baums gr¨oßer als 1 ist 3. Versuch:

lemma fixes t::"’a tree" and ts::"’a tree list"

shows "height t > 0" and "heights ts 0"

apply(induct t and ts) apply auto done

(15)

Beweisen mit wechselseitig rekursiv definierten Datentypen

Wir wollen nun zeigen, dass die H¨ohe jedes Baums gr¨oßer als 1 ist 4. Versuch: Variante mit fun

lemma fixes t::"’a tree" and ts::"’a tree list"

shows "height t > 0" and "heights ts 0"

apply(induct rule:height_heights.induct) apply auto done fundefiniert Induktionsregel f¨ur wechselseitige Rekursion:

height_heights.induct

(16)

wechselseitige Rekursion und arbitrary

Lemma f¨ur wechselseitige Rekursion so viele “Teillemmas”

wie Datentypen rekursiv definiert

Damit kann dann wechselseitige Induktion angewandt werden

was passiert jedoch, wenn ein “Teillemma” nur gezeigt werden kann, wenn Induktionshypothese bestimmte Variablen allquantifizieren muss?

Kennen allgemein schon die L¨osung: arbitrary lemma "P t" "Q a t ts"

apply(induct t and ts)

(17)

wechselseitige Rekursion und arbitrary

Lemma f¨ur wechselseitige Rekursion so viele “Teillemmas”

wie Datentypen rekursiv definiert

Damit kann dann wechselseitige Induktion angewandt werden

was passiert jedoch, wenn ein “Teillemma” nur gezeigt werden kann, wenn Induktionshypothese bestimmte Variablen allquantifizieren muss?

Kennen allgemein schon die L¨osung: arbitrary lemma "P t" "Q a t ts"

apply(induct t and ts)

Q brauchtain Induktionshypothese quantifiziert, also in einem arbitrary

(18)

wechselseitige Rekursion und arbitrary

Lemma f¨ur wechselseitige Rekursion so viele “Teillemmas”

wie Datentypen rekursiv definiert

Damit kann dann wechselseitige Induktion angewandt werden

was passiert jedoch, wenn ein “Teillemma” nur gezeigt werden kann, wenn Induktionshypothese bestimmte Variablen allquantifizieren muss?

Kennen allgemein schon die L¨osung: arbitrary lemma "P t" "Q a t ts"

apply(induct t and ts arbitrary: and a)

auch hinter arbitrarydie zu quantifizierenden Variablen f¨ur jedes Lemma mit andtrennen

(19)

Induktiv wechselseitig

Wechselseitigkeit auch bei induktiven Definitionen funktioniert analog zu wechselseitiger Rekursion Beispiel:

inductive even :: "nat bool"

and odd :: "nat bool"

where "even 0"

| "odd n = even (Suc n)"

| "even n = odd (Suc n)"

Referenzen

ÄHNLICHE DOKUMENTE

Vertraulichkeit: vertrauliche Information (z.B. systeminterne Daten) darf nicht nach außen (z.B. Internet) gelangen Integrit¨ at: kritische Berechnungen d¨ urfen nicht von

Anweisungen: alle strukturierten Kontrollanweisungen (if, Schleifen, break, continue, return) keine unstrukturierten (goto, switch, longjmp) Variablen: globale und lokale auto

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 =

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¨

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

Lemma besteht aus Pr¨ amissen und Konklusion, dann Liste der Pr¨ amissen nach Schl¨ usselwort assumes, evtl.. Lemma mit Pr¨ amissen

Aussage nach where kann beliebigen Namen erhalten auch aus Allquantor obtain m¨ oglich. IPD Snelting, Uni Karlsruhe (TH) Rechner¨ ubung TBA Sommersemester 2009 75