• Keine Ergebnisse gefunden

Theorembeweiserpraktikum Anwendungen in der Sprachtechnologie

N/A
N/A
Protected

Academic year: 2022

Aktie "Theorembeweiserpraktikum Anwendungen in der Sprachtechnologie"

Copied!
24
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

0 SS 2016 Joachim Breitner, Denis Lohner - Theorembeweiserpraktikum LEHRSTUHL PROGRAMMIERPARADIGMEN

KIT

LEHRSTUHL PROGRAMMIERPARADIGMEN

Theorembeweiserpraktikum

Anwendungen in der Sprachtechnologie

(2)

98 SS 2016 Joachim Breitner, Denis Lohner - Theorembeweiserpraktikum LEHRSTUHL PROGRAMMIERPARADIGMEN

KIT

Teil XV

Theoreme finden

(3)

find_theorems & Co

KIT

Befehle, um Theoreme zu finden:

find_theorems

zeigt alle Theoreme an (wenig hilfreich).

find_theorems length

findet alle Theoreme zur Konstantenlength. find_theorems name:classic

findet alle Theoreme mitclassicim Namen. find_theorems "?a(?b?c)"

findet alle Theoreme, die den entsprechendend Term enthalten. find_theorems length name:induct

kombiniert die Suchkritieren. find_theorems (100) name:induct zeigt bis zu 100 Theoreme an. print_theorems

zeigt alle durch den vorherigen Befehl (z.B.fun) erzeugten Theoreme.

(4)

find_theorems & Co

99 SS 2016 Joachim Breitner, Denis Lohner - Theorembeweiserpraktikum LEHRSTUHL PROGRAMMIERPARADIGMEN

KIT

Befehle, um Theoreme zu finden:

find_theorems

zeigt alle Theoreme an (wenig hilfreich).

find_theorems length

findet alle Theoreme zur Konstantenlength.

find_theorems name:classic

findet alle Theoreme mitclassicim Namen. find_theorems "?a(?b?c)"

findet alle Theoreme, die den entsprechendend Term enthalten. find_theorems length name:induct

kombiniert die Suchkritieren. find_theorems (100) name:induct zeigt bis zu 100 Theoreme an. print_theorems

zeigt alle durch den vorherigen Befehl (z.B.fun) erzeugten Theoreme.

(5)

find_theorems & Co

KIT

Befehle, um Theoreme zu finden:

find_theorems

zeigt alle Theoreme an (wenig hilfreich).

find_theorems length

findet alle Theoreme zur Konstantenlength. find_theorems name:classic

findet alle Theoreme mitclassicim Namen.

find_theorems "?a(?b?c)"

findet alle Theoreme, die den entsprechendend Term enthalten. find_theorems length name:induct

kombiniert die Suchkritieren. find_theorems (100) name:induct zeigt bis zu 100 Theoreme an. print_theorems

zeigt alle durch den vorherigen Befehl (z.B.fun) erzeugten Theoreme.

(6)

find_theorems & Co

99 SS 2016 Joachim Breitner, Denis Lohner - Theorembeweiserpraktikum LEHRSTUHL PROGRAMMIERPARADIGMEN

KIT

Befehle, um Theoreme zu finden:

find_theorems

zeigt alle Theoreme an (wenig hilfreich).

find_theorems length

findet alle Theoreme zur Konstantenlength. find_theorems name:classic

findet alle Theoreme mitclassicim Namen.

find_theorems "?a(?b?c)"

findet alle Theoreme, die den entsprechendend Term enthalten.

find_theorems length name:induct kombiniert die Suchkritieren. find_theorems (100) name:induct zeigt bis zu 100 Theoreme an. print_theorems

zeigt alle durch den vorherigen Befehl (z.B.fun) erzeugten Theoreme.

(7)

find_theorems & Co

KIT

Befehle, um Theoreme zu finden:

find_theorems

zeigt alle Theoreme an (wenig hilfreich).

find_theorems length

findet alle Theoreme zur Konstantenlength. find_theorems name:classic

findet alle Theoreme mitclassicim Namen.

find_theorems "?a(?b?c)"

findet alle Theoreme, die den entsprechendend Term enthalten.

find_theorems length name:induct kombiniert die Suchkritieren.

find_theorems (100) name:induct zeigt bis zu 100 Theoreme an.

print_theorems

zeigt alle durch den vorherigen Befehl (z.B.fun) erzeugten Theoreme.

(8)

Query-Panel

100 SS 2016 Joachim Breitner, Denis Lohner - Theorembeweiserpraktikum LEHRSTUHL PROGRAMMIERPARADIGMEN

KIT

Oder:

(9)

KIT

Teil XVI

Induktive Prädikate und Mengen

