diff -r 4f169d2cf6f3 -r 782f0b662cae src/Doc/Isar_Ref/First_Order_Logic.thy --- a/src/Doc/Isar_Ref/First_Order_Logic.thy Tue Oct 07 21:28:24 2014 +0200 +++ b/src/Doc/Isar_Ref/First_Order_Logic.thy Tue Oct 07 21:29:59 2014 +0200 @@ -1,17 +1,17 @@ -header {* Example: First-Order Logic *} +header \Example: First-Order Logic\ theory %visible First_Order_Logic imports Base (* FIXME Pure!? *) begin -text {* +text \ \noindent In order to commence a new object-logic within Isabelle/Pure we introduce abstract syntactic categories @{text "i"} for individuals and @{text "o"} for object-propositions. The latter is embedded into the language of Pure propositions by means of a separate judgment. -*} +\ typedecl i typedecl o @@ -19,24 +19,24 @@ judgment Trueprop :: "o \ prop" ("_" 5) -text {* +text \ \noindent Note that the object-logic judgment is implicit in the syntax: writing @{prop A} produces @{term "Trueprop A"} internally. From the Pure perspective this means ``@{prop A} is derivable in the object-logic''. -*} +\ -subsection {* Equational reasoning \label{sec:framework-ex-equal} *} +subsection \Equational reasoning \label{sec:framework-ex-equal}\ -text {* +text \ Equality is axiomatized as a binary predicate on individuals, with reflexivity as introduction, and substitution as elimination principle. Note that the latter is particularly convenient in a framework like Isabelle, because syntactic congruences are implicitly produced by unification of @{term "B x"} against expressions containing occurrences of @{term x}. -*} +\ axiomatization equal :: "i \ i \ o" (infix "=" 50) @@ -44,33 +44,33 @@ refl [intro]: "x = x" and subst [elim]: "x = y \ B x \ B y" -text {* +text \ \noindent Substitution is very powerful, but also hard to control in full generality. We derive some common symmetry~/ transitivity schemes of @{term equal} as particular consequences. -*} +\ theorem sym [sym]: assumes "x = y" shows "y = x" proof - have "x = x" .. - with `x = y` show "y = x" .. + with \x = y\ show "y = x" .. qed theorem forw_subst [trans]: assumes "y = x" and "B x" shows "B y" proof - - from `y = x` have "x = y" .. - from this and `B x` show "B y" .. + from \y = x\ have "x = y" .. + from this and \B x\ show "B y" .. qed theorem back_subst [trans]: assumes "B x" and "x = y" shows "B y" proof - - from `x = y` and `B x` + from \x = y\ and \B x\ show "B y" .. qed @@ -78,19 +78,19 @@ assumes "x = y" and "y = z" shows "x = z" proof - - from `y = z` and `x = y` + from \y = z\ and \x = y\ show "x = z" .. qed -subsection {* Basic group theory *} +subsection \Basic group theory\ -text {* +text \ As an example for equational reasoning we consider some bits of group theory. The subsequent locale definition postulates group operations and axioms; we also derive some consequences of this specification. -*} +\ locale group = fixes prod :: "i \ i \ i" (infix "\" 70) @@ -123,7 +123,7 @@ finally show "x \ 1 = x" . qed -text {* +text \ \noindent Reasoning from basic axioms is often tedious. Our proofs work by producing various instances of the given rules (potentially the symmetric form) using the pattern ``@{command have}~@{text @@ -139,7 +139,7 @@ not be over-emphasized. The other extreme is to compose a chain by plain transitivity only, with replacements occurring always in topmost position. For example: -*} +\ (*<*) theorem "\A. PROP A \ PROP A" @@ -156,7 +156,7 @@ qed (*>*) -text {* +text \ \noindent Here we have re-used the built-in mechanism for unfolding definitions in order to normalize each equational problem. A more realistic object-logic would include proper setup for the Simplifier @@ -164,18 +164,18 @@ reasoning in Isabelle. Then ``@{command unfolding}~@{thm left_inv}~@{command ".."}'' would become ``@{command "by"}~@{text "(simp only: left_inv)"}'' etc. -*} +\ end -subsection {* Propositional logic \label{sec:framework-ex-prop} *} +subsection \Propositional logic \label{sec:framework-ex-prop}\ -text {* +text \ We axiomatize basic connectives of propositional logic: implication, disjunction, and conjunction. The associated rules are modeled after Gentzen's system of Natural Deduction @{cite "Gentzen:1935"}. -*} +\ axiomatization imp :: "o \ o \ o" (infixr "\" 25) where @@ -194,26 +194,26 @@ conjD\<^sub>1: "A \ B \ A" and conjD\<^sub>2: "A \ B \ B" -text {* +text \ \noindent The conjunctive destructions have the disadvantage that decomposing @{prop "A \ B"} involves an immediate decision which component should be projected. The more convenient simultaneous elimination @{prop "A \ B \ (A \ B \ C) \ C"} can be derived as follows: -*} +\ theorem conjE [elim]: assumes "A \ B" obtains A and B proof - from `A \ B` show A by (rule conjD\<^sub>1) - from `A \ B` show B by (rule conjD\<^sub>2) + from \A \ B\ show A by (rule conjD\<^sub>1) + from \A \ B\ show B by (rule conjD\<^sub>2) qed -text {* +text \ \noindent Here is an example of swapping conjuncts with a single intermediate elimination step: -*} +\ (*<*) lemma "\A. PROP A \ PROP A" @@ -226,7 +226,7 @@ qed (*>*) -text {* +text \ \noindent Note that the analogous elimination rule for disjunction ``@{text "\ A \ B \ A \ B"}'' coincides with the original axiomatization of @{thm disjE}. @@ -234,7 +234,7 @@ \medskip We continue propositional logic by introducing absurdity with its characteristic elimination. Plain truth may then be defined as a proposition that is trivially true. -*} +\ axiomatization false :: o ("\") where @@ -247,10 +247,10 @@ theorem trueI [intro]: \ unfolding true_def .. -text {* +text \ \medskip\noindent Now negation represents an implication towards absurdity: -*} +\ definition not :: "o \ o" ("\ _" [40] 40) where @@ -262,27 +262,27 @@ unfolding not_def proof assume A - then show \ by (rule `A \ \`) + then show \ by (rule \A \ \\) qed theorem notE [elim]: assumes "\ A" and A shows B proof - - from `\ A` have "A \ \" unfolding not_def . - from `A \ \` and `A` have \ .. + from \\ A\ have "A \ \" unfolding not_def . + from \A \ \\ and \A\ have \ .. then show B .. qed -subsection {* Classical logic *} +subsection \Classical logic\ -text {* +text \ Subsequently we state the principle of classical contradiction as a local assumption. Thus we refrain from forcing the object-logic into the classical perspective. Within that context, we may derive well-known consequences of the classical principle. -*} +\ locale classical = assumes classical: "(\ C \ C) \ C" @@ -293,7 +293,7 @@ shows C proof (rule classical) assume "\ C" - with `\ \ C` show C .. + with \\ \ C\ show C .. qed theorem tertium_non_datur: "C \ \ C" @@ -304,14 +304,14 @@ have "\ C" proof assume C then have "C \ \ C" .. - with `\ (C \ \ C)` show \ .. + with \\ (C \ \ C)\ show \ .. qed then have "C \ \ C" .. - with `\ (C \ \ C)` show \ .. + with \\ (C \ \ C)\ show \ .. qed qed -text {* +text \ \noindent These examples illustrate both classical reasoning and non-trivial propositional proofs in general. All three rules characterize classical logic independently, but the original rule is @@ -323,21 +323,21 @@ This also explains nicely how classical reasoning really works: whatever the main @{text thesis} might be, we may always assume its negation! -*} +\ end -subsection {* Quantifiers \label{sec:framework-ex-quant} *} +subsection \Quantifiers \label{sec:framework-ex-quant}\ -text {* +text \ Representing quantifiers is easy, thanks to the higher-order nature of the underlying framework. According to the well-known technique introduced by Church @{cite "church40"}, quantifiers are operators on predicates, which are syntactically represented as @{text "\"}-terms of type @{typ "i \ o"}. Binder notation turns @{text "All (\x. B x)"} into @{text "\x. B x"} etc. -*} +\ axiomatization All :: "(i \ o) \ o" (binder "\" 10) where @@ -349,26 +349,26 @@ exI [intro]: "B a \ (\x. B x)" and exE [elim]: "(\x. B x) \ (\x. B x \ C) \ C" -text {* +text \ \noindent The statement of @{thm exE} corresponds to ``@{text "\ \x. B x \ x \ B x"}'' in Isar. In the subsequent example we illustrate quantifier reasoning involving all four rules: -*} +\ theorem assumes "\x. \y. R x y" shows "\y. \x. R x y" -proof -- {* @{text "\"} introduction *} - obtain x where "\y. R x y" using `\x. \y. R x y` .. -- {* @{text "\"} elimination *} - fix y have "R x y" using `\y. R x y` .. -- {* @{text "\"} destruction *} - then show "\x. R x y" .. -- {* @{text "\"} introduction *} +proof -- \@{text "\"} introduction\ + obtain x where "\y. R x y" using \\x. \y. R x y\ .. -- \@{text "\"} elimination\ + fix y have "R x y" using \\y. R x y\ .. -- \@{text "\"} destruction\ + then show "\x. R x y" .. -- \@{text "\"} introduction\ qed -subsection {* Canonical reasoning patterns *} +subsection \Canonical reasoning patterns\ -text {* +text \ The main rules of first-order predicate logic from \secref{sec:framework-ex-prop} and \secref{sec:framework-ex-quant} can now be summarized as follows, using the native Isar statement @@ -407,14 +407,14 @@ (Pure) elim}, @{attribute (Pure) dest} --- each according to its particular shape --- we can immediately write Isar proof texts as follows: -*} +\ (*<*) theorem "\A. PROP A \ PROP A" proof - (*>*) - txt_raw {*\begin{minipage}[t]{0.4\textwidth}*}(*<*)next(*>*) + txt_raw \\begin{minipage}[t]{0.4\textwidth}\(*<*)next(*>*) have "A \ B" proof @@ -422,12 +422,12 @@ show B sorry %noproof qed - txt_raw {*\end{minipage}\qquad\begin{minipage}[t]{0.4\textwidth}*}(*<*)next(*>*) + txt_raw \\end{minipage}\qquad\begin{minipage}[t]{0.4\textwidth}\(*<*)next(*>*) have "A \ B" and A sorry %noproof then have B .. - txt_raw {*\end{minipage}\\[3ex]\begin{minipage}[t]{0.4\textwidth}*}(*<*)next(*>*) + txt_raw \\end{minipage}\\[3ex]\begin{minipage}[t]{0.4\textwidth}\(*<*)next(*>*) have A sorry %noproof then have "A \ B" .. @@ -435,7 +435,7 @@ have B sorry %noproof then have "A \ B" .. - txt_raw {*\end{minipage}\qquad\begin{minipage}[t]{0.4\textwidth}*}(*<*)next(*>*) + txt_raw \\end{minipage}\qquad\begin{minipage}[t]{0.4\textwidth}\(*<*)next(*>*) have "A \ B" sorry %noproof then have C @@ -447,26 +447,26 @@ then show C sorry %noproof qed - txt_raw {*\end{minipage}\\[3ex]\begin{minipage}[t]{0.4\textwidth}*}(*<*)next(*>*) + txt_raw \\end{minipage}\\[3ex]\begin{minipage}[t]{0.4\textwidth}\(*<*)next(*>*) have A and B sorry %noproof then have "A \ B" .. - txt_raw {*\end{minipage}\qquad\begin{minipage}[t]{0.4\textwidth}*}(*<*)next(*>*) + txt_raw \\end{minipage}\qquad\begin{minipage}[t]{0.4\textwidth}\(*<*)next(*>*) have "A \ B" sorry %noproof then obtain A and B .. - txt_raw {*\end{minipage}\\[3ex]\begin{minipage}[t]{0.4\textwidth}*}(*<*)next(*>*) + txt_raw \\end{minipage}\\[3ex]\begin{minipage}[t]{0.4\textwidth}\(*<*)next(*>*) have "\" sorry %noproof then have A .. - txt_raw {*\end{minipage}\qquad\begin{minipage}[t]{0.4\textwidth}*}(*<*)next(*>*) + txt_raw \\end{minipage}\qquad\begin{minipage}[t]{0.4\textwidth}\(*<*)next(*>*) have "\" .. - txt_raw {*\end{minipage}\\[3ex]\begin{minipage}[t]{0.4\textwidth}*}(*<*)next(*>*) + txt_raw \\end{minipage}\\[3ex]\begin{minipage}[t]{0.4\textwidth}\(*<*)next(*>*) have "\ A" proof @@ -474,12 +474,12 @@ then show "\" sorry %noproof qed - txt_raw {*\end{minipage}\qquad\begin{minipage}[t]{0.4\textwidth}*}(*<*)next(*>*) + txt_raw \\end{minipage}\qquad\begin{minipage}[t]{0.4\textwidth}\(*<*)next(*>*) have "\ A" and A sorry %noproof then have B .. - txt_raw {*\end{minipage}\\[3ex]\begin{minipage}[t]{0.4\textwidth}*}(*<*)next(*>*) + txt_raw \\end{minipage}\\[3ex]\begin{minipage}[t]{0.4\textwidth}\(*<*)next(*>*) have "\x. B x" proof @@ -487,35 +487,35 @@ show "B x" sorry %noproof qed - txt_raw {*\end{minipage}\qquad\begin{minipage}[t]{0.4\textwidth}*}(*<*)next(*>*) + txt_raw \\end{minipage}\qquad\begin{minipage}[t]{0.4\textwidth}\(*<*)next(*>*) have "\x. B x" sorry %noproof then have "B a" .. - txt_raw {*\end{minipage}\\[3ex]\begin{minipage}[t]{0.4\textwidth}*}(*<*)next(*>*) + txt_raw \\end{minipage}\\[3ex]\begin{minipage}[t]{0.4\textwidth}\(*<*)next(*>*) have "\x. B x" proof show "B a" sorry %noproof qed - txt_raw {*\end{minipage}\qquad\begin{minipage}[t]{0.4\textwidth}*}(*<*)next(*>*) + txt_raw \\end{minipage}\qquad\begin{minipage}[t]{0.4\textwidth}\(*<*)next(*>*) have "\x. B x" sorry %noproof then obtain a where "B a" .. - txt_raw {*\end{minipage}*} + txt_raw \\end{minipage}\ (*<*) qed (*>*) -text {* +text \ \bigskip\noindent Of course, these proofs are merely examples. As sketched in \secref{sec:framework-subproof}, there is a fair amount of flexibility in expressing Pure deductions in Isar. Here the user is asked to express himself adequately, aiming at proof texts of literary quality. -*} +\ end %visible