KIT
LEHRSTUHL PROGRAMMIERPARADIGMEN
Theorembeweiserpraktikum
Anwendungen in der Sprachtechnologie
KIT
Teil IV
Quantoren in Isabelle/HOL
Quantoren in Isabelle/HOL
KIT
Die üblichen zwei Quantoren der Logik:
Existenzquantor: ∃ (geschrieben\<exists>, Kürzel?), Syntax:∃x. P x Allquantor: ∀ (geschrieben\<forall>, Kürzel!), Syntax:∀x. P x
Gültigkeitsbereich der gebundenen Variablen: bis zum nächsten ; bzw.=⇒
Beispiele
∀x. P x =⇒ Q x xin Konklusion nicht gebunden durch Allquantor
P y =⇒ ∃y. P y yin Prämisse 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ürPundQ
Quantoren in Isabelle/HOL
KIT
Die üblichen zwei Quantoren der Logik:
Existenzquantor: ∃ (geschrieben\<exists>, Kürzel?), Syntax:∃x. P x Allquantor: ∀ (geschrieben\<forall>, Kürzel!), Syntax:∀x. P x Gültigkeitsbereich der gebundenen Variablen:
bis zum nächsten ; bzw.=⇒
Beispiele
∀x. P x =⇒ Q x xin Konklusion nicht gebunden durch Allquantor
P y =⇒ ∃y. P y yin Prämisse 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ürPundQ
Quantoren in Isabelle/HOL
KIT
Die üblichen zwei Quantoren der Logik:
Existenzquantor: ∃ (geschrieben\<exists>, Kürzel?), Syntax:∃x. P x Allquantor: ∀ (geschrieben\<forall>, Kürzel!), Syntax:∀x. P x Gültigkeitsbereich der gebundenen Variablen:
bis zum nächsten ; bzw.=⇒ Beispiele
∀x. P x =⇒ Q x xin Konklusion nicht gebunden durch Allquantor
P y =⇒ ∃y. P y yin Prämisse 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ürPundQ
Quantoren in Isabelle/HOL
KIT
Die üblichen zwei Quantoren der Logik:
Existenzquantor: ∃ (geschrieben\<exists>, Kürzel?), Syntax:∃x. P x Allquantor: ∀ (geschrieben\<forall>, Kürzel!), Syntax:∀x. P x Gültigkeitsbereich der gebundenen Variablen:
bis zum nächsten ; bzw.=⇒ Beispiele
∀x. P x =⇒ Q x xin Konklusion nicht gebunden durch Allquantor P y =⇒ ∃y. P y yin Prämisse 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ürPundQ
Quantoren in Isabelle/HOL
KIT
Die üblichen zwei Quantoren der Logik:
Existenzquantor: ∃ (geschrieben\<exists>, Kürzel?), Syntax:∃x. P x Allquantor: ∀ (geschrieben\<forall>, Kürzel!), Syntax:∀x. P x Gültigkeitsbereich der gebundenen Variablen:
bis zum nächsten ; bzw.=⇒ Beispiele
∀x. P x =⇒ Q x xin Konklusion nicht gebunden durch Allquantor P y =⇒ ∃y. P y yin Prämisse nicht gebunden durch Existenzquantor
∀x. P x =⇒ ∃x. Q x =⇒ R
∀x. P x −→ Q x gleichesxfürPundQ
Quantoren in Isabelle/HOL
KIT
Die üblichen zwei Quantoren der Logik:
Existenzquantor: ∃ (geschrieben\<exists>, Kürzel?), Syntax:∃x. P x Allquantor: ∀ (geschrieben\<forall>, Kürzel!), Syntax:∀x. P x Gültigkeitsbereich der gebundenen Variablen:
bis zum nächsten ; bzw.=⇒ Beispiele
∀x. P x =⇒ Q x xin Konklusion nicht gebunden durch Allquantor P y =⇒ ∃y. P y yin Prämisse 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)
Wie sagt man es Isabelle...?
KIT
Argumentation mit Quantoren erfordert Aussagen überbeliebigeWerte Nur: Wie weiß Isabelle, dass ein Wertbeliebigist?
Lösung: Meta-Logik Syntax: Vx. . . . =⇒ . . .
VheisstMeta-Allquantor, Variablen dahinterParameter Gültigkeitsbereich der Parameter: ganzes Teilziel
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 dieMeta-Implikation=⇒ist Teil der Meta-Logik
∀ und−→entsprechen nichtVund=⇒, die ersten beiden nur in HOL!
Wie sagt man es Isabelle...?
KIT
Argumentation mit Quantoren erfordert Aussagen überbeliebigeWerte Nur: Wie weiß Isabelle, dass ein Wertbeliebigist?
Lösung: Meta-Logik Syntax: Vx. . . . =⇒ . . .
VheisstMeta-Allquantor, Variablen dahinterParameter Gültigkeitsbereich der Parameter: ganzes Teilziel
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 dieMeta-Implikation=⇒ist Teil der Meta-Logik
∀ und−→entsprechen nichtVund=⇒, die ersten beiden nur in HOL!
Wie sagt man es Isabelle...?
KIT
Argumentation mit Quantoren erfordert Aussagen überbeliebigeWerte Nur: Wie weiß Isabelle, dass ein Wertbeliebigist?
Lösung: Meta-Logik Syntax: Vx. . . . =⇒ . . .
VheisstMeta-Allquantor, Variablen dahinterParameter Gültigkeitsbereich der Parameter: ganzes Teilziel
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 dieMeta-Implikation=⇒ist Teil der Meta-Logik
∀ und−→entsprechen nichtVund=⇒, die ersten beiden nur in HOL!
Wie sagt man es Isabelle...?
KIT
Argumentation mit Quantoren erfordert Aussagen überbeliebigeWerte Nur: Wie weiß Isabelle, dass ein Wertbeliebigist?
Lösung: Meta-Logik Syntax: Vx. . . . =⇒ . . .
VheisstMeta-Allquantor, Variablen dahinterParameter Gültigkeitsbereich der Parameter: ganzes Teilziel
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 dieMeta-Implikation=⇒ist Teil der Meta-Logik
∀ und−→entsprechen nichtVund=⇒, die ersten beiden nur in HOL!
Regeln
KIT
Jeder Quantor hat Introduktions- und Eliminationsregel:
allI: (Vx. P x) =⇒ ∀x. P x
Eine Aussage gilt für beliebigex(Meta-Ebene), also gilt sie auch für alle (HOL-Ebene)
allE:∀x. P x =⇒ (P ?x =⇒ R) =⇒ R
Eine Aussage gilt für allex, also folgt die Konklusion, wenn ich sie unter Verwendung der Aussage für einen (selbst wählbaren) Term zeigen kann
exI: P ?x =⇒ ∃x. P x
Eine Aussage gilt für einen Term?x, also gibt es einx, wofür sie gilt exE:∃x. P x =⇒ (Vx. P x =⇒ Q) =⇒ Q
Eine Aussage gilt für einx, also folgt die Konklusion, wenn ich sie unter Verwendung der Aussage für einen beliebigen, nicht weiter bestimmten Term zeigen kann
Regeln
KIT
Jeder Quantor hat Introduktions- und Eliminationsregel:
allI: (Vx. P x) =⇒ ∀x. P x
Eine Aussage gilt für beliebigex(Meta-Ebene), also gilt sie auch für alle (HOL-Ebene)
allE:∀x. P x =⇒ (P ?x =⇒ R) =⇒ R
Eine Aussage gilt für allex, also folgt die Konklusion, wenn ich sie unter Verwendung der Aussage für einen (selbst wählbaren) Term zeigen kann
exI: P ?x =⇒ ∃x. P x
Eine Aussage gilt für einen Term?x, also gibt es einx, wofür sie gilt exE:∃x. P x =⇒ (Vx. P x =⇒ Q) =⇒ Q
Eine Aussage gilt für einx, also folgt die Konklusion, wenn ich sie unter Verwendung der Aussage für einen beliebigen, nicht weiter bestimmten Term zeigen kann
Regeln
KIT
Jeder Quantor hat Introduktions- und Eliminationsregel:
allI: (Vx. P x) =⇒ ∀x. P x
Eine Aussage gilt für beliebigex(Meta-Ebene), also gilt sie auch für alle (HOL-Ebene)
allE:∀x. P x =⇒ (P ?x =⇒ R) =⇒ R
Eine Aussage gilt für allex, also folgt die Konklusion, wenn ich sie unter Verwendung der Aussage für einen (selbst wählbaren) Term zeigen kann
exI: P ?x =⇒ ∃x. P x
Eine Aussage gilt für einen Term?x, also gibt es einx, wofür sie gilt exE:∃x. P x =⇒ (Vx. P x =⇒ Q) =⇒ Q
Eine Aussage gilt für einx, also folgt die Konklusion, wenn ich sie unter Verwendung der Aussage für einen beliebigen, nicht weiter bestimmten Term zeigen kann
Regeln
KIT
Jeder Quantor hat Introduktions- und Eliminationsregel:
allI: (Vx. P x) =⇒ ∀x. P x
Eine Aussage gilt für beliebigex(Meta-Ebene), also gilt sie auch für alle (HOL-Ebene)
allE:∀x. P x =⇒ (P ?x =⇒ R) =⇒ R
Eine Aussage gilt für allex, also folgt die Konklusion, wenn ich sie unter Verwendung der Aussage für einen (selbst wählbaren) Term zeigen kann
exI: P ?x =⇒ ∃x. P x
Eine Aussage gilt für einen Term?x, also gibt es einx, wofür sie gilt
exE:∃x. P x =⇒ (Vx. P x =⇒ Q) =⇒ Q
Eine Aussage gilt für einx, also folgt die Konklusion, wenn ich sie unter Verwendung der Aussage für einen beliebigen, nicht weiter bestimmten Term zeigen kann
Regeln
KIT
Jeder Quantor hat Introduktions- und Eliminationsregel:
allI: (Vx. P x) =⇒ ∀x. P x
Eine Aussage gilt für beliebigex(Meta-Ebene), also gilt sie auch für alle (HOL-Ebene)
allE:∀x. P x =⇒ (P ?x =⇒ R) =⇒ R
Eine Aussage gilt für allex, also folgt die Konklusion, wenn ich sie unter Verwendung der Aussage für einen (selbst wählbaren) Term zeigen kann
exI: P ?x =⇒ ∃x. P x
Eine Aussage gilt für einen Term?x, also gibt es einx, wofür sie gilt exE:∃x. P x =⇒ (Vx. P x =⇒ Q) =⇒ Q
Quantoren in Isar
KIT
Der Befehlfixkorrespondiert mitV. have "∀x. P x"
proof(rule allI) fix x
show "P x" hBeweisi qed
from h∀x. P xi have "Q (f x)"
proof(rule allE) fix x
assume "P (f x)"
then show "Q (f x)" hBeweisi qed
have "∃x. P x"
proof(rule exI)
show "P (f 0)" hBeweisi qed
from h∃x. P xi have "R"
proof(rule exE) fix x
assume "P x"
show "R" hBeweisi qed
Letzteres geht auch ohne neuen Scope:
KIT
Teil V
Fallunterscheidung
Fallunterscheidung
KIT
In (klassischen) Beweisen Fallunterscheidung wichtiges Hilfsmittel P
Q
¬P Q Q
In Isabelle: Mit der Regelcase_split: (P =⇒ Q) =⇒ (¬P =⇒ Q) =⇒ Q Beispiel:
have "BB ∨ ¬ BB" proof(rule case_split)
assume "BB"
then show "BB ∨ ¬BB".. next
assume "¬ BB"
then show "BB ∨ ¬BB".. qed
Stattproof (rule case_split) geht auchproof (cases "BB"). Vorteil: Die Annahmen sind gleich die richtigen (sonst erfährt Isabelle erst beim erstenshow wasPsein sollte – das klappt ggf. nicht zuverlässig).
Fallunterscheidung
KIT
In (klassischen) Beweisen Fallunterscheidung wichtiges Hilfsmittel P
Q
¬P Q Q
In Isabelle: Mit der Regelcase_split: (P =⇒ Q) =⇒ (¬P =⇒ Q) =⇒ Q Beispiel:
have "BB ∨ ¬ BB"
proof(rule case_split) assume "BB"
∨ ¬
Stattproof (rule case_split) geht auchproof (cases "BB"). Vorteil: Die Annahmen sind gleich die richtigen (sonst erfährt
Fallunterscheidung: Beispiel
KIT
Dieses Lemma wäre ohne Fallunterscheidung sonicht(einfach)lösbar!
lemma "B ∧ C −→ (A ∧ B) ∨ (¬ A ∧ C)"
proof
assume "B ∧ C" then have "B"..
from hB ∧ Ci have "C"..
show "(A ∧ B) ∨ (¬ A ∧ C)"
proof(cases A) assume A
from hAi hBi have "A ∧ B"..
then show ?thesis..
next
assume "¬A"
from h¬Ai hCi have "¬A ∧ C"..
then show ?thesis..
qed
KIT
Teil VI
Definition
definition
KIT
Ermöglicht, einen Term zu benennen, so darüber zu abstrahieren und die Abstraktion gezielt zu öffnen
Beispiel:
definition solution :: "nat" where "solution = 42"
Erzeugt Regel:solution_def: solution = 42 So können auch Funktionen definiert werden: Beispiel:
definition nand :: "bool ⇒ bool ⇒ bool" where "nand A B = (¬ (A ∧ B))"
Erzeugt Regel:nand_def: nand A B = (¬ (A ∧ B))
definition
KIT
Ermöglicht, einen Term zu benennen, so darüber zu abstrahieren und die Abstraktion gezielt zu öffnen
Beispiel:
definition solution :: "nat"
where "solution = 42"
Erzeugt Regel:solution_def: solution = 42 So können auch Funktionen definiert werden: Beispiel:
definition nand :: "bool ⇒ bool ⇒ bool" where "nand A B = (¬ (A ∧ B))"
Erzeugt Regel:nand_def: nand A B = (¬ (A ∧ B))
definition
KIT
Ermöglicht, einen Term zu benennen, so darüber zu abstrahieren und die Abstraktion gezielt zu öffnen
Beispiel:
definition solution :: "nat"
where "solution = 42"
Erzeugt Regel:solution_def: solution = 42
So können auch Funktionen definiert werden: Beispiel:
definition nand :: "bool ⇒ bool ⇒ bool" where "nand A B = (¬ (A ∧ B))"
Erzeugt Regel:nand_def: nand A B = (¬ (A ∧ B))
definition
KIT
Ermöglicht, einen Term zu benennen, so darüber zu abstrahieren und die Abstraktion gezielt zu öffnen
Beispiel:
definition solution :: "nat"
where "solution = 42"
Erzeugt Regel:solution_def: solution = 42 So können auch Funktionen definiert werden:
Beispiel:
Erzeugt Regel:nand_def: nand A B = (¬ (A ∧ B))
definition
KIT
Ermöglicht, einen Term zu benennen, so darüber zu abstrahieren und die Abstraktion gezielt zu öffnen
Beispiel:
definition solution :: "nat"
where "solution = 42"
Erzeugt Regel:solution_def: solution = 42 So können auch Funktionen definiert werden:
Beispiel:
definition nand :: "bool ⇒ bool ⇒ bool"
where "nand A B = (¬ (A ∧ B))"
definition – Syntaxdefinition
KIT
nandist binärer Operator
=⇒Infixoperator bietet sich an Syntaxdefinition (Infix-Notation)
Schreibe(infixl "Operatorsymbol" n)an die Deklarationszeile, wobei infixlfür linksgebundenen Infixoperator steht,
infixrfür rechtsgebundene
Operatorsymbolein beliebig wählbares Symbol für den Operator ist, neine Zahl ist, welche die Präzedenz dieses Operators angibt
Beispiel: Operatornand
definition nand :: "bool ⇒ bool ⇒ bool" (infixl "./" 36) where "A ./ B = (¬ (A ∧ B))"
Jetzt:A ./ B ./ Cgleichbedeutend mitnand (nand A B) C
definition – Syntaxdefinition
KIT
nandist binärer Operator
=⇒Infixoperator bietet sich an
Syntaxdefinition (Infix-Notation)
Schreibe(infixl "Operatorsymbol" n)an die Deklarationszeile, wobei infixlfür linksgebundenen Infixoperator steht,
infixrfür rechtsgebundene
Operatorsymbolein beliebig wählbares Symbol für den Operator ist, neine Zahl ist, welche die Präzedenz dieses Operators angibt
Beispiel: Operatornand
definition nand :: "bool ⇒ bool ⇒ bool" (infixl "./" 36) where "A ./ B = (¬ (A ∧ B))"
Jetzt:A ./ B ./ Cgleichbedeutend mitnand (nand A B) C
definition – Syntaxdefinition
KIT
nandist binärer Operator
=⇒Infixoperator bietet sich an Syntaxdefinition (Infix-Notation)
Schreibe(infixl "Operatorsymbol" n)an die Deklarationszeile, wobei infixlfür linksgebundenen Infixoperator steht,
infixrfür rechtsgebundene
Operatorsymbolein beliebig wählbares Symbol für den Operator ist, neine Zahl ist, welche die Präzedenz dieses Operators angibt
Beispiel: Operatornand
definition nand :: "bool ⇒ bool ⇒ bool" (infixl "./" 36) where "A ./ B = (¬ (A ∧ B))"
Jetzt:A ./ B ./ Cgleichbedeutend mitnand (nand A B) C
definition – Syntaxdefinition
KIT
nandist binärer Operator
=⇒Infixoperator bietet sich an Syntaxdefinition (Infix-Notation)
Schreibe(infixl "Operatorsymbol" n)an die Deklarationszeile, wobei infixlfür linksgebundenen Infixoperator steht,
infixrfür rechtsgebundene
Operatorsymbolein beliebig wählbares Symbol für den Operator ist, neine Zahl ist, welche die Präzedenz dieses Operators angibt
Beispiel: Operatornand
definition nand :: "bool ⇒ bool ⇒ bool" (infixl "./" 36) where "A ./ B = (¬ (A ∧ B))"
KIT
Teil VII
Gleichungen
Gleichungen
KIT
Das Arbeiten mit Gleichungen ist eine sehr wichtige Beweistechnik. Die Hauptregel dabei ist die Substitution:
s=t P[s/x] P[t/x] Diese Regel gibt es auch in Isabelle:
subst: s = t =⇒ P s =⇒ P t
Beispiel:
assume "correct solution" with solution_def
have "correct 42" by (rule subst) Auch nützlich:
ssubst: s = t =⇒ P t =⇒ P s arg_cong: x = y =⇒ f x = f y
Gleichungen
KIT
Das Arbeiten mit Gleichungen ist eine sehr wichtige Beweistechnik. Die Hauptregel dabei ist die Substitution:
s=t P[s/x] P[t/x] Diese Regel gibt es auch in Isabelle:
subst: s = t =⇒ P s =⇒ P t
Beispiel:
assume "correct solution"
with solution_def
Transitivität
KIT
Gleichheit ist transitiv, auch in Isabelle:
trans: r = s =⇒ s = t =⇒ r = t
Aber umständlich:
lemma "foo = qux"
proof(rule trans)
show "foo = bar" hBeweis 1i next
show "bar = qux"
proof(rule trans)
show "bar = baz" hBeweis 2i next
show "baz = qux" hBeweis 3i qed
qed
Besser mitalsoundfinally: lemma "foo = qux"
proof-
have "foo = bar" hBeweis 1i also
have "bar = baz" hBeweis 2i also
have "baz = qux" hBeweis 3i finally show ?thesis. qed
Transitivität
KIT
Gleichheit ist transitiv, auch in Isabelle:
trans: r = s =⇒ s = t =⇒ r = t
Aber umständlich:
lemma "foo = qux"
proof(rule trans)
show "foo = bar" hBeweis 1i next
show "bar = qux"
proof(rule trans)
show "bar = baz" hBeweis 2i next
Besser mitalsoundfinally:
lemma "foo = qux"
proof-
have "foo = bar" hBeweis 1i also
have "bar = baz" hBeweis 2i also
have "baz = qux" hBeweis 3i finally show ?thesis.
Gleichungsketten
KIT
Aber oftproof (rule trans)zu schreiben wäre sehr umständlich.
Statt dessen: Gleichungsketten!
Die Befehlealsoundfinallysollten jeweils einer Aussage (assume oderhave) folgen, die eine Gleichung ist.
Das abschließendefinallykombiniert die Aussagen per Transitivität und stellt das Ergebnis (wiefrom) bereit.
In Ausdrücken steht...für die rechte Seite der letzten Aussage.
Ist ein Lemmafoofalsch herum, kann manfoo[symmetric]verwenden.
Die Abkürzung?thesissteht für die Konklusion des aktuell zu beweisende Lemmas (vor Anwendung von Regeln!).
Typisches Muster:
proof- h. . .i
finally show ?thesis.
Gleichungsketten (Beispiel)
KIT
lemma "(A ∧ (A ∨ B)) = A"
proof-
from conj_disj_distribL
have "(A ∧ (A ∨ B)) = ((A ∧ A) ∨ (A ∧ B))".
also
from conj_absorb
have "((A ∧ A) ∨ (A ∧ B)) = (A ∨ (A ∧ B))" by (rule arg_cong) also
have "(A ∨ (A ∧ B)) = A"
proof
ha nested proofi qed
finally
show ∧ ∨ B)) = A".
Gleichungsketten (Beispiel mit Abkürzungen)
KIT
lemma "(A ∧ (A ∨ B)) = A"
proof-
from conj_disj_distribL
have "(A ∧ (A ∨ B)) = ((A ∧ A) ∨ (A ∧ B))".
also
from conj_absorb
have ". . . = (A ∨ (A ∧ B))" by (rule arg_cong) also
have ". . . = A"
proof
ha nested proofi qed
finally
show ?thesis.
qed
Randbemerkung: moreover und ultimately
KIT
Diealso..finally-Struktur hat einen kleinen Bruder:
moreover..ultimately. Hier werden die Aussagen nicht per Transitivität verbunden, sondern einfach gesammelt.
Damit können Verschachtelungen vermieden werden, die Beweise natürlicher aufgebaut und Wiederholungen infrom-Befehlen verringert werden:
have "A ∧ B" proof
show A hBeweis Ai next
show B hBeweis Bi qed
have A hBeweis Ai moreover have B
hBeweis Bi ultimately
have "A ∧ B"..
Randbemerkung: moreover und ultimately
KIT
Diealso..finally-Struktur hat einen kleinen Bruder:
moreover..ultimately. Hier werden die Aussagen nicht per Transitivität verbunden, sondern einfach gesammelt.
Damit können Verschachtelungen vermieden werden, die Beweise natürlicher aufgebaut und Wiederholungen infrom-Befehlen verringert werden:
have "A ∧ B"
proof show A
hBeweis Ai next
show B hBeweis Bi
have A hBeweis Ai moreover have B
hBeweis Bi ultimately
have "A ∧ B"..