IPD Snelting, Lehrstuhl Programmierparadigmen
http://pp.info.uni-karlsruhe.de/lehre/SS2010/tba/
Daniel Wasserrab
Theorembeweiserpraktikum
Anwendungen in der Sprachtechnologie
Teil III
Quantoren in Isabelle/HOL
Quantoren in Isabelle/HOL
Die ¨ublichen zwei Quantoren der Logik:
Existenzquantor: ∃ (geschrieben\<exists>), Syntax:∃x. P Allquantor: ∀ (geschrieben\<forall>), Syntax:∀x. P
G ¨ultigkeitsbereich der gebundenen Variablen: bis zum n ¨achsten ; bzw.=⇒ Beispiele:
∀x. P x =⇒ Q x: xin Konklusion nicht gebunden durch Allquantor
P y =⇒ ∃y. P y: yin Pr ¨amisse nicht gebunden durch Existenzquantor [[∀x. P x; ∃x. Q x]] =⇒ R:
Zwei verschiedenexin den Annahmen
gleichbedeutend mit[[∀y. P y; ∃z. Q z]] =⇒ R (gebundene Namen sind Schall und Rauch)
∀x. P x −→ Q x: gleichesxf ¨urPundQ
Quantoren in Isabelle/HOL
Die ¨ublichen zwei Quantoren der Logik:
Existenzquantor: ∃ (geschrieben\<exists>), Syntax:∃x. P Allquantor: ∀ (geschrieben\<forall>), Syntax:∀x. P
G ¨ultigkeitsbereich der gebundenen Variablen: bis zum n ¨achsten ; bzw.=⇒
Beispiele:
∀x. P x =⇒ Q x: xin Konklusion nicht gebunden durch Allquantor
P y =⇒ ∃y. P y: yin Pr ¨amisse nicht gebunden durch Existenzquantor [[∀x. P x; ∃x. Q x]] =⇒ R:
Zwei verschiedenexin den Annahmen
gleichbedeutend mit[[∀y. P y; ∃z. Q z]] =⇒ R (gebundene Namen sind Schall und Rauch)
∀x. P x −→ Q x: gleichesxf ¨urPundQ
Quantoren in Isabelle/HOL
Die ¨ublichen zwei Quantoren der Logik:
Existenzquantor: ∃ (geschrieben\<exists>), Syntax:∃x. P Allquantor: ∀ (geschrieben\<forall>), Syntax:∀x. P
G ¨ultigkeitsbereich der gebundenen Variablen: bis zum n ¨achsten ; bzw.=⇒ Beispiele:
∀x. P x =⇒ Q x: xin Konklusion nicht gebunden durch Allquantor
P y =⇒ ∃y. P y: yin Pr ¨amisse nicht gebunden durch Existenzquantor [[∀x. P x; ∃x. Q x]] =⇒ R:
Zwei verschiedenexin den Annahmen
gleichbedeutend mit[[∀y. P y; ∃z. Q z]] =⇒ R (gebundene Namen sind Schall und Rauch)
∀x. P x −→ Q x: gleichesxf ¨urPundQ
Quantoren in Isabelle/HOL
Die ¨ublichen zwei Quantoren der Logik:
Existenzquantor: ∃ (geschrieben\<exists>), Syntax:∃x. P Allquantor: ∀ (geschrieben\<forall>), Syntax:∀x. P
G ¨ultigkeitsbereich der gebundenen Variablen: bis zum n ¨achsten ; bzw.=⇒ Beispiele:
∀x. P x =⇒ Q x: xin Konklusion nicht gebunden durch Allquantor P y =⇒ ∃y. P y: yin Pr ¨amisse nicht gebunden durch Existenzquantor
[[∀x. P x; ∃x. Q x]] =⇒ R:
Zwei verschiedenexin den Annahmen
gleichbedeutend mit[[∀y. P y; ∃z. Q z]] =⇒ R (gebundene Namen sind Schall und Rauch)
∀x. P x −→ Q x: gleichesxf ¨urPundQ
Quantoren in Isabelle/HOL
Die ¨ublichen zwei Quantoren der Logik:
Existenzquantor: ∃ (geschrieben\<exists>), Syntax:∃x. P Allquantor: ∀ (geschrieben\<forall>), Syntax:∀x. P
G ¨ultigkeitsbereich der gebundenen Variablen: bis zum n ¨achsten ; bzw.=⇒ Beispiele:
∀x. P x =⇒ Q x: xin Konklusion nicht gebunden durch Allquantor P y =⇒ ∃y. P y: yin Pr ¨amisse nicht gebunden durch Existenzquantor [[∀x. P x; ∃x. Q x]] =⇒ R:
Zwei verschiedenexin den Annahmen
gleichbedeutend mit[[∀y. P y; ∃z. Q z]] =⇒ R (gebundene Namen sind Schall und Rauch)
∀x. P x −→ Q x: gleichesxf ¨urPundQ
Quantoren in Isabelle/HOL
Die ¨ublichen zwei Quantoren der Logik:
Existenzquantor: ∃ (geschrieben\<exists>), Syntax:∃x. P Allquantor: ∀ (geschrieben\<forall>), Syntax:∀x. P
G ¨ultigkeitsbereich der gebundenen Variablen: bis zum n ¨achsten ; bzw.=⇒ Beispiele:
∀x. P x =⇒ Q x: xin Konklusion nicht gebunden durch Allquantor P y =⇒ ∃y. P y: yin Pr ¨amisse nicht gebunden durch Existenzquantor [[∀x. P x; ∃x. Q x]] =⇒ R:
Zwei verschiedenexin den Annahmen
gleichbedeutend mit[[∀y. P y; ∃z. Q z]] =⇒ R (gebundene Namen sind Schall und Rauch)
∀x. P x −→ Q x: gleichesxf ¨urPundQ
Wie sagt man es Isabelle...?
Argumentation mit Quantoren erfordert Aussagen ¨uberbeliebigeWerte Nur: wie weiss Isabelle, das ein Wertbeliebigist?
L ¨osung:Meta-Logik!
xin einer Aussage beliebig: brauchen Quantor daf ¨ur Syntax in Isabelle:Vx. [[. . .]] =⇒ . . .
VheisstMeta-Allquantor, Variablen dahinterParameter G ¨ultigkeitsbereich der Parameter: ganzes Subgoal
Beispiel:Vx y. [[∀y. P y −→ Q z y; Q x y]] =⇒ ∃x. Q x y entsprichtVx y. [[∀y1. P y1 −→ Q z y1; Q x y]] =⇒ ∃x1. Q x1 y Auch=⇒ist Teil der Meta-Logik, entsprichtMeta-Implikation Trennt Annahmen und Konklusion
∀ und−→entsprechen nichtVund=⇒, die ersten beiden nur in HOL!
Wie sagt man es Isabelle...?
Argumentation mit Quantoren erfordert Aussagen ¨uberbeliebigeWerte Nur: wie weiss Isabelle, das ein Wertbeliebigist?
L ¨osung:Meta-Logik!
xin einer Aussage beliebig: brauchen Quantor daf ¨ur Syntax in Isabelle:Vx. [[. . .]] =⇒ . . .
VheisstMeta-Allquantor, Variablen dahinterParameter G ¨ultigkeitsbereich der Parameter: ganzes Subgoal
Beispiel:Vx y. [[∀y. P y −→ Q z y; Q x y]] =⇒ ∃x. Q x y entsprichtVx y. [[∀y1. P y1 −→ Q z y1; Q x y]] =⇒ ∃x1. Q x1 y
Auch=⇒ist Teil der Meta-Logik, entsprichtMeta-Implikation Trennt Annahmen und Konklusion
∀ und−→entsprechen nichtVund=⇒, die ersten beiden nur in HOL!
Wie sagt man es Isabelle...?
Argumentation mit Quantoren erfordert Aussagen ¨uberbeliebigeWerte Nur: wie weiss Isabelle, das ein Wertbeliebigist?
L ¨osung:Meta-Logik!
xin einer Aussage beliebig: brauchen Quantor daf ¨ur Syntax in Isabelle:Vx. [[. . .]] =⇒ . . .
VheisstMeta-Allquantor, Variablen dahinterParameter G ¨ultigkeitsbereich der Parameter: ganzes Subgoal
Beispiel:Vx y. [[∀y. P y −→ Q z y; Q x y]] =⇒ ∃x. Q x y entsprichtVx y. [[∀y1. P y1 −→ Q z y1; Q x y]] =⇒ ∃x1. Q x1 y Auch=⇒ist Teil der Meta-Logik, entsprichtMeta-Implikation Trennt Annahmen und Konklusion
∀ und−→entsprechen nichtVund=⇒, die ersten beiden nur in HOL!
Wie sagt man es Isabelle...?
Argumentation mit Quantoren erfordert Aussagen ¨uberbeliebigeWerte Nur: wie weiss Isabelle, das ein Wertbeliebigist?
L ¨osung:Meta-Logik!
xin einer Aussage beliebig: brauchen Quantor daf ¨ur Syntax in Isabelle:Vx. [[. . .]] =⇒ . . .
VheisstMeta-Allquantor, Variablen dahinterParameter G ¨ultigkeitsbereich der Parameter: ganzes Subgoal
Beispiel:Vx y. [[∀y. P y −→ Q z y; Q x y]] =⇒ ∃x. Q x y entsprichtVx y. [[∀y1. P y1 −→ Q z y1; Q x y]] =⇒ ∃x1. Q x1 y Auch=⇒ist Teil der Meta-Logik, entsprichtMeta-Implikation Trennt Annahmen und Konklusion
∀ und−→entsprechen nichtVund=⇒, die ersten beiden nur in HOL!
Regeln
Jeder Quantor Introduktions- und Eliminationsregel:
allI: (V
x. P x) =⇒ ∀x. P x
Eine Aussage gilt f ¨ur beliebigex(Meta-Ebene), also gilt sie auch f ¨ur alle (HOL-Ebene)
allE:[[∀x. P x; P ?x =⇒ R]] =⇒ R
Eine Aussage gilt f ¨ur allex, also folgt die Konklusion auch,
wenn diese Aussage f ¨ur irgendeine (selbst w ¨ahlbare) Variablexgilt Vorsicht:xnach Anwendung der Regel beliebige Variable (?x)!
M ¨oglichst gleich spezifizieren ducherule_tac
Regeln
Jeder Quantor Introduktions- und Eliminationsregel:
allI: (V
x. P x) =⇒ ∀x. P x
Eine Aussage gilt f ¨ur beliebigex(Meta-Ebene), also gilt sie auch f ¨ur alle (HOL-Ebene)
allE:[[∀x. P x; P ?x =⇒ R]] =⇒ R
Eine Aussage gilt f ¨ur allex, also folgt die Konklusion auch,
wenn diese Aussage f ¨ur irgendeine (selbst w ¨ahlbare) Variablexgilt Vorsicht:xnach Anwendung der Regel beliebige Variable (?x)!
M ¨oglichst gleich spezifizieren ducherule_tac
Regeln
Jeder Quantor Introduktions- und Eliminationsregel:
allI: (V
x. P x) =⇒ ∀x. P x
Eine Aussage gilt f ¨ur beliebigex(Meta-Ebene), also gilt sie auch f ¨ur alle (HOL-Ebene)
allE:[[∀x. P x; P ?x =⇒ R]] =⇒ R
Eine Aussage gilt f ¨ur allex, also folgt die Konklusion auch,
wenn diese Aussage f ¨ur irgendeine (selbst w ¨ahlbare) Variablexgilt Vorsicht:xnach Anwendung der Regel beliebige Variable (?x)!
M ¨oglichst gleich spezifizieren ducherule_tac
Regeln
exI: P ?x =⇒ ∃x. P x
Eine Aussage gilt f ¨ur eine Variablex, also gibt es einx, wof ¨ur sie gilt Vorsicht:xnach Anwendung der Regel beliebige Variable (?x)!
M ¨oglichst gleich spezifizieren duchrule_tac
exE:[[∃x. P x; V
x. P x =⇒ Q]] =⇒ Q
Eine Aussage gilt f ¨ur einx, also folgt die Konklusion auch,
wenn diese Aussage f ¨ur eine beliebige (vorgegebene!) Variable gilt.
Regeln
exI: P ?x =⇒ ∃x. P x
Eine Aussage gilt f ¨ur eine Variablex, also gibt es einx, wof ¨ur sie gilt Vorsicht:xnach Anwendung der Regel beliebige Variable (?x)!
M ¨oglichst gleich spezifizieren duchrule_tac exE:[[∃x. P x; V
x. P x =⇒ Q]] =⇒ Q
Eine Aussage gilt f ¨ur einx, also folgt die Konklusion auch,
wenn diese Aussage f ¨ur eine beliebige (vorgegebene!) Variable gilt.
Variablen festlegen bei Regelanwendung
Den RegelnallEundexIgemeinsam:
nach Anwendung der entsprechenden Methodik (alsoerulebzw.rule) unspezifizierte Variablen (?x) in Subgoal
meist nicht gewollt, da schlecht Aussagen dar ¨uber m ¨oglich Besser: entsprechende Variable gleich festlegen
Methodik:rule_tac v1 = t1 and . . . and vk = tk in R,
?v1,. . .,?vkfreie Variable in der anzuwendenden RegelR
(nicht im aktuellen Subgoal!) analog:erule_tac
also m ¨oglichst immerapply(rule_tac x=gewollte Variable in exI) bzw.apply(erule_tac x=gewollte Variable in allE)
Variablen festlegen bei Regelanwendung
Den RegelnallEundexIgemeinsam:
nach Anwendung der entsprechenden Methodik (alsoerulebzw.rule) unspezifizierte Variablen (?x) in Subgoal
meist nicht gewollt, da schlecht Aussagen dar ¨uber m ¨oglich Besser: entsprechende Variable gleich festlegen
Methodik:rule_tac v1 = t1 and . . . and vk = tk in R,
?v1,. . .,?vkfreie Variable in der anzuwendenden RegelR
(nicht im aktuellen Subgoal!) analog:erule_tac
also m ¨oglichst immerapply(rule_tac x=gewollte Variable in exI) bzw.apply(erule_tac x=gewollte Variable in allE)
Variablen festlegen bei Regelanwendung
Den RegelnallEundexIgemeinsam:
nach Anwendung der entsprechenden Methodik (alsoerulebzw.rule) unspezifizierte Variablen (?x) in Subgoal
meist nicht gewollt, da schlecht Aussagen dar ¨uber m ¨oglich Besser: entsprechende Variable gleich festlegen
Methodik:rule_tac v1 = t1 and . . . and vk = tk in R,
?v1,. . .,?vkfreie Variable in der anzuwendenden RegelR
(nicht im aktuellen Subgoal!) analog:erule_tac
also m ¨oglichst immerapply(rule_tac x=gewollte Variable in exI) bzw.apply(erule_tac x=gewollte Variable in allE)
Teil IV
Fallunterscheidung und Definition
Fallunterscheidung
In (klassischen) Beweisen Fallunterscheidung wichtiges Hilfsmittel
In Isabelle: einfach durchapplyder Methodecases P (Pbeliebiges boolesches Pr ¨adikat)
teilt aktuelles Subgoal in 2 neue auf:
erstes mitPzus ¨atzlich in den Annahmen zweites mit¬ Pin den Annahmen
Fallunterscheidung
In (klassischen) Beweisen Fallunterscheidung wichtiges Hilfsmittel In Isabelle: einfach durchapplyder Methodecases P
(Pbeliebiges boolesches Pr ¨adikat) teilt aktuelles Subgoal in 2 neue auf:
erstes mitPzus ¨atzlich in den Annahmen zweites mit¬ Pin den Annahmen
Fallunterscheidung: Beispiel
aktuelles Subgoal: 1.[[B; C]] =⇒ A ∧ B ∨ ¬ A ∧ C sonicht(einfach)l ¨osbar!
jedoch nachapply (cases A)neue Subgoals:
1.[[B; C; A]] =⇒ A ∧ B ∨ ¬ A ∧ C
2.[[B; C; ¬ A]] =⇒ A ∧ B ∨ ¬ A ∧ C
jetzt einfach mit Introduktionsregeln f ¨ur∧und∨zu l ¨osen
Fallunterscheidung: Beispiel
aktuelles Subgoal: 1.[[B; C]] =⇒ A ∧ B ∨ ¬ A ∧ C sonicht(einfach)l ¨osbar!
jedoch nachapply (cases A)neue Subgoals:
1.[[B; C; A]] =⇒ A ∧ B ∨ ¬ A ∧ C
2.[[B; C; ¬ A]] =⇒ A ∧ B ∨ ¬ A ∧ C
jetzt einfach mit Introduktionsregeln f ¨ur∧und∨zu l ¨osen
Fallunterscheidung: Beispiel
aktuelles Subgoal: 1.[[B; C]] =⇒ A ∧ B ∨ ¬ A ∧ C sonicht(einfach)l ¨osbar!
jedoch nachapply (cases A)neue Subgoals:
1.[[B; C; A]] =⇒ A ∧ B ∨ ¬ A ∧ C
2.[[B; C; ¬ A]] =⇒ A ∧ B ∨ ¬ A ∧ C
jetzt einfach mit Introduktionsregeln f ¨ur∧und∨zu l ¨osen
Fallunterscheidung: Beispiel
aktuelles Subgoal: 1.[[B; C]] =⇒ A ∧ B ∨ ¬ A ∧ C sonicht(einfach)l ¨osbar!
jedoch nachapply (cases A)neue Subgoals:
1.[[B; C; A]] =⇒ A ∧ B ∨ ¬ A ∧ C
2.[[B; C; ¬ A]] =⇒ A ∧ B ∨ ¬ A ∧ C
jetzt einfach mit Introduktionsregeln f ¨ur∧und∨zu l ¨osen
Fallunterscheidung: Beispiel
aktuelles Subgoal: 1.[[B; C]] =⇒ A ∧ B ∨ ¬ A ∧ C sonicht(einfach)l ¨osbar!
jedoch nachapply (cases A)neue Subgoals:
1.[[B; C; A]] =⇒ A ∧ B ∨ ¬ A ∧ C
2.[[B; C; ¬ A]] =⇒ A ∧ B ∨ ¬ A ∧ C
jetzt einfach mit Introduktionsregeln f ¨ur∧und∨zu l ¨osen
definition
Erm ¨oglicht direkte Definition von nichtrekursiven Funktionen verbindet Deklaration mit Definition der Funktion
Beispiel: Funktionnand(= “not and”) definition nand :: bool ⇒ bool ⇒ bool
where "nand A B ≡ ¬ (A ∧ B)"
automatisch generierte Simplifikationsregel:nand_def (allgemeinFunktionsname_def)
kann dem Simplifier ¨ubergeben werden
definition
Erm ¨oglicht direkte Definition von nichtrekursiven Funktionen verbindet Deklaration mit Definition der Funktion
Beispiel: Funktionnand(= “not and”) definition nand :: bool ⇒ bool ⇒ bool
where "nand A B ≡ ¬ (A ∧ B)"
automatisch generierte Simplifikationsregel:nand_def (allgemeinFunktionsname_def)
kann dem Simplifier ¨ubergeben werden
definition
Erm ¨oglicht direkte Definition von nichtrekursiven Funktionen verbindet Deklaration mit Definition der Funktion
Beispiel: Funktionnand(= “not and”) definition nand :: bool ⇒ bool ⇒ bool
where "nand A B ≡ ¬ (A ∧ B)"
automatisch generierte Simplifikationsregel:nand_def (allgemeinFunktionsname_def)
kann dem Simplifier ¨ubergeben werden
definition
nandbin ¨arer Operator=⇒Infixoperator bietet sich an Syntaxdefinition in Isabelle durch Anh ¨angen des Ausdrucks (infixl "./" n)an die Deklarationszeile, wobei
infixlf ¨ur linksgebundenen Infixoperator steht, analoginfixrf ¨ur rechtsgebundene
./ein beliebig w ¨ahlbares Symbol f ¨ur den Operator ist nZahl, welche die Pr ¨azedenz dieses Operators angibt Kann jetztA ./ Bstattnand A Bschreiben
Teil V
Simplifikation
Simplifikation
genauer: Termersetzung, weil Ausdruck nicht notwendigerweise einfacher Simplifikationsregeln: Gleichung
entsprechende Taktik:simp
besitzt Pool an Termersetzungsregeln
pr ¨uft f ¨ur jede solche Regel, ob Term mit linker Seite einer Gleichung unifizierbar
falls ja, ersetzen mit entsprechend unifizierter rechten Seite
Beispiel: aktuelles Subgoal:C =⇒ if b then s1 else s2 simpwendet folgende Termersetzungsregel an:
if ?x then ?m else ?n = ((?x −→ ?m) ∧ (¬ ?x −→ ?n)) Resultat:C =⇒ (b −→ s1) ∧ (¬ b −→ s2)
Simplifikation
genauer: Termersetzung, weil Ausdruck nicht notwendigerweise einfacher Simplifikationsregeln: Gleichung
entsprechende Taktik:simp
besitzt Pool an Termersetzungsregeln
pr ¨uft f ¨ur jede solche Regel, ob Term mit linker Seite einer Gleichung unifizierbar
falls ja, ersetzen mit entsprechend unifizierter rechten Seite Beispiel: aktuelles Subgoal:C =⇒ if b then s1 else s2 simpwendet folgende Termersetzungsregel an:
if ?x then ?m else ?n = ((?x −→ ?m) ∧ (¬ ?x −→ ?n)) Resultat:C =⇒ (b −→ s1) ∧ (¬ b −→ s2)
Simplifikation
Auch bedingte Ersetzungsregeln sind m ¨oglich, also in der Form [[. . .]] =⇒ . . . = . . .
dazu: Pr ¨amissen der Regel mit aktuellen Annahmen unifizierbar
Simplifier modifizieren:
selbstgeschriebene Simplifikationslemmas zu Taktik hinzuf ¨ugen: apply(simp add:Regel1Regel2. . .)
nur bestimmte Ersetzungsregeln verwenden: apply(simp only:Regel1Regel2. . .)
Ersetzungsregeln aus dem Standardpool vonsimpentfernen: apply(simp del:Regel1Regel2. . .)
Simplifikation
Auch bedingte Ersetzungsregeln sind m ¨oglich, also in der Form [[. . .]] =⇒ . . . = . . .
dazu: Pr ¨amissen der Regel mit aktuellen Annahmen unifizierbar Simplifier modifizieren:
selbstgeschriebene Simplifikationslemmas zu Taktik hinzuf ¨ugen:
apply(simp add:Regel1Regel2. . .)
nur bestimmte Ersetzungsregeln verwenden:
apply(simp only:Regel1Regel2. . .)
Ersetzungsregeln aus dem Standardpool vonsimpentfernen:
apply(simp del:Regel1Regel2. . .)
Simplifikation
Auch m ¨oglich: Ersetzungsregeln in den Standardpool vonsimpeinf ¨ugen Zwei Varianten:
Zusatz[simp]hinter Lemmanamen
Beispiel:lemma bla [simp]: "A = True =⇒ A ∧ B = B"
mittelsdeclare [simp]
Beispiel:declare [simp]: foo bar
Analog: mittelsdeclare [simp del]Ersetzungsregeln aus Standardpool entfernen
Vorsicht!
Nur Regeln zu Standardpool hinzuf ¨ugen, dessen rechte Seite einfacher als linke Seite!
Sicherstellen, dasssimpdurch neue Regeln nicht in Endlosschleifen h ¨angenbleibt!
Simplifikation
Auch m ¨oglich: Ersetzungsregeln in den Standardpool vonsimpeinf ¨ugen Zwei Varianten:
Zusatz[simp]hinter Lemmanamen
Beispiel:lemma bla [simp]: "A = True =⇒ A ∧ B = B"
mittelsdeclare [simp]
Beispiel:declare [simp]: foo bar
Analog: mittelsdeclare [simp del]Ersetzungsregeln aus Standardpool entfernen
Vorsicht!
Nur Regeln zu Standardpool hinzuf ¨ugen, dessen rechte Seite einfacher als linke Seite!
Sicherstellen, dasssimpdurch neue Regeln nicht in Endlosschleifen
Einschub: Arbeiten mit apply-Skripten
nachapplymehrere Regelanwendungen bzw. Taktiken hintereinander Bsp:apply(simp,rule foo,auto)
regul ¨are Ausdr ¨ucke:
+hinter Regel bzw. Taktik wendet diese ein- oder mehrfach an Bsp:apply(assumption)+
?analog f ¨ur null- oder einfache Anwendung Bsp:apply(assumption)?
|zwischen zwei Regeln bzw. Taktiken wendet die erste an, bei Nichtgelingen zweite; Bsp:apply(assumption|arith) byersetzt letzteapply-Regelanwendung bzw. Taktik unddone alleassumptionAnwendungen nachapplyautomatisch angewandt Bsp: stattapply(rule foo,assumption,assumption) done
nurby(rule foo)