(10)

Syntax und Beispiel

102 SS 2016 Joachim Breitner, Denis Lohner - Theorembeweiserpraktikum LEHRSTUHL PROGRAMMIERPARADIGMEN

KIT

Schlüsselwort:inductive, Syntax wiefun

Beispiel 1: Die geraden Zahlen als induktives Prädikat inductive even :: "natbool"

where "even 0"

| "even n =⇒ even (n + 2)"

Beispiel 2:

Welche Eigenschaft über Strings beschreibt folgendes Prädikat? inductive foo :: "stringbool"

where "foo [c]"

| "foo [c,c]"

| "foo s =⇒ foo (c#s@[c])"

Der Parameterstring ist ein Palindrom!

(11)

Syntax und Beispiel

KIT

Schlüsselwort:inductive, Syntax wiefun

Beispiel 1: Die geraden Zahlen als induktives Prädikat inductive even :: "natbool"

where "even 0"

| "even n =⇒ even (n + 2)"

Beispiel 2:

Welche Eigenschaft über Strings beschreibt folgendes Prädikat?

inductive foo :: "stringbool"

where "foo [c]"

| "foo [c,c]"

| "foo s =⇒ foo (c#s@[c])"

Der Parameterstring ist ein Palindrom!

(12)

Syntax und Beispiel

102 SS 2016 Joachim Breitner, Denis Lohner - Theorembeweiserpraktikum LEHRSTUHL PROGRAMMIERPARADIGMEN

KIT

Schlüsselwort:inductive, Syntax wiefun

Beispiel 1: Die geraden Zahlen als induktives Prädikat inductive even :: "natbool"

where "even 0"

| "even n =⇒ even (n + 2)"

Beispiel 2:

Welche Eigenschaft über Strings beschreibt folgendes Prädikat?

inductive foo :: "stringbool"

where "foo [c]"

| "foo [c,c]"

| "foo s =⇒ foo (c#s@[c])"

Der Parameterstring ist ein Palindrom!

(13)

Induktive Prädikate

KIT

Induktive Prädikate werden nicht rekursiv über Datentypen definiert, sondern über einRegelwerk, bestehend aus

einer oder mehreren Basisregeln und

einer oder mehreren induktiven Regeln, wobei das Prädikat in den Prämissen mit “kleineren” Parametern vorkommt (evtl. auch mehrfach).

Das Prädikat gilt für bestimmte Parameter, wenn es durch (endliche) Anwendung der Basis- und induktiven Regeln konstruiert werden kann

(14)

Introduktionsregeln

104 SS 2016 Joachim Breitner, Denis Lohner - Theorembeweiserpraktikum LEHRSTUHL PROGRAMMIERPARADIGMEN

KIT

Jeder Regel kann einzeln ein Name gegeben werden:

inductive palin :: "stringbool"

where OneElem: "palin [c]"

| TwoElem: "palin [c,c]"

| HdLastRec: "palin s =⇒ palin (c#s@[c])"

Diese Regeln zusammengefasst alspalin.intros (allgemeinPrädikatname.intros)

sieht wie folgt aus: palin [?c]

palin [?c, ?c]

