author | wenzelm |
Wed, 01 Jun 2011 12:20:48 +0200 | |
changeset 44122 | 36daee4cc9c9 |
parent 44121 | ba23e83b0868 |
child 44123 | 6e83c2f73240 |
permissions | -rw-r--r-- |
wenzelm@44121 | 1 |
theory Synopsis |
wenzelm@44121 | 2 |
imports Base Main |
wenzelm@44121 | 3 |
begin |
wenzelm@44121 | 4 |
|
wenzelm@44121 | 5 |
chapter {* Synopsis *} |
wenzelm@44121 | 6 |
|
wenzelm@44121 | 7 |
section {* Notepad *} |
wenzelm@44121 | 8 |
|
wenzelm@44121 | 9 |
text {* |
wenzelm@44121 | 10 |
An Isar proof body serves as mathematical notepad to compose logical |
wenzelm@44122 | 11 |
content, consisting of types, terms, facts. |
wenzelm@44121 | 12 |
*} |
wenzelm@44121 | 13 |
|
wenzelm@44121 | 14 |
|
wenzelm@44122 | 15 |
subsection {* Types and terms *} |
wenzelm@44122 | 16 |
|
wenzelm@44122 | 17 |
notepad |
wenzelm@44122 | 18 |
begin |
wenzelm@44122 | 19 |
txt {* Locally fixed entities: *} |
wenzelm@44122 | 20 |
fix x -- {* local constant, without any type information yet *} |
wenzelm@44122 | 21 |
fix x :: 'a -- {* variant with explicit type-constraint for subsequent use*} |
wenzelm@44122 | 22 |
|
wenzelm@44122 | 23 |
fix a b |
wenzelm@44122 | 24 |
assume "a = b" -- {* type assignment at first occurrence in concrete term *} |
wenzelm@44122 | 25 |
|
wenzelm@44122 | 26 |
txt {* Definitions (non-polymorphic): *} |
wenzelm@44122 | 27 |
def x \<equiv> "t::'a" |
wenzelm@44122 | 28 |
|
wenzelm@44122 | 29 |
txt {* Abbreviations (polymorphic): *} |
wenzelm@44122 | 30 |
let ?f = "\<lambda>x. x" |
wenzelm@44122 | 31 |
term "?f ?f" |
wenzelm@44122 | 32 |
|
wenzelm@44122 | 33 |
txt {* Notation: *} |
wenzelm@44122 | 34 |
write x ("***") |
wenzelm@44122 | 35 |
end |
wenzelm@44122 | 36 |
|
wenzelm@44122 | 37 |
|
wenzelm@44121 | 38 |
subsection {* Facts *} |
wenzelm@44121 | 39 |
|
wenzelm@44121 | 40 |
text {* |
wenzelm@44121 | 41 |
A fact is a simultaneous list of theorems. |
wenzelm@44121 | 42 |
*} |
wenzelm@44121 | 43 |
|
wenzelm@44121 | 44 |
|
wenzelm@44121 | 45 |
subsubsection {* Producing facts *} |
wenzelm@44121 | 46 |
|
wenzelm@44121 | 47 |
notepad |
wenzelm@44121 | 48 |
begin |
wenzelm@44121 | 49 |
|
wenzelm@44121 | 50 |
txt {* Via assumption (``lambda''): *} |
wenzelm@44121 | 51 |
assume a: A |
wenzelm@44121 | 52 |
|
wenzelm@44121 | 53 |
txt {* Via proof (``let''): *} |
wenzelm@44121 | 54 |
have b: B sorry |
wenzelm@44121 | 55 |
|
wenzelm@44121 | 56 |
txt {* Via abbreviation (``let''): *} |
wenzelm@44121 | 57 |
note c = a b |
wenzelm@44121 | 58 |
|
wenzelm@44121 | 59 |
end |
wenzelm@44121 | 60 |
|
wenzelm@44121 | 61 |
|
wenzelm@44121 | 62 |
subsubsection {* Referencing facts *} |
wenzelm@44121 | 63 |
|
wenzelm@44121 | 64 |
notepad |
wenzelm@44121 | 65 |
begin |
wenzelm@44121 | 66 |
txt {* Via explicit name: *} |
wenzelm@44121 | 67 |
assume a: A |
wenzelm@44121 | 68 |
note a |
wenzelm@44121 | 69 |
|
wenzelm@44121 | 70 |
txt {* Via implicit name: *} |
wenzelm@44121 | 71 |
assume A |
wenzelm@44121 | 72 |
note this |
wenzelm@44121 | 73 |
|
wenzelm@44121 | 74 |
txt {* Via literal proposition (unification with results from the proof text): *} |
wenzelm@44121 | 75 |
assume A |
wenzelm@44121 | 76 |
note `A` |
wenzelm@44121 | 77 |
|
wenzelm@44121 | 78 |
assume "\<And>x. B x" |
wenzelm@44121 | 79 |
note `B a` |
wenzelm@44121 | 80 |
note `B b` |
wenzelm@44121 | 81 |
end |
wenzelm@44121 | 82 |
|
wenzelm@44121 | 83 |
|
wenzelm@44121 | 84 |
subsubsection {* Manipulating facts *} |
wenzelm@44121 | 85 |
|
wenzelm@44121 | 86 |
notepad |
wenzelm@44121 | 87 |
begin |
wenzelm@44121 | 88 |
txt {* Instantiation: *} |
wenzelm@44121 | 89 |
assume a: "\<And>x. B x" |
wenzelm@44121 | 90 |
note a |
wenzelm@44121 | 91 |
note a [of b] |
wenzelm@44121 | 92 |
note a [where x = b] |
wenzelm@44121 | 93 |
|
wenzelm@44121 | 94 |
txt {* Backchaining: *} |
wenzelm@44121 | 95 |
assume 1: A |
wenzelm@44121 | 96 |
assume 2: "A \<Longrightarrow> C" |
wenzelm@44121 | 97 |
note 2 [OF 1] |
wenzelm@44121 | 98 |
note 1 [THEN 2] |
wenzelm@44121 | 99 |
|
wenzelm@44121 | 100 |
txt {* Symmetric results: *} |
wenzelm@44121 | 101 |
assume "x = y" |
wenzelm@44121 | 102 |
note this [symmetric] |
wenzelm@44121 | 103 |
|
wenzelm@44121 | 104 |
assume "x \<noteq> y" |
wenzelm@44121 | 105 |
note this [symmetric] |
wenzelm@44121 | 106 |
|
wenzelm@44121 | 107 |
txt {* Adhoc-simplication (take care!): *} |
wenzelm@44121 | 108 |
assume "P ([] @ xs)" |
wenzelm@44121 | 109 |
note this [simplified] |
wenzelm@44121 | 110 |
end |
wenzelm@44121 | 111 |
|
wenzelm@44121 | 112 |
|
wenzelm@44121 | 113 |
subsubsection {* Projections *} |
wenzelm@44121 | 114 |
|
wenzelm@44121 | 115 |
text {* |
wenzelm@44121 | 116 |
Isar facts consist of multiple theorems. There is notation to project |
wenzelm@44121 | 117 |
interval ranges. |
wenzelm@44121 | 118 |
*} |
wenzelm@44121 | 119 |
|
wenzelm@44121 | 120 |
notepad |
wenzelm@44121 | 121 |
begin |
wenzelm@44121 | 122 |
assume stuff: A B C D |
wenzelm@44121 | 123 |
note stuff(1) |
wenzelm@44121 | 124 |
note stuff(2-3) |
wenzelm@44121 | 125 |
note stuff(2-) |
wenzelm@44121 | 126 |
end |
wenzelm@44121 | 127 |
|
wenzelm@44121 | 128 |
|
wenzelm@44121 | 129 |
subsubsection {* Naming conventions *} |
wenzelm@44121 | 130 |
|
wenzelm@44121 | 131 |
text {* |
wenzelm@44121 | 132 |
\begin{itemize} |
wenzelm@44121 | 133 |
|
wenzelm@44121 | 134 |
\item Lower-case identifiers are usually preferred. |
wenzelm@44121 | 135 |
|
wenzelm@44121 | 136 |
\item Facts can be named after the main term within the proposition. |
wenzelm@44121 | 137 |
|
wenzelm@44121 | 138 |
\item Facts should \emph{not} be named after the command that |
wenzelm@44121 | 139 |
introduced them (@{command "assume"}, @{command "have"}). This is |
wenzelm@44121 | 140 |
misleading and hard to maintain. |
wenzelm@44121 | 141 |
|
wenzelm@44121 | 142 |
\item Natural numbers can be used as ``meaningless'' names (more |
wenzelm@44121 | 143 |
appropriate than @{text "a1"}, @{text "a2"} etc.) |
wenzelm@44121 | 144 |
|
wenzelm@44121 | 145 |
\item Symbolic identifiers are supported (e.g. @{text "*"}, @{text |
wenzelm@44121 | 146 |
"**"}, @{text "***"}). |
wenzelm@44121 | 147 |
|
wenzelm@44121 | 148 |
\end{itemize} |
wenzelm@44121 | 149 |
*} |
wenzelm@44121 | 150 |
|
wenzelm@44121 | 151 |
|
wenzelm@44121 | 152 |
subsection {* Block structure *} |
wenzelm@44121 | 153 |
|
wenzelm@44121 | 154 |
text {* |
wenzelm@44121 | 155 |
The formal notepad is block structured. The fact produced by the last |
wenzelm@44121 | 156 |
entry of a block is exported into the outer context. |
wenzelm@44121 | 157 |
*} |
wenzelm@44121 | 158 |
|
wenzelm@44121 | 159 |
notepad |
wenzelm@44121 | 160 |
begin |
wenzelm@44121 | 161 |
{ |
wenzelm@44121 | 162 |
have a: A sorry |
wenzelm@44121 | 163 |
have b: B sorry |
wenzelm@44121 | 164 |
note a b |
wenzelm@44121 | 165 |
} |
wenzelm@44121 | 166 |
note this |
wenzelm@44121 | 167 |
note `A` |
wenzelm@44121 | 168 |
note `B` |
wenzelm@44121 | 169 |
end |
wenzelm@44121 | 170 |
|
wenzelm@44121 | 171 |
text {* Explicit blocks as well as implicit blocks of nested goal |
wenzelm@44121 | 172 |
statements (e.g.\ @{command have}) automatically introduce one extra |
wenzelm@44121 | 173 |
pair of parentheses in reserve. The @{command next} command allows |
wenzelm@44121 | 174 |
to ``jump'' between these sub-blocks. *} |
wenzelm@44121 | 175 |
|
wenzelm@44121 | 176 |
notepad |
wenzelm@44121 | 177 |
begin |
wenzelm@44121 | 178 |
|
wenzelm@44121 | 179 |
{ |
wenzelm@44121 | 180 |
have a: A sorry |
wenzelm@44121 | 181 |
next |
wenzelm@44121 | 182 |
have b: B |
wenzelm@44121 | 183 |
proof - |
wenzelm@44121 | 184 |
show B sorry |
wenzelm@44121 | 185 |
next |
wenzelm@44121 | 186 |
have c: C sorry |
wenzelm@44121 | 187 |
next |
wenzelm@44121 | 188 |
have d: D sorry |
wenzelm@44121 | 189 |
qed |
wenzelm@44121 | 190 |
} |
wenzelm@44121 | 191 |
|
wenzelm@44121 | 192 |
txt {* Alternative version with explicit parentheses everywhere: *} |
wenzelm@44121 | 193 |
|
wenzelm@44121 | 194 |
{ |
wenzelm@44121 | 195 |
{ |
wenzelm@44121 | 196 |
have a: A sorry |
wenzelm@44121 | 197 |
} |
wenzelm@44121 | 198 |
{ |
wenzelm@44121 | 199 |
have b: B |
wenzelm@44121 | 200 |
proof - |
wenzelm@44121 | 201 |
{ |
wenzelm@44121 | 202 |
show B sorry |
wenzelm@44121 | 203 |
} |
wenzelm@44121 | 204 |
{ |
wenzelm@44121 | 205 |
have c: C sorry |
wenzelm@44121 | 206 |
} |
wenzelm@44121 | 207 |
{ |
wenzelm@44121 | 208 |
have d: D sorry |
wenzelm@44121 | 209 |
} |
wenzelm@44121 | 210 |
qed |
wenzelm@44121 | 211 |
} |
wenzelm@44121 | 212 |
} |
wenzelm@44121 | 213 |
|
wenzelm@44121 | 214 |
end |
wenzelm@44121 | 215 |
|
wenzelm@44121 | 216 |
end |