palin ?s =⇒ palin (?c # ?s @ [?c])

Meist verwendet man jedoch die einzelnen Regelnamen.

(15)

Introduktionsregeln

KIT

Jeder Regel kann einzeln ein Name gegeben werden:

inductive palin :: "stringbool"

where OneElem: "palin [c]"

| TwoElem: "palin [c,c]"

| HdLastRec: "palin s =⇒ palin (c#s@[c])"

Diese Regeln zusammengefasst alspalin.intros (allgemeinPrädikatname.intros)

sieht wie folgt aus:

palin [?c]

palin [?c, ?c]

palin ?s =⇒ palin (?c # ?s @ [?c])

Meist verwendet man jedoch die einzelnen Regelnamen.

(16)

Regelinversion

105 SS 2016 Joachim Breitner, Denis Lohner - Theorembeweiserpraktikum LEHRSTUHL PROGRAMMIERPARADIGMEN

KIT

Da das Prädikat aus Regeln aufgebaut wird ist eine “Fallunterscheidung”

möglich, mit welcher Regel das Prädikat erzeugt wurde.

Diese Argumentation über den Regelaufbau heißtRegelinversion.

Die entsprechende Regel heißtPrädikatname.casesund wird mit der Taktik casesoder als Eliminationsregel (in automatischen Taktiken) verwendet:

Beispielpalin.cases:

[[palin ?a; Vc. ?a = [c] =⇒ ?P; Vc. ?a = [c, c] =⇒ ?P; Vs c. [[?a = c # s @ [c]; palin s]] =⇒ ?P]] =⇒ ?P

from ‘palin s‘ have "hd s = last s" proof(cases rule: palin.cases) liefert 3 Teilziele:

1. Vc. s = [c] =⇒ hd s = last s 2. Vc. s = [c, c] =⇒ hd s = last s

3. Vsa c. [[s = c # sa @ [c]; palin sa]] =⇒ hd s = last s

(17)

Regelinversion

KIT

Da das Prädikat aus Regeln aufgebaut wird ist eine “Fallunterscheidung”

möglich, mit welcher Regel das Prädikat erzeugt wurde.

Diese Argumentation über den Regelaufbau heißtRegelinversion.

Die entsprechende Regel heißtPrädikatname.casesund wird mit der Taktik casesoder als Eliminationsregel (in automatischen Taktiken) verwendet:

Beispielpalin.cases:

[[palin ?a; Vc. ?a = [c] =⇒ ?P; Vc. ?a = [c, c] =⇒ ?P;

Vs c. [[?a = c # s @ [c]; palin s]] =⇒ ?P]] =⇒ ?P

from ‘palin s‘ have "hd s = last s" proof(cases rule: palin.cases) liefert 3 Teilziele:

1. Vc. s = [c] =⇒ hd s = last s 2. Vc. s = [c, c] =⇒ hd s = last s

3. Vsa c. [[s = c # sa @ [c]; palin sa]] =⇒ hd s = last s

(18)

Regelinversion

105 SS 2016 Joachim Breitner, Denis Lohner - Theorembeweiserpraktikum LEHRSTUHL PROGRAMMIERPARADIGMEN

KIT

Da das Prädikat aus Regeln aufgebaut wird ist eine “Fallunterscheidung”

möglich, mit welcher Regel das Prädikat erzeugt wurde.

Diese Argumentation über den Regelaufbau heißtRegelinversion.

Die entsprechende Regel heißtPrädikatname.casesund wird mit der Taktik casesoder als Eliminationsregel (in automatischen Taktiken) verwendet:

Beispielpalin.cases:

[[palin ?a; Vc. ?a = [c] =⇒ ?P; Vc. ?a = [c, c] =⇒ ?P;

Vs c. [[?a = c # s @ [c]; palin s]] =⇒ ?P]] =⇒ ?P from ‘palin s‘ have "hd s = last s"

proof(cases rule: palin.cases) liefert 3 Teilziele:

1. Vc. s = [c] =⇒ hd s = last s 2. Vc. s = [c, c] =⇒ hd s = last s

3. Vsa c. [[s = c # sa @ [c]; palin sa]] =⇒ hd s = last s

(19)

Induktionsregel

KIT

Oftmals ist Fallunterscheidung nicht genug und wir brauchen eine Induktionshypothese für Prädikate in der Prämisse einer Regel.

Dafür gibt es die InduktionsregelPrädikatname.induct. Beispielpalin.induct:

[[palin ?x; Vc. ?P [c]; Vc. ?P [c, c];

Vs c. [[palin s; ?P s]] =⇒ ?P (c # s @ [c])]] =⇒ ?P ?x

from ‘palin s‘ have "hd s = last s" proof(induction rule: palin.induct) liefert Teilziele

1. Vc. hd [c] = last [c] 2. Vc. hd [c, c] = last [c, c] 3. Vs c. [[palin s; hd s = last s]]

=⇒ hd (c # s @ [c]) = last (c # s @ [c])

(20)

Induktionsregel

106 SS 2016 Joachim Breitner, Denis Lohner - Theorembeweiserpraktikum LEHRSTUHL PROGRAMMIERPARADIGMEN

KIT

Oftmals ist Fallunterscheidung nicht genug und wir brauchen eine Induktionshypothese für Prädikate in der Prämisse einer Regel.

Dafür gibt es die InduktionsregelPrädikatname.induct. Beispielpalin.induct:

[[palin ?x; Vc. ?P [c]; Vc. ?P [c, c];

Vs c. [[palin s; ?P s]] =⇒ ?P (c # s @ [c])]] =⇒ ?P ?x

from ‘palin s‘ have "hd s = last s"

proof(induction rule: palin.induct) liefert Teilziele

1. Vc. hd [c] = last [c]

2. Vc. hd [c, c] = last [c, c]

3. Vs c. [[palin s; hd s = last s]]

=⇒ hd (c # s @ [c]) = last (c # s @ [c])

(21)

Induktiv wechselseitig

KIT

Wechselseitigkeit ist auch bei induktiven Definitionen möglich und funktioniert analog zu wechselseitiger Rekursion.

Beispiel:

inductive even :: "natbool"

and odd :: "natbool"

where "even 0"

| "odd n =⇒ even (Suc n)"

| "even n =⇒ odd (Suc n)"

generiert Regelneval.cases,odd.cases,even_odd.inductand even_odd.inducts

Wie beifun: Erstere Induktionsregel benötigt∧-Verknüpfung voneven undoddin Konklusion, zweitere liefertzweiRegeln für zwei

and-verbundene Lemmas.

(22)

Ausblick

108 SS 2016 Joachim Breitner, Denis Lohner - Theorembeweiserpraktikum LEHRSTUHL PROGRAMMIERPARADIGMEN

KIT

Statt induktiver Präkate sind auchinduktive Mengenmöglich.

Das Schlüsselwort istinductive_setund die Signatur verwendet entsprechend’a setstatt’abool.

Manchmal braucht man fixe Parameter, die beim Induktionsschritt der Induktionsregel konstant bleiben.

Diese müssen nachformit Namen und Signatur angegeben werden. Beispiel: Reflexive, transitive Hülle

inductive rtc :: (’a’abool)’a’abool

for r :: "’a’abool"

where refl: "rtc r a a"

| trans: "[[ rtc r a b; r b c ]] =⇒ rtc r a c"

(23)

Ausblick

KIT

Statt induktiver Präkate sind auchinduktive Mengenmöglich.

Das Schlüsselwort istinductive_setund die Signatur verwendet entsprechend’a setstatt’abool.

Manchmal braucht man fixe Parameter, die beim Induktionsschritt der Induktionsregel konstant bleiben.

Diese müssen nachformit Namen und Signatur angegeben werden.

Beispiel: Reflexive, transitive Hülle

inductive rtc :: (’a’abool)’a’abool for r :: "’a’abool"

where refl: "rtc r a a"

| trans: "[[ rtc r a b; r b c ]] =⇒ rtc r a c"

rtc.induct: [[rtc ?r ?x ?y; Va. ?P a a;

Va b c. [[rtc ?r a b; ?P a b; ?r b c]] =⇒ ?P a c]]

=⇒?P ?x ?y

(24)

Ausblick

108 SS 2016 Joachim Breitner, Denis Lohner - Theorembeweiserpraktikum LEHRSTUHL PROGRAMMIERPARADIGMEN

KIT

Statt induktiver Präkate sind auchinduktive Mengenmöglich.

Das Schlüsselwort istinductive_setund die Signatur verwendet entsprechend’a setstatt’abool.

Manchmal braucht man fixe Parameter, die beim Induktionsschritt der Induktionsregel konstant bleiben.

Diese müssen nachformit Namen und Signatur angegeben werden.

Beispiel: Reflexive, transitive Hülle

inductive rtc :: (’a’abool)’a’abool

for r :: "’a’abool"

where refl: "rtc r a a"

| trans: "[[ rtc r a b; r b c ]] =⇒ rtc r a c"

rtc.induct: [[rtc ?r ?x ?y; Vr a. ?P r a a;

Vr a b c. [[rtc r a b; ?P r a b; r b c]] =⇒ ?P r a c]]

=⇒?P ?r ?x ?y

Referenzen

ÄHNLICHE DOKUMENTE

Induktionsprinzip: Um eine Eigenschaft für alle Elemente zu zeigen, genügt es sie für eine beliebige Menge zu zeigen, die die.. definierende

Ein Theorembeweiser beweist Aussagen ¨uber formale Strukturen durch Anwendung von Regeln.. Typen und Datentypen (nat ¨urliche Zahlen, Listen, Paare,. ) Mengen,

oftmals Fallunterscheidung nicht genug, brauchen Induktionshypothese f ¨ur Pr ¨adikate in der Pr ¨amisse einer Regel. daf ¨ur Induktionsregel Pr¨ adikatname.induct Beispiel

Ein Theorembeweiser beweist Aussagen über formale Strukturen durch Anwendung von Regeln.. Typen und Datentypen (natürliche Zahlen, Listen, Paare,. ) Mengen,

Syntax: Regeln für korrekte Anordnung von Sprachkonstrukten In Programmiersprachen meist durch Grammatik, vor allem in BNF (Backus-Naur-Form) gegeben Angegeben im

Das sollte man bei bewiesenen Lemmas eigentlich nicht brauchen (die kann man direkt „richtig“ formulieren), aber in Kombination mit OF oder of ist es oft der beste Weg die Regel

0 SS 2016 Joachim Breitner, Denis Lohner - Theorembeweiserpraktikum LEHRSTUHL PROGRAMMIERPARADIGMEN LEHRSTUHL

0 SS 2016 Joachim Breitner, Denis Lohner - Theorembeweiserpraktikum LEHRSTUHL PROGRAMMIERPARADIGMEN LEHRSTUHL