| author | haftmann | 
| Wed, 25 Apr 2018 09:04:25 +0000 | |
| changeset 68033 | ad4b8b6892c3 | 
| parent 67764 | 0f8cb5568b63 | 
| child 68276 | cbee43ff4ceb | 
| permissions | -rw-r--r-- | 
| 61656 | 1 | (*:maxLineLen=78:*) | 
| 2 | ||
| 26869 | 3 | theory Spec | 
| 63531 | 4 | imports Main Base | 
| 26869 | 5 | begin | 
| 6 | ||
| 58618 | 7 | chapter \<open>Specifications\<close> | 
| 26869 | 8 | |
| 61664 | 9 | text \<open> | 
| 10 | The Isabelle/Isar theory format integrates specifications and proofs, with | |
| 11 | support for interactive development by continuous document editing. There is | |
| 12 |   a separate document preparation system (see \chref{ch:document-prep}), for
 | |
| 13 | typesetting formal developments together with informal text. The resulting | |
| 14 | hyper-linked PDF documents can be used both for WWW presentation and printed | |
| 15 | copies. | |
| 29745 | 16 | |
| 61664 | 17 |   The Isar proof language (see \chref{ch:proofs}) is embedded into the theory
 | 
| 18 | language as a proper sub-language. Proof mode is entered by stating some | |
| 61665 | 19 | \<^theory_text>\<open>theorem\<close> or \<^theory_text>\<open>lemma\<close> at the theory level, and left again with the final | 
| 20 | conclusion (e.g.\ via \<^theory_text>\<open>qed\<close>). | |
| 58618 | 21 | \<close> | 
| 29745 | 22 | |
| 23 | ||
| 58618 | 24 | section \<open>Defining theories \label{sec:begin-thy}\<close>
 | 
| 26870 | 25 | |
| 58618 | 26 | text \<open> | 
| 26870 | 27 |   \begin{matharray}{rcl}
 | 
| 61493 | 28 |     @{command_def "theory"} & : & \<open>toplevel \<rightarrow> theory\<close> \\
 | 
| 29 |     @{command_def (global) "end"} & : & \<open>theory \<rightarrow> toplevel\<close> \\
 | |
| 30 |     @{command_def "thy_deps"}\<open>\<^sup>*\<close> & : & \<open>theory \<rightarrow>\<close> \\
 | |
| 26870 | 31 |   \end{matharray}
 | 
| 32 | ||
| 59781 | 33 | Isabelle/Isar theories are defined via theory files, which consist of an | 
| 34 | outermost sequence of definition--statement--proof elements. Some | |
| 61665 | 35 | definitions are self-sufficient (e.g.\ \<^theory_text>\<open>fun\<close> in Isabelle/HOL), with | 
| 61664 | 36 | foundational proofs performed internally. Other definitions require an | 
| 61665 | 37 | explicit proof as justification (e.g.\ \<^theory_text>\<open>function\<close> and \<^theory_text>\<open>termination\<close> in | 
| 38 | Isabelle/HOL). Plain statements like \<^theory_text>\<open>theorem\<close> or \<^theory_text>\<open>lemma\<close> are merely a | |
| 39 | special case of that, defining a theorem from a given proposition and its | |
| 40 | proof. | |
| 26870 | 41 | |
| 61664 | 42 | The theory body may be sub-structured by means of \<^emph>\<open>local theory targets\<close>, | 
| 61706 | 43 | such as \<^theory_text>\<open>locale\<close> and \<^theory_text>\<open>class\<close>. It is also possible to use \<^theory_text>\<open>context begin \<dots> | 
| 44 | end\<close> blocks to delimited a local theory context: a \<^emph>\<open>named context\<close> to | |
| 45 | augment a locale or class specification, or an \<^emph>\<open>unnamed context\<close> to refer | |
| 46 | to local parameters and assumptions that are discharged later. See | |
| 47 |   \secref{sec:target} for more details.
 | |
| 28745 | 48 | |
| 61421 | 49 | \<^medskip> | 
| 61665 | 50 | A theory is commenced by the \<^theory_text>\<open>theory\<close> command, which indicates imports of | 
| 51 | previous theories, according to an acyclic foundational order. Before the | |
| 52 | initial \<^theory_text>\<open>theory\<close> command, there may be optional document header material | |
| 53 |   (like \<^theory_text>\<open>section\<close> or \<^theory_text>\<open>text\<close>, see \secref{sec:markup}). The document header
 | |
| 54 | is outside of the formal theory context, though. | |
| 59781 | 55 | |
| 61664 | 56 |   A theory is concluded by a final @{command (global) "end"} command, one that
 | 
| 57 | does not belong to a local theory target. No further commands may follow | |
| 58 |   such a global @{command (global) "end"}.
 | |
| 26870 | 59 | |
| 55112 
b1a5d603fd12
prefer rail cartouche -- avoid back-slashed quotes;
 wenzelm parents: 
55029diff
changeset | 60 |   @{rail \<open>
 | 
| 66916 | 61 |     @@{command theory} @{syntax system_name}
 | 
| 62 |       @'imports' (@{syntax system_name} +) \<newline>
 | |
| 63580 | 63 | keywords? abbrevs? @'begin' | 
| 47114 
7c9e31ffcd9e
updated theory header syntax and related details;
 wenzelm parents: 
46999diff
changeset | 64 | ; | 
| 50128 
599c935aac82
alternative completion for outer syntax keywords;
 wenzelm parents: 
49243diff
changeset | 65 | keywords: @'keywords' (keyword_decls + @'and') | 
| 
599c935aac82
alternative completion for outer syntax keywords;
 wenzelm parents: 
49243diff
changeset | 66 | ; | 
| 63579 | 67 |     keyword_decls: (@{syntax string} +) ('::' @{syntax name} @{syntax tags})?
 | 
| 68 | ; | |
| 67722 
012f1e8a1209
allow multiple entries of and_list (on both sides);
 wenzelm parents: 
67013diff
changeset | 69 | abbrevs: @'abbrevs' (((text+) '=' (text+)) + @'and') | 
| 60093 | 70 | ; | 
| 71 |     @@{command thy_deps} (thy_bounds thy_bounds?)?
 | |
| 72 | ; | |
| 73 |     thy_bounds: @{syntax name} | '(' (@{syntax name} + @'|') ')'
 | |
| 55112 
b1a5d603fd12
prefer rail cartouche -- avoid back-slashed quotes;
 wenzelm parents: 
55029diff
changeset | 74 | \<close>} | 
| 26870 | 75 | |
| 61665 | 76 | \<^descr> \<^theory_text>\<open>theory A imports B\<^sub>1 \<dots> B\<^sub>n begin\<close> starts a new theory \<open>A\<close> based on the | 
| 77 | merge of existing theories \<open>B\<^sub>1 \<dots> B\<^sub>n\<close>. Due to the possibility to import | |
| 78 | more than one ancestor, the resulting theory structure of an Isabelle | |
| 79 | session forms a directed acyclic graph (DAG). Isabelle takes care that | |
| 80 | sources contributing to the development graph are always up-to-date: changed | |
| 81 | files are automatically rechecked whenever a theory header specification is | |
| 82 | processed. | |
| 47114 
7c9e31ffcd9e
updated theory header syntax and related details;
 wenzelm parents: 
46999diff
changeset | 83 | |
| 59781 | 84 | Empty imports are only allowed in the bootstrap process of the special | 
| 85 |   theory @{theory Pure}, which is the start of any other formal development
 | |
| 61664 | 86 | based on Isabelle. Regular user theories usually refer to some more complex | 
| 87 |   entry point, such as theory @{theory Main} in Isabelle/HOL.
 | |
| 59781 | 88 | |
| 63579 | 89 |   The @{keyword_def "keywords"} specification declares outer syntax
 | 
| 61664 | 90 |   (\chref{ch:outer-syntax}) that is introduced in this theory later on (rare
 | 
| 91 | in end-user applications). Both minor keywords and major keywords of the | |
| 92 | Isar command language need to be specified, in order to make parsing of | |
| 93 | proof documents work properly. Command keywords need to be classified | |
| 94 | according to their structural role in the formal text. Examples may be seen | |
| 95 |   in Isabelle/HOL sources itself, such as @{keyword "keywords"}~\<^verbatim>\<open>"typedef"\<close>
 | |
| 96 |   \<open>:: thy_goal\<close> or @{keyword "keywords"}~\<^verbatim>\<open>"datatype"\<close> \<open>:: thy_decl\<close> for
 | |
| 97 | theory-level declarations with and without proof, respectively. Additional | |
| 98 |   @{syntax tags} provide defaults for document preparation
 | |
| 99 |   (\secref{sec:tags}).
 | |
| 50128 
599c935aac82
alternative completion for outer syntax keywords;
 wenzelm parents: 
49243diff
changeset | 100 | |
| 63579 | 101 |   The @{keyword_def "abbrevs"} specification declares additional abbreviations
 | 
| 102 | for syntactic completion. The default for a new keyword is just its name, | |
| 103 |   but completion may be avoided by defining @{keyword "abbrevs"} with empty
 | |
| 104 | text. | |
| 65491 
7fb81fa1d668
more uniform thy_deps (like class_deps), see also c48d536231fe;
 wenzelm parents: 
63680diff
changeset | 105 | |
| 61664 | 106 |   \<^descr> @{command (global) "end"} concludes the current theory definition. Note
 | 
| 61665 | 107 | that some other commands, e.g.\ local theory targets \<^theory_text>\<open>locale\<close> or \<^theory_text>\<open>class\<close> | 
| 108 |   may involve a \<^theory_text>\<open>begin\<close> that needs to be matched by @{command (local) "end"},
 | |
| 109 | according to the usual rules for nested blocks. | |
| 27040 | 110 | |
| 61665 | 111 | \<^descr> \<^theory_text>\<open>thy_deps\<close> visualizes the theory hierarchy as a directed acyclic graph. | 
| 65491 
7fb81fa1d668
more uniform thy_deps (like class_deps), see also c48d536231fe;
 wenzelm parents: 
63680diff
changeset | 112 | By default, all imported theories are shown. This may be restricted by | 
| 
7fb81fa1d668
more uniform thy_deps (like class_deps), see also c48d536231fe;
 wenzelm parents: 
63680diff
changeset | 113 | specifying bounds wrt. the theory inclusion relation. | 
| 58618 | 114 | \<close> | 
| 27040 | 115 | |
| 116 | ||
| 58618 | 117 | section \<open>Local theory targets \label{sec:target}\<close>
 | 
| 27040 | 118 | |
| 58618 | 119 | text \<open> | 
| 47483 | 120 |   \begin{matharray}{rcll}
 | 
| 61493 | 121 |     @{command_def "context"} & : & \<open>theory \<rightarrow> local_theory\<close> \\
 | 
| 122 |     @{command_def (local) "end"} & : & \<open>local_theory \<rightarrow> theory\<close> \\
 | |
| 59926 | 123 |     @{keyword_def "private"} \\
 | 
| 59990 
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
 wenzelm parents: 
59939diff
changeset | 124 |     @{keyword_def "qualified"} \\
 | 
| 47483 | 125 |   \end{matharray}
 | 
| 126 | ||
| 61664 | 127 | A local theory target is a specification context that is managed separately | 
| 128 | within the enclosing theory. Contexts may introduce parameters (fixed | |
| 129 | variables) and assumptions (hypotheses). Definitions and theorems depending | |
| 130 | on the context may be added incrementally later on. | |
| 47482 
a83b25e5bad3
some coverage of unnamed contexts, which can be nested within other targets;
 wenzelm parents: 
47114diff
changeset | 131 | |
| 61664 | 132 |   \<^emph>\<open>Named contexts\<close> refer to locales (cf.\ \secref{sec:locale}) or type
 | 
| 133 |   classes (cf.\ \secref{sec:class}); the name ``\<open>-\<close>'' signifies the global
 | |
| 134 | theory context. | |
| 47482 
a83b25e5bad3
some coverage of unnamed contexts, which can be nested within other targets;
 wenzelm parents: 
47114diff
changeset | 135 | |
| 61664 | 136 | \<^emph>\<open>Unnamed contexts\<close> may introduce additional parameters and assumptions, and | 
| 137 | results produced in the context are generalized accordingly. Such auxiliary | |
| 61665 | 138 | contexts may be nested within other targets, like \<^theory_text>\<open>locale\<close>, \<^theory_text>\<open>class\<close>, | 
| 139 | \<^theory_text>\<open>instantiation\<close>, \<^theory_text>\<open>overloading\<close>. | |
| 27040 | 140 | |
| 55112 
b1a5d603fd12
prefer rail cartouche -- avoid back-slashed quotes;
 wenzelm parents: 
55029diff
changeset | 141 |   @{rail \<open>
 | 
| 62969 | 142 |     @@{command context} @{syntax name} @'begin'
 | 
| 27040 | 143 | ; | 
| 55112 
b1a5d603fd12
prefer rail cartouche -- avoid back-slashed quotes;
 wenzelm parents: 
55029diff
changeset | 144 |     @@{command context} @{syntax_ref "includes"}? (@{syntax context_elem} * ) @'begin'
 | 
| 47484 | 145 | ; | 
| 62969 | 146 |     @{syntax_def target}: '(' @'in' @{syntax name} ')'
 | 
| 55112 
b1a5d603fd12
prefer rail cartouche -- avoid back-slashed quotes;
 wenzelm parents: 
55029diff
changeset | 147 | \<close>} | 
| 27040 | 148 | |
| 61665 | 149 | \<^descr> \<^theory_text>\<open>context c begin\<close> opens a named context, by recommencing an existing | 
| 150 | locale or class \<open>c\<close>. Note that locale and class definitions allow to include | |
| 151 | the \<^theory_text>\<open>begin\<close> keyword as well, in order to continue the local theory | |
| 152 | immediately after the initial specification. | |
| 47482 
a83b25e5bad3
some coverage of unnamed contexts, which can be nested within other targets;
 wenzelm parents: 
47114diff
changeset | 153 | |
| 61665 | 154 | \<^descr> \<^theory_text>\<open>context bundles elements begin\<close> opens an unnamed context, by extending | 
| 155 | the enclosing global or local theory target by the given declaration bundles | |
| 156 |   (\secref{sec:bundle}) and context elements (\<^theory_text>\<open>fixes\<close>, \<^theory_text>\<open>assumes\<close> etc.). This
 | |
| 157 | means any results stemming from definitions and proofs in the extended | |
| 158 | context will be exported into the enclosing target by lifting over extra | |
| 159 | parameters and premises. | |
| 65491 
7fb81fa1d668
more uniform thy_deps (like class_deps), see also c48d536231fe;
 wenzelm parents: 
63680diff
changeset | 160 | |
| 61664 | 161 |   \<^descr> @{command (local) "end"} concludes the current local theory, according to
 | 
| 162 |   the nesting of contexts. Note that a global @{command (global) "end"} has a
 | |
| 163 |   different meaning: it concludes the theory itself (\secref{sec:begin-thy}).
 | |
| 65491 
7fb81fa1d668
more uniform thy_deps (like class_deps), see also c48d536231fe;
 wenzelm parents: 
63680diff
changeset | 164 | |
| 61665 | 165 | \<^descr> \<^theory_text>\<open>private\<close> or \<^theory_text>\<open>qualified\<close> may be given as modifiers before any local | 
| 166 | theory command. This restricts name space accesses to the local scope, as | |
| 167 | determined by the enclosing \<^theory_text>\<open>context begin \<dots> end\<close> block. Outside its scope, | |
| 168 | a \<^theory_text>\<open>private\<close> name is inaccessible, and a \<^theory_text>\<open>qualified\<close> name is only | |
| 61664 | 169 | accessible with some qualification. | 
| 59939 
7d46aa03696e
support for 'restricted' modifier: only qualified accesses outside the local scope;
 wenzelm parents: 
59926diff
changeset | 170 | |
| 61665 | 171 | Neither a global \<^theory_text>\<open>theory\<close> nor a \<^theory_text>\<open>locale\<close> target provides a local scope by | 
| 172 | itself: an extra unnamed context is required to use \<^theory_text>\<open>private\<close> or | |
| 173 | \<^theory_text>\<open>qualified\<close> here. | |
| 59926 | 174 | |
| 61664 | 175 |   \<^descr> \<open>(\<close>@{keyword_def "in"}~\<open>c)\<close> given after any local theory command specifies
 | 
| 61665 | 176 | an immediate target, e.g.\ ``\<^theory_text>\<open>definition (in c)\<close>'' or | 
| 177 | ``\<^theory_text>\<open>theorem (in c)\<close>''. This works both in a local or global theory context; | |
| 178 | the current target context will be suspended for this command only. Note | |
| 179 | that ``\<^theory_text>\<open>(in -)\<close>'' will always produce a global result independently of the | |
| 180 | current target context. | |
| 27040 | 181 | |
| 182 | ||
| 61664 | 183 | Any specification element that operates on \<open>local_theory\<close> according to this | 
| 61665 | 184 | manual implicitly allows the above target syntax \<^theory_text>\<open>(in c)\<close>, but individual | 
| 185 | syntax diagrams omit that aspect for clarity. | |
| 59783 
00b62aa9f430
tuned syntax diagrams -- no duplication of "target";
 wenzelm parents: 
59781diff
changeset | 186 | |
| 61421 | 187 | \<^medskip> | 
| 61664 | 188 | The exact meaning of results produced within a local theory context depends | 
| 189 | on the underlying target infrastructure (locale, type class etc.). The | |
| 190 | general idea is as follows, considering a context named \<open>c\<close> with parameter | |
| 191 | \<open>x\<close> and assumption \<open>A[x]\<close>. | |
| 65491 
7fb81fa1d668
more uniform thy_deps (like class_deps), see also c48d536231fe;
 wenzelm parents: 
63680diff
changeset | 192 | |
| 61664 | 193 | Definitions are exported by introducing a global version with additional | 
| 194 | arguments; a syntactic abbreviation links the long form with the abstract | |
| 195 | version of the target context. For example, \<open>a \<equiv> t[x]\<close> becomes \<open>c.a ?x \<equiv> | |
| 196 | t[?x]\<close> at the theory level (for arbitrary \<open>?x\<close>), together with a local | |
| 197 | abbreviation \<open>c \<equiv> c.a x\<close> in the target context (for the fixed parameter | |
| 198 | \<open>x\<close>). | |
| 27040 | 199 | |
| 61664 | 200 | Theorems are exported by discharging the assumptions and generalizing the | 
| 201 | parameters of the context. For example, \<open>a: B[x]\<close> becomes \<open>c.a: A[?x] \<Longrightarrow> | |
| 202 | B[?x]\<close>, again for arbitrary \<open>?x\<close>. | |
| 59783 
00b62aa9f430
tuned syntax diagrams -- no duplication of "target";
 wenzelm parents: 
59781diff
changeset | 203 | \<close> | 
| 27040 | 204 | |
| 205 | ||
| 58618 | 206 | section \<open>Bundled declarations \label{sec:bundle}\<close>
 | 
| 47484 | 207 | |
| 58618 | 208 | text \<open> | 
| 47484 | 209 |   \begin{matharray}{rcl}
 | 
| 61493 | 210 |     @{command_def "bundle"} & : & \<open>local_theory \<rightarrow> local_theory\<close> \\
 | 
| 63273 | 211 |     @{command "bundle"} & : & \<open>theory \<rightarrow> local_theory\<close> \\
 | 
| 61494 | 212 |     @{command_def "print_bundles"}\<open>\<^sup>*\<close> & : & \<open>context \<rightarrow>\<close> \\
 | 
| 61493 | 213 |     @{command_def "include"} & : & \<open>proof(state) \<rightarrow> proof(state)\<close> \\
 | 
| 214 |     @{command_def "including"} & : & \<open>proof(prove) \<rightarrow> proof(prove)\<close> \\
 | |
| 47484 | 215 |     @{keyword_def "includes"} & : & syntax \\
 | 
| 216 |   \end{matharray}
 | |
| 217 | ||
| 218 |   The outer syntax of fact expressions (\secref{sec:syn-att}) involves
 | |
| 61664 | 219 | theorems and attributes, which are evaluated in the context and applied to | 
| 220 | it. Attributes may declare theorems to the context, as in \<open>this_rule [intro] | |
| 221 |   that_rule [elim]\<close> for example. Configuration options (\secref{sec:config})
 | |
| 222 | are special declaration attributes that operate on the context without a | |
| 223 | theorem, as in \<open>[[show_types = false]]\<close> for example. | |
| 47484 | 224 | |
| 61664 | 225 | Expressions of this form may be defined as \<^emph>\<open>bundled declarations\<close> in the | 
| 226 | context, and included in other situations later on. Including declaration | |
| 227 | bundles augments a local context casually without logical dependencies, | |
| 228 | which is in contrast to locales and locale interpretation | |
| 229 |   (\secref{sec:locale}).
 | |
| 47484 | 230 | |
| 55112 
b1a5d603fd12
prefer rail cartouche -- avoid back-slashed quotes;
 wenzelm parents: 
55029diff
changeset | 231 |   @{rail \<open>
 | 
| 63273 | 232 |     @@{command bundle} @{syntax name}
 | 
| 233 |       ( '=' @{syntax thms} @{syntax for_fixes} | @'begin')
 | |
| 63272 | 234 | ; | 
| 59917 
9830c944670f
more uniform "verbose" option to print name space;
 wenzelm parents: 
59905diff
changeset | 235 |     @@{command print_bundles} ('!'?)
 | 
| 
9830c944670f
more uniform "verbose" option to print name space;
 wenzelm parents: 
59905diff
changeset | 236 | ; | 
| 62969 | 237 |     (@@{command include} | @@{command including}) (@{syntax name}+)
 | 
| 47484 | 238 | ; | 
| 62969 | 239 |     @{syntax_def "includes"}: @'includes' (@{syntax name}+)
 | 
| 55112 
b1a5d603fd12
prefer rail cartouche -- avoid back-slashed quotes;
 wenzelm parents: 
55029diff
changeset | 240 | \<close>} | 
| 47484 | 241 | |
| 61665 | 242 | \<^descr> \<^theory_text>\<open>bundle b = decls\<close> defines a bundle of declarations in the current | 
| 243 | context. The RHS is similar to the one of the \<^theory_text>\<open>declare\<close> command. Bundles | |
| 244 | defined in local theory targets are subject to transformations via | |
| 245 | morphisms, when moved into different application contexts; this works | |
| 246 | analogously to any other local theory specification. | |
| 47484 | 247 | |
| 63273 | 248 | \<^descr> \<^theory_text>\<open>bundle b begin body end\<close> defines a bundle of declarations from the | 
| 249 | \<open>body\<close> of local theory specifications. It may consist of commands that are | |
| 250 | technically equivalent to \<^theory_text>\<open>declare\<close> or \<^theory_text>\<open>declaration\<close>, which also includes | |
| 251 | \<^theory_text>\<open>notation\<close>, for example. Named fact declarations like ``\<^theory_text>\<open>lemmas a [simp] = | |
| 252 | b\<close>'' or ``\<^theory_text>\<open>lemma a [simp]: B \<proof>\<close>'' are also admitted, but the name | |
| 253 | bindings are not recorded in the bundle. | |
| 63272 | 254 | |
| 61665 | 255 | \<^descr> \<^theory_text>\<open>print_bundles\<close> prints the named bundles that are available in the | 
| 256 | current context; the ``\<open>!\<close>'' option indicates extra verbosity. | |
| 47484 | 257 | |
| 63282 | 258 | \<^descr> \<^theory_text>\<open>unbundle b\<^sub>1 \<dots> b\<^sub>n\<close> activates the declarations from the given bundles in | 
| 259 | the current local theory context. This is analogous to \<^theory_text>\<open>lemmas\<close> | |
| 260 |   (\secref{sec:theorems}) with the expanded bundles.
 | |
| 261 | ||
| 262 | \<^descr> \<^theory_text>\<open>include\<close> is similar to \<^theory_text>\<open>unbundle\<close>, but works in a proof body (forward | |
| 263 |   mode). This is analogous to \<^theory_text>\<open>note\<close> (\secref{sec:proof-facts}) with the
 | |
| 264 | expanded bundles. | |
| 47484 | 265 | |
| 61665 | 266 | \<^descr> \<^theory_text>\<open>including\<close> is similar to \<^theory_text>\<open>include\<close>, but works in proof refinement | 
| 267 |   (backward mode). This is analogous to \<^theory_text>\<open>using\<close> (\secref{sec:proof-facts})
 | |
| 268 | with the expanded bundles. | |
| 269 | ||
| 270 | \<^descr> \<^theory_text>\<open>includes b\<^sub>1 \<dots> b\<^sub>n\<close> is similar to \<^theory_text>\<open>include\<close>, but works in situations | |
| 271 | where a specification context is constructed, notably for \<^theory_text>\<open>context\<close> and | |
| 272 | long statements of \<^theory_text>\<open>theorem\<close> etc. | |
| 47484 | 273 | |
| 274 | ||
| 61664 | 275 | Here is an artificial example of bundling various configuration options: | 
| 61458 | 276 | \<close> | 
| 47484 | 277 | |
| 59905 | 278 | (*<*)experiment begin(*>*) | 
| 53536 
69c943125fd3
do not expose internal flags to attribute name space;
 wenzelm parents: 
53370diff
changeset | 279 | bundle trace = [[simp_trace, linarith_trace, metis_trace, smt_trace]] | 
| 47484 | 280 | |
| 281 | lemma "x = x" | |
| 282 | including trace by metis | |
| 59905 | 283 | (*<*)end(*>*) | 
| 47484 | 284 | |
| 285 | ||
| 58618 | 286 | section \<open>Term definitions \label{sec:term-definitions}\<close>
 | 
| 27040 | 287 | |
| 58618 | 288 | text \<open> | 
| 27040 | 289 |   \begin{matharray}{rcll}
 | 
| 61493 | 290 |     @{command_def "definition"} & : & \<open>local_theory \<rightarrow> local_theory\<close> \\
 | 
| 291 |     @{attribute_def "defn"} & : & \<open>attribute\<close> \\
 | |
| 61494 | 292 |     @{command_def "print_defn_rules"}\<open>\<^sup>*\<close> & : & \<open>context \<rightarrow>\<close> \\
 | 
| 61493 | 293 |     @{command_def "abbreviation"} & : & \<open>local_theory \<rightarrow> local_theory\<close> \\
 | 
| 61494 | 294 |     @{command_def "print_abbrevs"}\<open>\<^sup>*\<close> & : & \<open>context \<rightarrow>\<close> \\
 | 
| 27040 | 295 |   \end{matharray}
 | 
| 296 | ||
| 61664 | 297 | Term definitions may either happen within the logic (as equational axioms of | 
| 62172 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 298 |   a certain form (see also \secref{sec:overloading}), or outside of it as
 | 
| 57487 | 299 | rewrite system on abstract syntax. The second form is called | 
| 300 | ``abbreviation''. | |
| 27040 | 301 | |
| 55112 
b1a5d603fd12
prefer rail cartouche -- avoid back-slashed quotes;
 wenzelm parents: 
55029diff
changeset | 302 |   @{rail \<open>
 | 
| 63180 | 303 |     @@{command definition} decl? definition
 | 
| 27040 | 304 | ; | 
| 63180 | 305 |     @@{command abbreviation} @{syntax mode}? decl? abbreviation
 | 
| 59917 
9830c944670f
more uniform "verbose" option to print name space;
 wenzelm parents: 
59905diff
changeset | 306 | ; | 
| 
9830c944670f
more uniform "verbose" option to print name space;
 wenzelm parents: 
59905diff
changeset | 307 |     @@{command print_abbrevs} ('!'?)
 | 
| 63180 | 308 | ; | 
| 309 |     decl: @{syntax name} ('::' @{syntax type})? @{syntax mixfix}? @'where'
 | |
| 310 | ; | |
| 63182 | 311 |     definition: @{syntax thmdecl}? @{syntax prop}
 | 
| 312 |       @{syntax spec_prems} @{syntax for_fixes}
 | |
| 63180 | 313 | ; | 
| 314 |     abbreviation: @{syntax prop} @{syntax for_fixes}
 | |
| 55112 
b1a5d603fd12
prefer rail cartouche -- avoid back-slashed quotes;
 wenzelm parents: 
55029diff
changeset | 315 | \<close>} | 
| 27040 | 316 | |
| 61665 | 317 | \<^descr> \<^theory_text>\<open>definition c where eq\<close> produces an internal definition \<open>c \<equiv> t\<close> according | 
| 318 | to the specification given as \<open>eq\<close>, which is then turned into a proven fact. | |
| 319 | The given proposition may deviate from internal meta-level equality | |
| 320 |   according to the rewrite rules declared as @{attribute defn} by the
 | |
| 61664 | 321 | object-logic. This usually covers object-level equality \<open>x = y\<close> and | 
| 61665 | 322 |   equivalence \<open>A \<longleftrightarrow> B\<close>. End-users normally need not change the @{attribute
 | 
| 61664 | 323 | defn} setup. | 
| 65491 
7fb81fa1d668
more uniform thy_deps (like class_deps), see also c48d536231fe;
 wenzelm parents: 
63680diff
changeset | 324 | |
| 61664 | 325 | Definitions may be presented with explicit arguments on the LHS, as well as | 
| 326 | additional conditions, e.g.\ \<open>f x y = t\<close> instead of \<open>f \<equiv> \<lambda>x y. t\<close> and \<open>y \<noteq> 0 | |
| 327 | \<Longrightarrow> g x y = u\<close> instead of an unrestricted \<open>g \<equiv> \<lambda>x y. u\<close>. | |
| 51585 | 328 | |
| 61665 | 329 | \<^descr> \<^theory_text>\<open>print_defn_rules\<close> prints the definitional rewrite rules declared via | 
| 330 |   @{attribute defn} in the current context.
 | |
| 51585 | 331 | |
| 61665 | 332 | \<^descr> \<^theory_text>\<open>abbreviation c where eq\<close> introduces a syntactic constant which is | 
| 333 | associated with a certain term according to the meta-level equality \<open>eq\<close>. | |
| 65491 
7fb81fa1d668
more uniform thy_deps (like class_deps), see also c48d536231fe;
 wenzelm parents: 
63680diff
changeset | 334 | |
| 61664 | 335 | Abbreviations participate in the usual type-inference process, but are | 
| 336 | expanded before the logic ever sees them. Pretty printing of terms involves | |
| 337 | higher-order rewriting with rules stemming from reverted abbreviations. This | |
| 338 | needs some care to avoid overlapping or looping syntactic replacements! | |
| 65491 
7fb81fa1d668
more uniform thy_deps (like class_deps), see also c48d536231fe;
 wenzelm parents: 
63680diff
changeset | 339 | |
| 61664 | 340 | The optional \<open>mode\<close> specification restricts output to a particular print | 
| 341 | mode; using ``\<open>input\<close>'' here achieves the effect of one-way abbreviations. | |
| 61665 | 342 | The mode may also include an ``\<^theory_text>\<open>output\<close>'' qualifier that affects the | 
| 343 | concrete syntax declared for abbreviations, cf.\ \<^theory_text>\<open>syntax\<close> in | |
| 27040 | 344 |   \secref{sec:syn-trans}.
 | 
| 65491 
7fb81fa1d668
more uniform thy_deps (like class_deps), see also c48d536231fe;
 wenzelm parents: 
63680diff
changeset | 345 | |
| 61665 | 346 | \<^descr> \<^theory_text>\<open>print_abbrevs\<close> prints all constant abbreviations of the current context; | 
| 347 | the ``\<open>!\<close>'' option indicates extra verbosity. | |
| 58618 | 348 | \<close> | 
| 27040 | 349 | |
| 350 | ||
| 58618 | 351 | section \<open>Axiomatizations \label{sec:axiomatizations}\<close>
 | 
| 57487 | 352 | |
| 58618 | 353 | text \<open> | 
| 57487 | 354 |   \begin{matharray}{rcll}
 | 
| 61493 | 355 |     @{command_def "axiomatization"} & : & \<open>theory \<rightarrow> theory\<close> & (axiomatic!) \\
 | 
| 57487 | 356 |   \end{matharray}
 | 
| 357 | ||
| 358 |   @{rail \<open>
 | |
| 63285 | 359 |     @@{command axiomatization} @{syntax vars}? (@'where' axiomatization)?
 | 
| 57487 | 360 | ; | 
| 63178 | 361 |     axiomatization: (@{syntax thmdecl} @{syntax prop} + @'and')
 | 
| 63182 | 362 |       @{syntax spec_prems} @{syntax for_fixes}
 | 
| 57487 | 363 | \<close>} | 
| 364 | ||
| 61665 | 365 | \<^descr> \<^theory_text>\<open>axiomatization c\<^sub>1 \<dots> c\<^sub>m where \<phi>\<^sub>1 \<dots> \<phi>\<^sub>n\<close> introduces several constants | 
| 366 | simultaneously and states axiomatic properties for these. The constants are | |
| 367 | marked as being specified once and for all, which prevents additional | |
| 368 | specifications for the same constants later on, but it is always possible do | |
| 369 | emit axiomatizations without referring to particular constants. Note that | |
| 370 | lack of precise dependency tracking of axiomatizations may disrupt the | |
| 371 | well-formedness of an otherwise definitional theory. | |
| 57487 | 372 | |
| 373 | Axiomatization is restricted to a global theory context: support for local | |
| 374 |   theory targets \secref{sec:target} would introduce an extra dimension of
 | |
| 375 | uncertainty what the written specifications really are, and make it | |
| 376 | infeasible to argue why they are correct. | |
| 377 | ||
| 378 | Axiomatic specifications are required when declaring a new logical system | |
| 379 | within Isabelle/Pure, but in an application environment like Isabelle/HOL | |
| 61664 | 380 | the user normally stays within definitional mechanisms provided by the logic | 
| 381 | and its libraries. | |
| 58618 | 382 | \<close> | 
| 57487 | 383 | |
| 384 | ||
| 58618 | 385 | section \<open>Generic declarations\<close> | 
| 27040 | 386 | |
| 58618 | 387 | text \<open> | 
| 47483 | 388 |   \begin{matharray}{rcl}
 | 
| 61493 | 389 |     @{command_def "declaration"} & : & \<open>local_theory \<rightarrow> local_theory\<close> \\
 | 
| 390 |     @{command_def "syntax_declaration"} & : & \<open>local_theory \<rightarrow> local_theory\<close> \\
 | |
| 391 |     @{command_def "declare"} & : & \<open>local_theory \<rightarrow> local_theory\<close> \\
 | |
| 47483 | 392 |   \end{matharray}
 | 
| 393 | ||
| 61664 | 394 | Arbitrary operations on the background context may be wrapped-up as generic | 
| 395 | declaration elements. Since the underlying concept of local theories may be | |
| 396 | subject to later re-interpretation, there is an additional dependency on a | |
| 397 | morphism that tells the difference of the original declaration context wrt.\ | |
| 398 | the application context encountered later on. A fact declaration is an | |
| 399 | important special case: it consists of a theorem which is applied to the | |
| 400 | context by means of an attribute. | |
| 27040 | 401 | |
| 55112 
b1a5d603fd12
prefer rail cartouche -- avoid back-slashed quotes;
 wenzelm parents: 
55029diff
changeset | 402 |   @{rail \<open>
 | 
| 42596 
6c621a9d612a
modernized rail diagrams using @{rail} antiquotation;
 wenzelm parents: 
41435diff
changeset | 403 |     (@@{command declaration} | @@{command syntax_declaration})
 | 
| 59783 
00b62aa9f430
tuned syntax diagrams -- no duplication of "target";
 wenzelm parents: 
59781diff
changeset | 404 |       ('(' @'pervasive' ')')? \<newline> @{syntax text}
 | 
| 27040 | 405 | ; | 
| 62969 | 406 |     @@{command declare} (@{syntax thms} + @'and')
 | 
| 55112 
b1a5d603fd12
prefer rail cartouche -- avoid back-slashed quotes;
 wenzelm parents: 
55029diff
changeset | 407 | \<close>} | 
| 27040 | 408 | |
| 61665 | 409 |   \<^descr> \<^theory_text>\<open>declaration d\<close> adds the declaration function \<open>d\<close> of ML type @{ML_type
 | 
| 410 | declaration}, to the current local theory under construction. In later | |
| 411 | application contexts, the function is transformed according to the morphisms | |
| 412 | being involved in the interpretation hierarchy. | |
| 27040 | 413 | |
| 61665 | 414 | If the \<^theory_text>\<open>(pervasive)\<close> option is given, the corresponding declaration is | 
| 61664 | 415 | applied to all possible contexts involved, including the global background | 
| 416 | theory. | |
| 33516 | 417 | |
| 61665 | 418 | \<^descr> \<^theory_text>\<open>syntax_declaration\<close> is similar to \<^theory_text>\<open>declaration\<close>, but is meant to affect | 
| 419 | only ``syntactic'' tools by convention (such as notation and type-checking | |
| 420 | information). | |
| 40784 | 421 | |
| 61665 | 422 | \<^descr> \<^theory_text>\<open>declare thms\<close> declares theorems to the current local theory context. No | 
| 423 | theorem binding is involved here, unlike \<^theory_text>\<open>lemmas\<close> (cf.\ | |
| 424 |   \secref{sec:theorems}), so \<^theory_text>\<open>declare\<close> only has the effect of applying
 | |
| 425 | attributes as included in the theorem specification. | |
| 58618 | 426 | \<close> | 
| 27040 | 427 | |
| 428 | ||
| 58618 | 429 | section \<open>Locales \label{sec:locale}\<close>
 | 
| 27040 | 430 | |
| 58618 | 431 | text \<open> | 
| 54049 | 432 | A locale is a functor that maps parameters (including implicit type | 
| 61664 | 433 | parameters) and a specification to a list of declarations. The syntax of | 
| 434 | locales is modeled after the Isar proof context commands (cf.\ | |
| 435 |   \secref{sec:proof-context}).
 | |
| 54049 | 436 | |
| 61664 | 437 | Locale hierarchies are supported by maintaining a graph of dependencies | 
| 438 | between locale instances in the global theory. Dependencies may be | |
| 439 | introduced through import (where a locale is defined as sublocale of the | |
| 440 | imported instances) or by proving that an existing locale is a sublocale of | |
| 441 | one or several locale instances. | |
| 54049 | 442 | |
| 443 | A locale may be opened with the purpose of appending to its list of | |
| 61664 | 444 |   declarations (cf.\ \secref{sec:target}). When opening a locale declarations
 | 
| 445 | from all dependencies are collected and are presented as a local theory. In | |
| 446 | this process, which is called \<^emph>\<open>roundup\<close>, redundant locale instances are | |
| 447 | omitted. A locale instance is redundant if it is subsumed by an instance | |
| 448 | encountered earlier. A more detailed description of this process is | |
| 449 |   available elsewhere @{cite Ballarin2014}.
 | |
| 58618 | 450 | \<close> | 
| 27040 | 451 | |
| 452 | ||
| 58618 | 453 | subsection \<open>Locale expressions \label{sec:locale-expr}\<close>
 | 
| 33846 | 454 | |
| 58618 | 455 | text \<open> | 
| 61606 
6d5213bd9709
uniform mandatory qualifier for all locale expressions, including 'statespace' parent;
 wenzelm parents: 
61566diff
changeset | 456 | A \<^emph>\<open>locale expression\<close> denotes a context composed of instances of existing | 
| 
6d5213bd9709
uniform mandatory qualifier for all locale expressions, including 'statespace' parent;
 wenzelm parents: 
61566diff
changeset | 457 | locales. The context consists of the declaration elements from the locale | 
| 
6d5213bd9709
uniform mandatory qualifier for all locale expressions, including 'statespace' parent;
 wenzelm parents: 
61566diff
changeset | 458 | instances. Redundant locale instances are omitted according to roundup. | 
| 33846 | 459 | |
| 55112 
b1a5d603fd12
prefer rail cartouche -- avoid back-slashed quotes;
 wenzelm parents: 
55029diff
changeset | 460 |   @{rail \<open>
 | 
| 59785 | 461 |     @{syntax_def locale_expr}: (instance + '+') @{syntax for_fixes}
 | 
| 33846 | 462 | ; | 
| 67764 | 463 |     instance: (qualifier ':')? @{syntax name} (pos_insts | named_insts) \<newline>
 | 
| 464 | rewrites? | |
| 33846 | 465 | ; | 
| 61606 
6d5213bd9709
uniform mandatory qualifier for all locale expressions, including 'statespace' parent;
 wenzelm parents: 
61566diff
changeset | 466 |     qualifier: @{syntax name} ('?')?
 | 
| 33846 | 467 | ; | 
| 42617 | 468 |     pos_insts: ('_' | @{syntax term})*
 | 
| 33846 | 469 | ; | 
| 42617 | 470 |     named_insts: @'where' (@{syntax name} '=' @{syntax term} + @'and')
 | 
| 67740 | 471 | ; | 
| 472 |     rewrites: @'rewrites' (@{syntax thmdecl}? @{syntax prop} + @'and')
 | |
| 55112 
b1a5d603fd12
prefer rail cartouche -- avoid back-slashed quotes;
 wenzelm parents: 
55029diff
changeset | 473 | \<close>} | 
| 33846 | 474 | |
| 61606 
6d5213bd9709
uniform mandatory qualifier for all locale expressions, including 'statespace' parent;
 wenzelm parents: 
61566diff
changeset | 475 | A locale instance consists of a reference to a locale and either positional | 
| 67740 | 476 | or named parameter instantiations optionally followed by rewrites clauses. | 
| 477 | Identical instantiations (that is, those | |
| 61606 
6d5213bd9709
uniform mandatory qualifier for all locale expressions, including 'statespace' parent;
 wenzelm parents: 
61566diff
changeset | 478 | that instantiate a parameter by itself) may be omitted. The notation ``\<open>_\<close>'' | 
| 
6d5213bd9709
uniform mandatory qualifier for all locale expressions, including 'statespace' parent;
 wenzelm parents: 
61566diff
changeset | 479 | enables to omit the instantiation for a parameter inside a positional | 
| 
6d5213bd9709
uniform mandatory qualifier for all locale expressions, including 'statespace' parent;
 wenzelm parents: 
61566diff
changeset | 480 | instantiation. | 
| 33846 | 481 | |
| 61606 
6d5213bd9709
uniform mandatory qualifier for all locale expressions, including 'statespace' parent;
 wenzelm parents: 
61566diff
changeset | 482 | Terms in instantiations are from the context the locale expressions is | 
| 
6d5213bd9709
uniform mandatory qualifier for all locale expressions, including 'statespace' parent;
 wenzelm parents: 
61566diff
changeset | 483 | declared in. Local names may be added to this context with the optional | 
| 61665 | 484 | \<^theory_text>\<open>for\<close> clause. This is useful for shadowing names bound in outer contexts, | 
| 485 | and for declaring syntax. In addition, syntax declarations from one instance | |
| 486 | are effective when parsing subsequent instances of the same expression. | |
| 33846 | 487 | |
| 61606 
6d5213bd9709
uniform mandatory qualifier for all locale expressions, including 'statespace' parent;
 wenzelm parents: 
61566diff
changeset | 488 | Instances have an optional qualifier which applies to names in declarations. | 
| 
6d5213bd9709
uniform mandatory qualifier for all locale expressions, including 'statespace' parent;
 wenzelm parents: 
61566diff
changeset | 489 | Names include local definitions and theorem names. If present, the qualifier | 
| 
6d5213bd9709
uniform mandatory qualifier for all locale expressions, including 'statespace' parent;
 wenzelm parents: 
61566diff
changeset | 490 | itself is either mandatory (default) or non-mandatory (when followed by | 
| 
6d5213bd9709
uniform mandatory qualifier for all locale expressions, including 'statespace' parent;
 wenzelm parents: 
61566diff
changeset | 491 | ``\<^verbatim>\<open>?\<close>''). Non-mandatory means that the qualifier may be omitted on input. | 
| 
6d5213bd9709
uniform mandatory qualifier for all locale expressions, including 'statespace' parent;
 wenzelm parents: 
61566diff
changeset | 492 | Qualifiers only affect name spaces; they play no role in determining whether | 
| 
6d5213bd9709
uniform mandatory qualifier for all locale expressions, including 'statespace' parent;
 wenzelm parents: 
61566diff
changeset | 493 | one locale instance subsumes another. | 
| 67740 | 494 | |
| 495 | Rewrite clauses amend instances with equations that act as rewrite rules. | |
| 496 | This is particularly useful for changing concepts introduced through | |
| 497 | definitions. Rewrite clauses are available only in interpretation commands | |
| 498 |   (see \secref{sec:locale-interpretation} below) and must be proved the user.
 | |
| 58618 | 499 | \<close> | 
| 33846 | 500 | |
| 501 | ||
| 58618 | 502 | subsection \<open>Locale declarations\<close> | 
| 27040 | 503 | |
| 58618 | 504 | text \<open> | 
| 27040 | 505 |   \begin{matharray}{rcl}
 | 
| 61493 | 506 |     @{command_def "locale"} & : & \<open>theory \<rightarrow> local_theory\<close> \\
 | 
| 507 |     @{command_def "experiment"} & : & \<open>theory \<rightarrow> local_theory\<close> \\
 | |
| 508 |     @{command_def "print_locale"}\<open>\<^sup>*\<close> & : & \<open>context \<rightarrow>\<close> \\
 | |
| 509 |     @{command_def "print_locales"}\<open>\<^sup>*\<close> & : & \<open>context \<rightarrow>\<close> \\
 | |
| 510 |     @{command_def "locale_deps"}\<open>\<^sup>*\<close> & : & \<open>context \<rightarrow>\<close> \\
 | |
| 511 |     @{method_def intro_locales} & : & \<open>method\<close> \\
 | |
| 512 |     @{method_def unfold_locales} & : & \<open>method\<close> \\
 | |
| 27040 | 513 |   \end{matharray}
 | 
| 514 | ||
| 515 |   \indexisarelem{fixes}\indexisarelem{constrains}\indexisarelem{assumes}
 | |
| 28787 | 516 |   \indexisarelem{defines}\indexisarelem{notes}
 | 
| 55112 
b1a5d603fd12
prefer rail cartouche -- avoid back-slashed quotes;
 wenzelm parents: 
55029diff
changeset | 517 |   @{rail \<open>
 | 
| 42596 
6c621a9d612a
modernized rail diagrams using @{rail} antiquotation;
 wenzelm parents: 
41435diff
changeset | 518 |     @@{command locale} @{syntax name} ('=' @{syntax locale})? @'begin'?
 | 
| 27040 | 519 | ; | 
| 59901 | 520 |     @@{command experiment} (@{syntax context_elem}*) @'begin'
 | 
| 521 | ; | |
| 62969 | 522 |     @@{command print_locale} '!'? @{syntax name}
 | 
| 27040 | 523 | ; | 
| 59917 
9830c944670f
more uniform "verbose" option to print name space;
 wenzelm parents: 
59905diff
changeset | 524 |     @@{command print_locales} ('!'?)
 | 
| 
9830c944670f
more uniform "verbose" option to print name space;
 wenzelm parents: 
59905diff
changeset | 525 | ; | 
| 42617 | 526 |     @{syntax_def locale}: @{syntax context_elem}+ |
 | 
| 527 |       @{syntax locale_expr} ('+' (@{syntax context_elem}+))?
 | |
| 27040 | 528 | ; | 
| 42617 | 529 |     @{syntax_def context_elem}:
 | 
| 63285 | 530 |       @'fixes' @{syntax vars} |
 | 
| 42596 
6c621a9d612a
modernized rail diagrams using @{rail} antiquotation;
 wenzelm parents: 
41435diff
changeset | 531 |       @'constrains' (@{syntax name} '::' @{syntax type} + @'and') |
 | 
| 
6c621a9d612a
modernized rail diagrams using @{rail} antiquotation;
 wenzelm parents: 
41435diff
changeset | 532 |       @'assumes' (@{syntax props} + @'and') |
 | 
| 42705 | 533 |       @'defines' (@{syntax thmdecl}? @{syntax prop} @{syntax prop_pat}? + @'and') |
 | 
| 62969 | 534 |       @'notes' (@{syntax thmdef}? @{syntax thms} + @'and')
 | 
| 55112 
b1a5d603fd12
prefer rail cartouche -- avoid back-slashed quotes;
 wenzelm parents: 
55029diff
changeset | 535 | \<close>} | 
| 27040 | 536 | |
| 61665 | 537 | \<^descr> \<^theory_text>\<open>locale loc = import + body\<close> defines a new locale \<open>loc\<close> as a context | 
| 538 | consisting of a certain view of existing locales (\<open>import\<close>) plus some | |
| 539 | additional elements (\<open>body\<close>). Both \<open>import\<close> and \<open>body\<close> are optional; the | |
| 540 | degenerate form \<^theory_text>\<open>locale loc\<close> defines an empty locale, which may still be | |
| 541 | useful to collect declarations of facts later on. Type-inference on locale | |
| 542 | expressions automatically takes care of the most general typing that the | |
| 543 | combined context elements may acquire. | |
| 27040 | 544 | |
| 61664 | 545 |   The \<open>import\<close> consists of a locale expression; see \secref{sec:proof-context}
 | 
| 61665 | 546 | above. Its \<^theory_text>\<open>for\<close> clause defines the parameters of \<open>import\<close>. These are | 
| 547 | parameters of the defined locale. Locale parameters whose instantiation is | |
| 548 | omitted automatically extend the (possibly empty) \<^theory_text>\<open>for\<close> clause: they are | |
| 549 | inserted at its beginning. This means that these parameters may be referred | |
| 550 | to from within the expression and also in the subsequent context elements | |
| 551 | and provides a notational convenience for the inheritance of parameters in | |
| 552 | locale declarations. | |
| 27040 | 553 | |
| 61493 | 554 | The \<open>body\<close> consists of context elements. | 
| 27040 | 555 | |
| 61664 | 556 |     \<^descr> @{element "fixes"}~\<open>x :: \<tau> (mx)\<close> declares a local parameter of type \<open>\<tau>\<close>
 | 
| 557 | and mixfix annotation \<open>mx\<close> (both are optional). The special syntax | |
| 558 |     declaration ``\<open>(\<close>@{keyword_ref "structure"}\<open>)\<close>'' means that \<open>x\<close> may be
 | |
| 559 | referenced implicitly in this context. | |
| 27040 | 560 | |
| 61664 | 561 |     \<^descr> @{element "constrains"}~\<open>x :: \<tau>\<close> introduces a type constraint \<open>\<tau>\<close> on the
 | 
| 562 | local parameter \<open>x\<close>. This element is deprecated. The type constraint | |
| 61665 | 563 |     should be introduced in the \<^theory_text>\<open>for\<close> clause or the relevant @{element
 | 
| 564 | "fixes"} element. | |
| 27040 | 565 | |
| 61664 | 566 |     \<^descr> @{element "assumes"}~\<open>a: \<phi>\<^sub>1 \<dots> \<phi>\<^sub>n\<close> introduces local premises, similar
 | 
| 61665 | 567 |     to \<^theory_text>\<open>assume\<close> within a proof (cf.\ \secref{sec:proof-context}).
 | 
| 27040 | 568 | |
| 61664 | 569 |     \<^descr> @{element "defines"}~\<open>a: x \<equiv> t\<close> defines a previously declared parameter.
 | 
| 63039 | 570 | This is similar to \<^theory_text>\<open>define\<close> within a proof (cf.\ | 
| 571 |     \secref{sec:proof-context}), but @{element "defines"} is restricted to
 | |
| 572 | Pure equalities and the defined variable needs to be declared beforehand | |
| 573 |     via @{element "fixes"}. The left-hand side of the equation may have
 | |
| 574 |     additional arguments, e.g.\ ``@{element "defines"}~\<open>f x\<^sub>1 \<dots> x\<^sub>n \<equiv> t\<close>'',
 | |
| 575 | which need to be free in the context. | |
| 27040 | 576 | |
| 61664 | 577 |     \<^descr> @{element "notes"}~\<open>a = b\<^sub>1 \<dots> b\<^sub>n\<close> reconsiders facts within a local
 | 
| 578 | context. Most notably, this may include arbitrary declarations in any | |
| 579 |     attribute specifications included here, e.g.\ a local @{attribute simp}
 | |
| 580 | rule. | |
| 27040 | 581 | |
| 61664 | 582 |   Both @{element "assumes"} and @{element "defines"} elements contribute to
 | 
| 583 | the locale specification. When defining an operation derived from the | |
| 61665 | 584 |   parameters, \<^theory_text>\<open>definition\<close> (\secref{sec:term-definitions}) is usually more
 | 
| 585 | appropriate. | |
| 65491 
7fb81fa1d668
more uniform thy_deps (like class_deps), see also c48d536231fe;
 wenzelm parents: 
63680diff
changeset | 586 | |
| 61665 | 587 |   Note that ``\<^theory_text>\<open>(is p\<^sub>1 \<dots> p\<^sub>n)\<close>'' patterns given in the syntax of @{element
 | 
| 61664 | 588 |   "assumes"} and @{element "defines"} above are illegal in locale definitions.
 | 
| 589 |   In the long goal format of \secref{sec:goals}, term bindings may be included
 | |
| 590 | as expected, though. | |
| 65491 
7fb81fa1d668
more uniform thy_deps (like class_deps), see also c48d536231fe;
 wenzelm parents: 
63680diff
changeset | 591 | |
| 61421 | 592 | \<^medskip> | 
| 61664 | 593 | Locale specifications are ``closed up'' by turning the given text into a | 
| 594 | predicate definition \<open>loc_axioms\<close> and deriving the original assumptions as | |
| 595 | local lemmas (modulo local definitions). The predicate statement covers only | |
| 596 | the newly specified assumptions, omitting the content of included locale | |
| 597 | expressions. The full cumulative view is only provided on export, involving | |
| 598 | another predicate \<open>loc\<close> that refers to the complete specification text. | |
| 65491 
7fb81fa1d668
more uniform thy_deps (like class_deps), see also c48d536231fe;
 wenzelm parents: 
63680diff
changeset | 599 | |
| 61664 | 600 | In any case, the predicate arguments are those locale parameters that | 
| 601 | actually occur in the respective piece of text. Also these predicates | |
| 602 | operate at the meta-level in theory, but the locale packages attempts to | |
| 603 | internalize statements according to the object-logic setup (e.g.\ replacing | |
| 604 |   \<open>\<And>\<close> by \<open>\<forall>\<close>, and \<open>\<Longrightarrow>\<close> by \<open>\<longrightarrow>\<close> in HOL; see also \secref{sec:object-logic}).
 | |
| 605 | Separate introduction rules \<open>loc_axioms.intro\<close> and \<open>loc.intro\<close> are provided | |
| 606 | as well. | |
| 59901 | 607 | |
| 61665 | 608 | \<^descr> \<^theory_text>\<open>experiment exprs begin\<close> opens an anonymous locale context with private | 
| 609 | naming policy. Specifications in its body are inaccessible from outside. | |
| 610 | This is useful to perform experiments, without polluting the name space. | |
| 59901 | 611 | |
| 61665 | 612 | \<^descr> \<^theory_text>\<open>print_locale locale\<close> prints the contents of the named locale. The | 
| 613 |   command omits @{element "notes"} elements by default. Use \<^theory_text>\<open>print_locale!\<close>
 | |
| 614 | to have them included. | |
| 27040 | 615 | |
| 61665 | 616 | \<^descr> \<^theory_text>\<open>print_locales\<close> prints the names of all locales of the current theory; | 
| 617 | the ``\<open>!\<close>'' option indicates extra verbosity. | |
| 27040 | 618 | |
| 61665 | 619 | \<^descr> \<^theory_text>\<open>locale_deps\<close> visualizes all locales and their relations as a Hasse | 
| 620 |   diagram. This includes locales defined as type classes (\secref{sec:class}).
 | |
| 621 | See also \<^theory_text>\<open>print_dependencies\<close> below. | |
| 50716 | 622 | |
| 61664 | 623 |   \<^descr> @{method intro_locales} and @{method unfold_locales} repeatedly expand all
 | 
| 624 |   introduction rules of locale predicates of the theory. While @{method
 | |
| 625 | intro_locales} only applies the \<open>loc.intro\<close> introduction rules and therefore | |
| 626 |   does not descend to assumptions, @{method unfold_locales} is more aggressive
 | |
| 627 | and applies \<open>loc_axioms.intro\<close> as well. Both methods are aware of locale | |
| 628 | specifications entailed by the context, both from target statements, and | |
| 629 | from interpretations (see below). New goals that are entailed by the current | |
| 630 | context are discharged automatically. | |
| 58618 | 631 | \<close> | 
| 27040 | 632 | |
| 633 | ||
| 67740 | 634 | subsection \<open>Locale interpretation \label{sec:locale-interpretation}\<close>
 | 
| 27040 | 635 | |
| 58618 | 636 | text \<open> | 
| 27040 | 637 |   \begin{matharray}{rcl}
 | 
| 61673 
fd4ac1530d63
represent both algebraic and local-theory views on locale interpretation in interfaces
 haftmann parents: 
61671diff
changeset | 638 |     @{command "interpretation"} & : & \<open>local_theory \<rightarrow> proof(prove)\<close> \\
 | 
| 61493 | 639 |     @{command_def "interpret"} & : & \<open>proof(state) | proof(chain) \<rightarrow> proof(prove)\<close> \\
 | 
| 61891 
76189756ff65
documentation on last state of the art concerning interpretation
 haftmann parents: 
61853diff
changeset | 640 |     @{command_def "global_interpretation"} & : & \<open>theory | local_theory \<rightarrow> proof(prove)\<close> \\
 | 
| 61493 | 641 |     @{command_def "sublocale"} & : & \<open>theory | local_theory \<rightarrow> proof(prove)\<close> \\
 | 
| 642 |     @{command_def "print_dependencies"}\<open>\<^sup>*\<close> & : & \<open>context \<rightarrow>\<close> \\
 | |
| 61673 
fd4ac1530d63
represent both algebraic and local-theory views on locale interpretation in interfaces
 haftmann parents: 
61671diff
changeset | 643 |     @{command_def "print_interps"}\<open>\<^sup>*\<close> & :  & \<open>context \<rightarrow>\<close> \\
 | 
| 27040 | 644 |   \end{matharray}
 | 
| 645 | ||
| 61664 | 646 | Locales may be instantiated, and the resulting instantiated declarations | 
| 647 | added to the current context. This requires proof (of the instantiated | |
| 61706 | 648 | specification) and is called \<^emph>\<open>locale interpretation\<close>. Interpretation is | 
| 649 | possible within arbitrary local theories (\<^theory_text>\<open>interpretation\<close>), within proof | |
| 61891 
76189756ff65
documentation on last state of the art concerning interpretation
 haftmann parents: 
61853diff
changeset | 650 | bodies (\<^theory_text>\<open>interpret\<close>), into global theories (\<^theory_text>\<open>global_interpretation\<close>) and | 
| 
76189756ff65
documentation on last state of the art concerning interpretation
 haftmann parents: 
61853diff
changeset | 651 | into locales (\<^theory_text>\<open>sublocale\<close>). | 
| 47483 | 652 | |
| 55112 
b1a5d603fd12
prefer rail cartouche -- avoid back-slashed quotes;
 wenzelm parents: 
55029diff
changeset | 653 |   @{rail \<open>
 | 
| 67740 | 654 |     @@{command interpretation} @{syntax locale_expr}
 | 
| 27040 | 655 | ; | 
| 67740 | 656 |     @@{command interpret} @{syntax locale_expr}
 | 
| 27040 | 657 | ; | 
| 67764 | 658 |     @@{command global_interpretation} @{syntax locale_expr} definitions?
 | 
| 61673 
fd4ac1530d63
represent both algebraic and local-theory views on locale interpretation in interfaces
 haftmann parents: 
61671diff
changeset | 659 | ; | 
| 62969 | 660 |     @@{command sublocale} (@{syntax name} ('<' | '\<subseteq>'))? @{syntax locale_expr} \<newline>
 | 
| 67764 | 661 | definitions? | 
| 61673 
fd4ac1530d63
represent both algebraic and local-theory views on locale interpretation in interfaces
 haftmann parents: 
61671diff
changeset | 662 | ; | 
| 42617 | 663 |     @@{command print_dependencies} '!'? @{syntax locale_expr}
 | 
| 27040 | 664 | ; | 
| 62969 | 665 |     @@{command print_interps} @{syntax name}
 | 
| 41434 
710cdb9e0d17
Documentation for 'interpret' and 'sublocale' with mixins.
 ballarin parents: 
41249diff
changeset | 666 | ; | 
| 42596 
6c621a9d612a
modernized rail diagrams using @{rail} antiquotation;
 wenzelm parents: 
41435diff
changeset | 667 | |
| 61673 
fd4ac1530d63
represent both algebraic and local-theory views on locale interpretation in interfaces
 haftmann parents: 
61671diff
changeset | 668 |     definitions: @'defines' (@{syntax thmdecl}? @{syntax name} \<newline>
 | 
| 
fd4ac1530d63
represent both algebraic and local-theory views on locale interpretation in interfaces
 haftmann parents: 
61671diff
changeset | 669 |       @{syntax mixfix}? @'=' @{syntax term} + @'and');
 | 
| 55112 
b1a5d603fd12
prefer rail cartouche -- avoid back-slashed quotes;
 wenzelm parents: 
55029diff
changeset | 670 | \<close>} | 
| 27040 | 671 | |
| 61706 | 672 | The core of each interpretation command is a locale expression \<open>expr\<close>; the | 
| 673 | command generates proof obligations for the instantiated specifications. | |
| 674 | Once these are discharged by the user, instantiated declarations (in | |
| 675 | particular, facts) are added to the context in a post-processing phase, in a | |
| 676 | manner specific to each command. | |
| 53368 
92b9965f479d
Clarifies documentation of interpretation in local theories.
 ballarin parents: 
53015diff
changeset | 677 | |
| 61706 | 678 | Interpretation commands are aware of interpretations that are already | 
| 679 | active: post-processing is achieved through a variant of roundup that takes | |
| 61664 | 680 | interpretations of the current global or local theory into account. In order | 
| 681 | to simplify the proof obligations according to existing interpretations use | |
| 682 |   methods @{method intro_locales} or @{method unfold_locales}.
 | |
| 53368 
92b9965f479d
Clarifies documentation of interpretation in local theories.
 ballarin parents: 
53015diff
changeset | 683 | |
| 67764 | 684 | Rewrites clauses \<^theory_text>\<open>rewrites eqns\<close> occur within expressions. They amend the | 
| 685 | morphism through which a locale instance is interpreted with rewrite rules, | |
| 686 | also called rewrite morphisms. This is particularly useful for interpreting | |
| 687 | concepts introduced through definitions. The equations must be proved the | |
| 688 | user. To enable syntax of the instantiated locale within the equation, while | |
| 689 | reading a locale expression, equations of a locale instance are read in a | |
| 690 | temporary context where the instance is already activated. If activation | |
| 691 | fails, typically due to duplicate constant declarations, processing falls | |
| 692 | back to reading the equation first. | |
| 61673 
fd4ac1530d63
represent both algebraic and local-theory views on locale interpretation in interfaces
 haftmann parents: 
61671diff
changeset | 693 | |
| 61706 | 694 | Given definitions \<open>defs\<close> produce corresponding definitions in the local | 
| 67740 | 695 | theory's underlying target \<^emph>\<open>and\<close> amend the morphism with rewrite rules | 
| 61891 
76189756ff65
documentation on last state of the art concerning interpretation
 haftmann parents: 
61853diff
changeset | 696 | stemming from the symmetric of those definitions. Hence these need not be | 
| 61706 | 697 | proved explicitly the user. Such rewrite definitions are a even more useful | 
| 698 | device for interpreting concepts introduced through definitions, but they | |
| 699 | are only supported for interpretation commands operating in a local theory | |
| 61823 | 700 | whose implementing target actually supports this. Note that despite | 
| 701 | the suggestive \<^theory_text>\<open>and\<close> connective, \<open>defs\<close> | |
| 61891 
76189756ff65
documentation on last state of the art concerning interpretation
 haftmann parents: 
61853diff
changeset | 702 | are processed sequentially without mutual recursion. | 
| 61673 
fd4ac1530d63
represent both algebraic and local-theory views on locale interpretation in interfaces
 haftmann parents: 
61671diff
changeset | 703 | |
| 67740 | 704 | \<^descr> \<^theory_text>\<open>interpretation expr\<close> interprets \<open>expr\<close> into a local theory | 
| 61706 | 705 | such that its lifetime is limited to the current context block (e.g. a | 
| 706 |   locale or unnamed context). At the closing @{command end} of the block the
 | |
| 707 | interpretation and its declarations disappear. Hence facts based on | |
| 708 | interpretation can be established without creating permanent links to the | |
| 709 |   interpreted locale instances, as would be the case with @{command
 | |
| 710 | sublocale}. | |
| 61673 
fd4ac1530d63
represent both algebraic and local-theory views on locale interpretation in interfaces
 haftmann parents: 
61671diff
changeset | 711 | |
| 61891 
76189756ff65
documentation on last state of the art concerning interpretation
 haftmann parents: 
61853diff
changeset | 712 | When used on the level of a global theory, there is no end of a current | 
| 
76189756ff65
documentation on last state of the art concerning interpretation
 haftmann parents: 
61853diff
changeset | 713 | context block, hence \<^theory_text>\<open>interpretation\<close> behaves identically to | 
| 
76189756ff65
documentation on last state of the art concerning interpretation
 haftmann parents: 
61853diff
changeset | 714 | \<^theory_text>\<open>global_interpretation\<close> then. | 
| 
76189756ff65
documentation on last state of the art concerning interpretation
 haftmann parents: 
61853diff
changeset | 715 | |
| 67740 | 716 | \<^descr> \<^theory_text>\<open>interpret expr\<close> interprets \<open>expr\<close> into a proof context: | 
| 61706 | 717 | the interpretation and its declarations disappear when closing the current | 
| 718 | proof block. Note that for \<^theory_text>\<open>interpret\<close> the \<open>eqns\<close> should be explicitly | |
| 719 | universally quantified. | |
| 61673 
fd4ac1530d63
represent both algebraic and local-theory views on locale interpretation in interfaces
 haftmann parents: 
61671diff
changeset | 720 | |
| 67764 | 721 | \<^descr> \<^theory_text>\<open>global_interpretation defines defs\<close> interprets \<open>expr\<close> | 
| 61891 
76189756ff65
documentation on last state of the art concerning interpretation
 haftmann parents: 
61853diff
changeset | 722 | into a global theory. | 
| 61673 
fd4ac1530d63
represent both algebraic and local-theory views on locale interpretation in interfaces
 haftmann parents: 
61671diff
changeset | 723 | |
| 53369 
b4bcac7d065b
Clarifies that interpretation does not only apply to facts, but to declaratoins in general.
 ballarin parents: 
53368diff
changeset | 724 | When adding declarations to locales, interpreted versions of these | 
| 61664 | 725 | declarations are added to the global theory for all interpretations in the | 
| 61891 
76189756ff65
documentation on last state of the art concerning interpretation
 haftmann parents: 
61853diff
changeset | 726 | global theory as well. That is, interpretations into global theories | 
| 61664 | 727 | dynamically participate in any declarations added to locales. | 
| 54049 | 728 | |
| 61664 | 729 | Free variables in the interpreted expression are allowed. They are turned | 
| 730 | into schematic variables in the generated declarations. In order to use a | |
| 731 | free variable whose name is already bound in the context --- for example, | |
| 61665 | 732 | because a constant of that name exists --- add it to the \<^theory_text>\<open>for\<close> clause. | 
| 48824 
45d0e40b07af
Clarification: free variables allowed in interpreted locale instances.
 ballarin parents: 
47484diff
changeset | 733 | |
| 67764 | 734 | \<^descr> \<^theory_text>\<open>sublocale name \<subseteq> expr defines defs\<close> interprets \<open>expr\<close> | 
| 61706 | 735 | into the locale \<open>name\<close>. A proof that the specification of \<open>name\<close> implies the | 
| 736 | specification of \<open>expr\<close> is required. As in the localized version of the | |
| 737 | theorem command, the proof is in the context of \<open>name\<close>. After the proof | |
| 738 | obligation has been discharged, the locale hierarchy is changed as if \<open>name\<close> | |
| 739 | imported \<open>expr\<close> (hence the name \<^theory_text>\<open>sublocale\<close>). When the context of \<open>name\<close> is | |
| 740 | subsequently entered, traversing the locale hierarchy will involve the | |
| 741 | locale instances of \<open>expr\<close>, and their declarations will be added to the | |
| 742 | context. This makes \<^theory_text>\<open>sublocale\<close> dynamic: extensions of a locale that is | |
| 743 | instantiated in \<open>expr\<close> may take place after the \<^theory_text>\<open>sublocale\<close> declaration and | |
| 744 | still become available in the context. Circular \<^theory_text>\<open>sublocale\<close> declarations | |
| 745 | are allowed as long as they do not lead to infinite chains. | |
| 41434 
710cdb9e0d17
Documentation for 'interpret' and 'sublocale' with mixins.
 ballarin parents: 
41249diff
changeset | 746 | |
| 61664 | 747 | If interpretations of \<open>name\<close> exist in the current global theory, the command | 
| 748 | adds interpretations for \<open>expr\<close> as well, with the same qualifier, although | |
| 749 | only for fragments of \<open>expr\<close> that are not interpreted in the theory already. | |
| 41434 
710cdb9e0d17
Documentation for 'interpret' and 'sublocale' with mixins.
 ballarin parents: 
41249diff
changeset | 750 | |
| 67764 | 751 | Rewrites clauses in the expression or rewrite definitions \<open>defs\<close> can help break | 
| 67740 | 752 | infinite chains induced by circular \<^theory_text>\<open>sublocale\<close> declarations. | 
| 27040 | 753 | |
| 61665 | 754 | In a named context block the \<^theory_text>\<open>sublocale\<close> command may also be used, but the | 
| 755 | locale argument must be omitted. The command then refers to the locale (or | |
| 756 | class) target of the context block. | |
| 51747 | 757 | |
| 61665 | 758 | \<^descr> \<^theory_text>\<open>print_dependencies expr\<close> is useful for understanding the effect of an | 
| 759 | interpretation of \<open>expr\<close> in the current context. It lists all locale | |
| 760 | instances for which interpretations would be added to the current context. | |
| 761 | Variant \<^theory_text>\<open>print_dependencies!\<close> does not generalize parameters and assumes an | |
| 762 | empty context --- that is, it prints all locale instances that would be | |
| 763 | considered for interpretation. The latter is useful for understanding the | |
| 764 | dependencies of a locale expression. | |
| 41435 | 765 | |
| 61665 | 766 | \<^descr> \<^theory_text>\<open>print_interps locale\<close> lists all interpretations of \<open>locale\<close> in the | 
| 767 | current theory or proof context, including those due to a combination of an | |
| 768 | \<^theory_text>\<open>interpretation\<close> or \<^theory_text>\<open>interpret\<close> and one or several \<^theory_text>\<open>sublocale\<close> | |
| 769 | declarations. | |
| 33867 | 770 | |
| 27040 | 771 |   \begin{warn}
 | 
| 61664 | 772 | If a global theory inherits declarations (body elements) for a locale from | 
| 773 | one parent and an interpretation of that locale from another parent, the | |
| 774 | interpretation will not be applied to the declarations. | |
| 54049 | 775 |   \end{warn}
 | 
| 776 | ||
| 777 |   \begin{warn}
 | |
| 61664 | 778 | Since attributes are applied to interpreted theorems, interpretation may | 
| 779 | modify the context of common proof tools, e.g.\ the Simplifier or | |
| 61665 | 780 | Classical Reasoner. As the behaviour of such tools is \<^emph>\<open>not\<close> stable under | 
| 61664 | 781 | interpretation morphisms, manual declarations might have to be added to | 
| 782 | the target context of the interpretation to revert such declarations. | |
| 27040 | 783 |   \end{warn}
 | 
| 784 | ||
| 785 |   \begin{warn}
 | |
| 51747 | 786 | An interpretation in a local theory or proof context may subsume previous | 
| 61664 | 787 | interpretations. This happens if the same specification fragment is | 
| 788 | interpreted twice and the instantiation of the second interpretation is | |
| 789 | more general than the interpretation of the first. The locale package does | |
| 790 | not attempt to remove subsumed interpretations. | |
| 27040 | 791 |   \end{warn}
 | 
| 792 | ||
| 61673 
fd4ac1530d63
represent both algebraic and local-theory views on locale interpretation in interfaces
 haftmann parents: 
61671diff
changeset | 793 |   \begin{warn}
 | 
| 
fd4ac1530d63
represent both algebraic and local-theory views on locale interpretation in interfaces
 haftmann parents: 
61671diff
changeset | 794 | While \<^theory_text>\<open>interpretation (in c) \<dots>\<close> is admissible, it is not useful since | 
| 
fd4ac1530d63
represent both algebraic and local-theory views on locale interpretation in interfaces
 haftmann parents: 
61671diff
changeset | 795 | its result is discarded immediately. | 
| 
fd4ac1530d63
represent both algebraic and local-theory views on locale interpretation in interfaces
 haftmann parents: 
61671diff
changeset | 796 |   \end{warn}
 | 
| 59003 
16d92d37a8a1
documentation stubs about permanent_interpretation
 haftmann parents: 
58724diff
changeset | 797 | \<close> | 
| 
16d92d37a8a1
documentation stubs about permanent_interpretation
 haftmann parents: 
58724diff
changeset | 798 | |
| 
16d92d37a8a1
documentation stubs about permanent_interpretation
 haftmann parents: 
58724diff
changeset | 799 | |
| 58618 | 800 | section \<open>Classes \label{sec:class}\<close>
 | 
| 27040 | 801 | |
| 58618 | 802 | text \<open> | 
| 27040 | 803 |   \begin{matharray}{rcl}
 | 
| 61493 | 804 |     @{command_def "class"} & : & \<open>theory \<rightarrow> local_theory\<close> \\
 | 
| 805 |     @{command_def "instantiation"} & : & \<open>theory \<rightarrow> local_theory\<close> \\
 | |
| 806 |     @{command_def "instance"} & : & \<open>local_theory \<rightarrow> local_theory\<close> \\
 | |
| 807 |     @{command "instance"} & : & \<open>theory \<rightarrow> proof(prove)\<close> \\
 | |
| 808 |     @{command_def "subclass"} & : & \<open>local_theory \<rightarrow> local_theory\<close> \\
 | |
| 809 |     @{command_def "print_classes"}\<open>\<^sup>*\<close> & : & \<open>context \<rightarrow>\<close> \\
 | |
| 810 |     @{command_def "class_deps"}\<open>\<^sup>*\<close> & : & \<open>context \<rightarrow>\<close> \\
 | |
| 811 |     @{method_def intro_classes} & : & \<open>method\<close> \\
 | |
| 27040 | 812 |   \end{matharray}
 | 
| 813 | ||
| 61664 | 814 | A class is a particular locale with \<^emph>\<open>exactly one\<close> type variable \<open>\<alpha>\<close>. Beyond | 
| 815 | the underlying locale, a corresponding type class is established which is | |
| 816 |   interpreted logically as axiomatic type class @{cite "Wenzel:1997:TPHOL"}
 | |
| 817 | whose logical content are the assumptions of the locale. Thus, classes | |
| 818 | provide the full generality of locales combined with the commodity of type | |
| 819 |   classes (notably type-inference). See @{cite "isabelle-classes"} for a short
 | |
| 47483 | 820 | tutorial. | 
| 821 | ||
| 55112 
b1a5d603fd12
prefer rail cartouche -- avoid back-slashed quotes;
 wenzelm parents: 
55029diff
changeset | 822 |   @{rail \<open>
 | 
| 42704 | 823 |     @@{command class} class_spec @'begin'?
 | 
| 824 | ; | |
| 825 |     class_spec: @{syntax name} '='
 | |
| 62969 | 826 |       ((@{syntax name} '+' (@{syntax context_elem}+)) |
 | 
| 827 |         @{syntax name} | (@{syntax context_elem}+))
 | |
| 27040 | 828 | ; | 
| 62969 | 829 |     @@{command instantiation} (@{syntax name} + @'and') '::' @{syntax arity} @'begin'
 | 
| 27040 | 830 | ; | 
| 62969 | 831 |     @@{command instance} (() | (@{syntax name} + @'and') '::' @{syntax arity} |
 | 
| 832 |       @{syntax name} ('<' | '\<subseteq>') @{syntax name} )
 | |
| 31681 | 833 | ; | 
| 62969 | 834 |     @@{command subclass} @{syntax name}
 | 
| 58202 | 835 | ; | 
| 60091 | 836 |     @@{command class_deps} (class_bounds class_bounds?)?
 | 
| 60090 | 837 | ; | 
| 60091 | 838 |     class_bounds: @{syntax sort} | '(' (@{syntax sort} + @'|') ')'
 | 
| 55112 
b1a5d603fd12
prefer rail cartouche -- avoid back-slashed quotes;
 wenzelm parents: 
55029diff
changeset | 839 | \<close>} | 
| 27040 | 840 | |
| 61665 | 841 | \<^descr> \<^theory_text>\<open>class c = superclasses + body\<close> defines a new class \<open>c\<close>, inheriting from | 
| 842 | \<open>superclasses\<close>. This introduces a locale \<open>c\<close> with import of all locales | |
| 843 | \<open>superclasses\<close>. | |
| 27040 | 844 | |
| 61664 | 845 |   Any @{element "fixes"} in \<open>body\<close> are lifted to the global theory level
 | 
| 846 | (\<^emph>\<open>class operations\<close> \<open>f\<^sub>1, \<dots>, f\<^sub>n\<close> of class \<open>c\<close>), mapping the local type | |
| 847 | parameter \<open>\<alpha>\<close> to a schematic type variable \<open>?\<alpha> :: c\<close>. | |
| 27040 | 848 | |
| 61664 | 849 |   Likewise, @{element "assumes"} in \<open>body\<close> are also lifted, mapping each local
 | 
| 850 | parameter \<open>f :: \<tau>[\<alpha>]\<close> to its corresponding global constant \<open>f :: \<tau>[?\<alpha> :: | |
| 851 | c]\<close>. The corresponding introduction rule is provided as | |
| 852 | \<open>c_class_axioms.intro\<close>. This rule should be rarely needed directly --- the | |
| 853 |   @{method intro_classes} method takes care of the details of class membership
 | |
| 854 | proofs. | |
| 27040 | 855 | |
| 61665 | 856 | \<^descr> \<^theory_text>\<open>instantiation t :: (s\<^sub>1, \<dots>, s\<^sub>n)s begin\<close> opens a target (cf.\ | 
| 857 |   \secref{sec:target}) which allows to specify class operations \<open>f\<^sub>1, \<dots>, f\<^sub>n\<close>
 | |
| 858 | corresponding to sort \<open>s\<close> at the particular type instance \<open>(\<alpha>\<^sub>1 :: s\<^sub>1, \<dots>, | |
| 859 | \<alpha>\<^sub>n :: s\<^sub>n) t\<close>. A plain \<^theory_text>\<open>instance\<close> command in the target body poses a goal | |
| 860 |   stating these type arities. The target is concluded by an @{command_ref
 | |
| 861 | (local) "end"} command. | |
| 27040 | 862 | |
| 61664 | 863 | Note that a list of simultaneous type constructors may be given; this | 
| 864 | corresponds nicely to mutually recursive type definitions, e.g.\ in | |
| 865 | Isabelle/HOL. | |
| 27040 | 866 | |
| 61665 | 867 | \<^descr> \<^theory_text>\<open>instance\<close> in an instantiation target body sets up a goal stating the | 
| 868 | type arities claimed at the opening \<^theory_text>\<open>instantiation\<close>. The proof would | |
| 869 |   usually proceed by @{method intro_classes}, and then establish the
 | |
| 870 | characteristic theorems of the type classes involved. After finishing the | |
| 871 | proof, the background theory will be augmented by the proven type arities. | |
| 31681 | 872 | |
| 61665 | 873 | On the theory level, \<^theory_text>\<open>instance t :: (s\<^sub>1, \<dots>, s\<^sub>n)s\<close> provides a convenient | 
| 874 | way to instantiate a type class with no need to specify operations: one can | |
| 875 | continue with the instantiation proof immediately. | |
| 27040 | 876 | |
| 61665 | 877 | \<^descr> \<^theory_text>\<open>subclass c\<close> in a class context for class \<open>d\<close> sets up a goal stating that | 
| 878 | class \<open>c\<close> is logically contained in class \<open>d\<close>. After finishing the proof, | |
| 879 | class \<open>d\<close> is proven to be subclass \<open>c\<close> and the locale \<open>c\<close> is interpreted | |
| 880 | into \<open>d\<close> simultaneously. | |
| 31681 | 881 | |
| 61664 | 882 |   A weakened form of this is available through a further variant of @{command
 | 
| 61665 | 883 | instance}: \<^theory_text>\<open>instance c\<^sub>1 \<subseteq> c\<^sub>2\<close> opens a proof that class \<open>c\<^sub>2\<close> implies | 
| 884 | \<open>c\<^sub>1\<close> without reference to the underlying locales; this is useful if the | |
| 885 | properties to prove the logical connection are not sufficient on the locale | |
| 886 | level but on the theory level. | |
| 61664 | 887 | |
| 61665 | 888 | \<^descr> \<^theory_text>\<open>print_classes\<close> prints all classes in the current theory. | 
| 27040 | 889 | |
| 61665 | 890 | \<^descr> \<^theory_text>\<open>class_deps\<close> visualizes classes and their subclass relations as a | 
| 891 | directed acyclic graph. By default, all classes from the current theory | |
| 61664 | 892 | context are show. This may be restricted by optional bounds as follows: | 
| 61665 | 893 | \<^theory_text>\<open>class_deps upper\<close> or \<^theory_text>\<open>class_deps upper lower\<close>. A class is visualized, iff | 
| 894 | it is a subclass of some sort from \<open>upper\<close> and a superclass of some sort | |
| 895 | from \<open>lower\<close>. | |
| 29706 | 896 | |
| 61664 | 897 |   \<^descr> @{method intro_classes} repeatedly expands all class introduction rules of
 | 
| 898 | this theory. Note that this method usually needs not be named explicitly, as | |
| 61665 | 899 | it is already included in the default proof step (e.g.\ of \<^theory_text>\<open>proof\<close>). In | 
| 900 | particular, instantiation of trivial (syntactic) classes may be performed by | |
| 901 | a single ``\<^theory_text>\<open>..\<close>'' proof step. | |
| 58618 | 902 | \<close> | 
| 26870 | 903 | |
| 27040 | 904 | |
| 58618 | 905 | subsection \<open>The class target\<close> | 
| 27040 | 906 | |
| 58618 | 907 | text \<open> | 
| 27040 | 908 | %FIXME check | 
| 909 | ||
| 61664 | 910 |   A named context may refer to a locale (cf.\ \secref{sec:target}). If this
 | 
| 911 | locale is also a class \<open>c\<close>, apart from the common locale target behaviour | |
| 912 | the following happens. | |
| 27040 | 913 | |
| 61664 | 914 | \<^item> Local constant declarations \<open>g[\<alpha>]\<close> referring to the local type parameter | 
| 915 | \<open>\<alpha>\<close> and local parameters \<open>f[\<alpha>]\<close> are accompanied by theory-level constants | |
| 916 | \<open>g[?\<alpha> :: c]\<close> referring to theory-level class operations \<open>f[?\<alpha> :: c]\<close>. | |
| 27040 | 917 | |
| 61664 | 918 | \<^item> Local theorem bindings are lifted as are assumptions. | 
| 27040 | 919 | |
| 61664 | 920 | \<^item> Local syntax refers to local operations \<open>g[\<alpha>]\<close> and global operations | 
| 921 | \<open>g[?\<alpha> :: c]\<close> uniformly. Type inference resolves ambiguities. In rare | |
| 922 | cases, manual type annotations are needed. | |
| 58618 | 923 | \<close> | 
| 27040 | 924 | |
| 925 | ||
| 58618 | 926 | subsection \<open>Co-regularity of type classes and arities\<close> | 
| 37768 
e86221f3bac7
moved co-regularity to class section; avoid duplicated class_deps
 haftmann parents: 
37112diff
changeset | 927 | |
| 61664 | 928 | text \<open> | 
| 929 | The class relation together with the collection of type-constructor arities | |
| 930 | must obey the principle of \<^emph>\<open>co-regularity\<close> as defined below. | |
| 37768 
e86221f3bac7
moved co-regularity to class section; avoid duplicated class_deps
 haftmann parents: 
37112diff
changeset | 931 | |
| 61421 | 932 | \<^medskip> | 
| 61664 | 933 | For the subsequent formulation of co-regularity we assume that the class | 
| 934 | relation is closed by transitivity and reflexivity. Moreover the collection | |
| 935 | of arities \<open>t :: (\<^vec>s)c\<close> is completed such that \<open>t :: (\<^vec>s)c\<close> and | |
| 936 | \<open>c \<subseteq> c'\<close> implies \<open>t :: (\<^vec>s)c'\<close> for all such declarations. | |
| 37768 
e86221f3bac7
moved co-regularity to class section; avoid duplicated class_deps
 haftmann parents: 
37112diff
changeset | 937 | |
| 61664 | 938 | Treating sorts as finite sets of classes (meaning the intersection), the | 
| 939 | class relation \<open>c\<^sub>1 \<subseteq> c\<^sub>2\<close> is extended to sorts as follows: | |
| 37768 
e86221f3bac7
moved co-regularity to class section; avoid duplicated class_deps
 haftmann parents: 
37112diff
changeset | 940 | \[ | 
| 61493 | 941 | \<open>s\<^sub>1 \<subseteq> s\<^sub>2 \<equiv> \<forall>c\<^sub>2 \<in> s\<^sub>2. \<exists>c\<^sub>1 \<in> s\<^sub>1. c\<^sub>1 \<subseteq> c\<^sub>2\<close> | 
| 37768 
e86221f3bac7
moved co-regularity to class section; avoid duplicated class_deps
 haftmann parents: 
37112diff
changeset | 942 | \] | 
| 
e86221f3bac7
moved co-regularity to class section; avoid duplicated class_deps
 haftmann parents: 
37112diff
changeset | 943 | |
| 61664 | 944 | This relation on sorts is further extended to tuples of sorts (of the same | 
| 945 | length) in the component-wise way. | |
| 37768 
e86221f3bac7
moved co-regularity to class section; avoid duplicated class_deps
 haftmann parents: 
37112diff
changeset | 946 | |
| 61421 | 947 | \<^medskip> | 
| 61664 | 948 | Co-regularity of the class relation together with the arities relation | 
| 949 | means: | |
| 37768 
e86221f3bac7
moved co-regularity to class section; avoid duplicated class_deps
 haftmann parents: 
37112diff
changeset | 950 | \[ | 
| 61493 | 951 | \<open>t :: (\<^vec>s\<^sub>1)c\<^sub>1 \<Longrightarrow> t :: (\<^vec>s\<^sub>2)c\<^sub>2 \<Longrightarrow> c\<^sub>1 \<subseteq> c\<^sub>2 \<Longrightarrow> \<^vec>s\<^sub>1 \<subseteq> \<^vec>s\<^sub>2\<close> | 
| 37768 
e86221f3bac7
moved co-regularity to class section; avoid duplicated class_deps
 haftmann parents: 
37112diff
changeset | 952 | \] | 
| 61664 | 953 | for all such arities. In other words, whenever the result classes of some | 
| 954 | type-constructor arities are related, then the argument sorts need to be | |
| 955 | related in the same way. | |
| 37768 
e86221f3bac7
moved co-regularity to class section; avoid duplicated class_deps
 haftmann parents: 
37112diff
changeset | 956 | |
| 61421 | 957 | \<^medskip> | 
| 61664 | 958 | Co-regularity is a very fundamental property of the order-sorted algebra of | 
| 959 | types. For example, it entails principle types and most general unifiers, | |
| 960 |   e.g.\ see @{cite "nipkow-prehofer"}.
 | |
| 58618 | 961 | \<close> | 
| 37768 
e86221f3bac7
moved co-regularity to class section; avoid duplicated class_deps
 haftmann parents: 
37112diff
changeset | 962 | |
| 
e86221f3bac7
moved co-regularity to class section; avoid duplicated class_deps
 haftmann parents: 
37112diff
changeset | 963 | |
| 62172 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 964 | section \<open>Overloaded constant definitions \label{sec:overloading}\<close>
 | 
| 27040 | 965 | |
| 58618 | 966 | text \<open> | 
| 62172 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 967 | Definitions essentially express abbreviations within the logic. The simplest | 
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 968 | form of a definition is \<open>c :: \<sigma> \<equiv> t\<close>, where \<open>c\<close> is a new constant and \<open>t\<close> is | 
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 969 | a closed term that does not mention \<open>c\<close>. Moreover, so-called \<^emph>\<open>hidden | 
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 970 | polymorphism\<close> is excluded: all type variables in \<open>t\<close> need to occur in its | 
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 971 | type \<open>\<sigma>\<close>. | 
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 972 | |
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 973 | \<^emph>\<open>Overloading\<close> means that a constant being declared as \<open>c :: \<alpha> decl\<close> may be | 
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 974 | defined separately on type instances \<open>c :: (\<beta>\<^sub>1, \<dots>, \<beta>\<^sub>n)\<kappa> decl\<close> for each | 
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 975 | type constructor \<open>\<kappa>\<close>. At most occasions overloading will be used in a | 
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 976 | Haskell-like fashion together with type classes by means of \<^theory_text>\<open>instantiation\<close> | 
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 977 |   (see \secref{sec:class}). Sometimes low-level overloading is desirable; this
 | 
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 978 | is supported by \<^theory_text>\<open>consts\<close> and \<^theory_text>\<open>overloading\<close> explained below. | 
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 979 | |
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 980 | The right-hand side of overloaded definitions may mention overloaded | 
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 981 | constants recursively at type instances corresponding to the immediate | 
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 982 | argument types \<open>\<beta>\<^sub>1, \<dots>, \<beta>\<^sub>n\<close>. Incomplete specification patterns impose | 
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 983 | global constraints on all occurrences. E.g.\ \<open>d :: \<alpha> \<times> \<alpha>\<close> on the left-hand | 
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 984 | side means that all corresponding occurrences on some right-hand side need | 
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 985 | to be an instance of this, and general \<open>d :: \<alpha> \<times> \<beta>\<close> will be disallowed. Full | 
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 986 |   details are given by Kun\v{c}ar @{cite "Kuncar:2015"}.
 | 
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 987 | |
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 988 | \<^medskip> | 
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 989 | The \<^theory_text>\<open>consts\<close> command and the \<^theory_text>\<open>overloading\<close> target provide a convenient | 
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 990 |   interface for end-users. Regular specification elements such as @{command
 | 
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 991 |   definition}, @{command inductive}, @{command function} may be used in the
 | 
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 992 | body. It is also possible to use \<^theory_text>\<open>consts c :: \<sigma>\<close> with later \<^theory_text>\<open>overloading c | 
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 993 | \<equiv> c :: \<sigma>\<close> to keep the declaration and definition of a constant separate. | 
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 994 | |
| 47483 | 995 |   \begin{matharray}{rcl}
 | 
| 62172 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 996 |     @{command_def "consts"} & : & \<open>theory \<rightarrow> theory\<close> \\
 | 
| 61493 | 997 |     @{command_def "overloading"} & : & \<open>theory \<rightarrow> local_theory\<close> \\
 | 
| 47483 | 998 |   \end{matharray}
 | 
| 999 | ||
| 55112 
b1a5d603fd12
prefer rail cartouche -- avoid back-slashed quotes;
 wenzelm parents: 
55029diff
changeset | 1000 |   @{rail \<open>
 | 
| 62172 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 1001 |     @@{command consts} ((@{syntax name} '::' @{syntax type} @{syntax mixfix}?) +)
 | 
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 1002 | ; | 
| 42704 | 1003 |     @@{command overloading} ( spec + ) @'begin'
 | 
| 1004 | ; | |
| 62172 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 1005 |     spec: @{syntax name} ( '\<equiv>' | '==' ) @{syntax term} ( '(' @'unchecked' ')' )?
 | 
| 55112 
b1a5d603fd12
prefer rail cartouche -- avoid back-slashed quotes;
 wenzelm parents: 
55029diff
changeset | 1006 | \<close>} | 
| 27040 | 1007 | |
| 62172 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 1008 | \<^descr> \<^theory_text>\<open>consts c :: \<sigma>\<close> declares constant \<open>c\<close> to have any instance of type scheme | 
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 1009 | \<open>\<sigma>\<close>. The optional mixfix annotations may attach concrete syntax to the | 
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 1010 | constants declared. | 
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 1011 | |
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 1012 | \<^descr> \<^theory_text>\<open>overloading x\<^sub>1 \<equiv> c\<^sub>1 :: \<tau>\<^sub>1 \<dots> x\<^sub>n \<equiv> c\<^sub>n :: \<tau>\<^sub>n begin \<dots> end\<close> defines | 
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 1013 |   a theory target (cf.\ \secref{sec:target}) which allows to specify already
 | 
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 1014 | declared constants via definitions in the body. These are identified by an | 
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 1015 | explicitly given mapping from variable names \<open>x\<^sub>i\<close> to constants \<open>c\<^sub>i\<close> at | 
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 1016 | particular type instances. The definitions themselves are established using | 
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 1017 | common specification tools, using the names \<open>x\<^sub>i\<close> as reference to the | 
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 1018 | corresponding constants. | 
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 1019 | |
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 1020 | Option \<^theory_text>\<open>(unchecked)\<close> disables global dependency checks for the | 
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 1021 | corresponding definition, which is occasionally useful for exotic | 
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 1022 | overloading; this is a form of axiomatic specification. It is at the | 
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 1023 | discretion of the user to avoid malformed theory specifications! | 
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 1024 | \<close> | 
| 27040 | 1025 | |
| 62172 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 1026 | |
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 1027 | subsubsection \<open>Example\<close> | 
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 1028 | |
| 62173 | 1029 | consts Length :: "'a \<Rightarrow> nat" | 
| 62172 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 1030 | |
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 1031 | overloading | 
| 62173 | 1032 | Length\<^sub>0 \<equiv> "Length :: unit \<Rightarrow> nat" | 
| 1033 | Length\<^sub>1 \<equiv> "Length :: 'a \<times> unit \<Rightarrow> nat" | |
| 1034 | Length\<^sub>2 \<equiv> "Length :: 'a \<times> 'b \<times> unit \<Rightarrow> nat" | |
| 1035 | Length\<^sub>3 \<equiv> "Length :: 'a \<times> 'b \<times> 'c \<times> unit \<Rightarrow> nat" | |
| 62172 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 1036 | begin | 
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 1037 | |
| 62173 | 1038 | fun Length\<^sub>0 :: "unit \<Rightarrow> nat" where "Length\<^sub>0 () = 0" | 
| 1039 | fun Length\<^sub>1 :: "'a \<times> unit \<Rightarrow> nat" where "Length\<^sub>1 (a, ()) = 1" | |
| 1040 | fun Length\<^sub>2 :: "'a \<times> 'b \<times> unit \<Rightarrow> nat" where "Length\<^sub>2 (a, b, ()) = 2" | |
| 1041 | fun Length\<^sub>3 :: "'a \<times> 'b \<times> 'c \<times> unit \<Rightarrow> nat" where "Length\<^sub>3 (a, b, c, ()) = 3" | |
| 62172 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 1042 | |
| 
7eaeae127955
updated section on "Overloaded constant definitions";
 wenzelm parents: 
61891diff
changeset | 1043 | end | 
| 27040 | 1044 | |
| 62173 | 1045 | lemma "Length (a, b, c, ()) = 3" by simp | 
| 1046 | lemma "Length ((a, b), (c, d), ()) = 2" by simp | |
| 1047 | lemma "Length ((a, b, c, d, e), ()) = 1" by simp | |
| 1048 | ||
| 27040 | 1049 | |
| 58618 | 1050 | section \<open>Incorporating ML code \label{sec:ML}\<close>
 | 
| 27040 | 1051 | |
| 58618 | 1052 | text \<open> | 
| 27040 | 1053 |   \begin{matharray}{rcl}
 | 
| 62862 | 1054 |     @{command_def "SML_file"} & : & \<open>local_theory \<rightarrow> local_theory\<close> \\
 | 
| 62903 | 1055 |     @{command_def "SML_file_debug"} & : & \<open>local_theory \<rightarrow> local_theory\<close> \\
 | 
| 1056 |     @{command_def "SML_file_no_debug"} & : & \<open>local_theory \<rightarrow> local_theory\<close> \\
 | |
| 61493 | 1057 |     @{command_def "ML_file"} & : & \<open>local_theory \<rightarrow> local_theory\<close> \\
 | 
| 62903 | 1058 |     @{command_def "ML_file_debug"} & : & \<open>local_theory \<rightarrow> local_theory\<close> \\
 | 
| 1059 |     @{command_def "ML_file_no_debug"} & : & \<open>local_theory \<rightarrow> local_theory\<close> \\
 | |
| 61493 | 1060 |     @{command_def "ML"} & : & \<open>local_theory \<rightarrow> local_theory\<close> \\
 | 
| 1061 |     @{command_def "ML_prf"} & : & \<open>proof \<rightarrow> proof\<close> \\
 | |
| 1062 |     @{command_def "ML_val"} & : & \<open>any \<rightarrow>\<close> \\
 | |
| 1063 |     @{command_def "ML_command"} & : & \<open>any \<rightarrow>\<close> \\
 | |
| 1064 |     @{command_def "setup"} & : & \<open>theory \<rightarrow> theory\<close> \\
 | |
| 1065 |     @{command_def "local_setup"} & : & \<open>local_theory \<rightarrow> local_theory\<close> \\
 | |
| 1066 |     @{command_def "attribute_setup"} & : & \<open>local_theory \<rightarrow> local_theory\<close> \\
 | |
| 28760 
cbc435f7b16b
unified use of declaration environment with IsarImplementation;
 wenzelm parents: 
28758diff
changeset | 1067 |   \end{matharray}
 | 
| 57478 | 1068 |   \begin{tabular}{rcll}
 | 
| 61493 | 1069 |     @{attribute_def ML_print_depth} & : & \<open>attribute\<close> & default 10 \\
 | 
| 1070 |     @{attribute_def ML_source_trace} & : & \<open>attribute\<close> & default \<open>false\<close> \\
 | |
| 62903 | 1071 |     @{attribute_def ML_debugger} & : & \<open>attribute\<close> & default \<open>false\<close> \\
 | 
| 61493 | 1072 |     @{attribute_def ML_exception_trace} & : & \<open>attribute\<close> & default \<open>false\<close> \\
 | 
| 62903 | 1073 |     @{attribute_def ML_exception_debugger} & : & \<open>attribute\<close> & default \<open>false\<close> \\
 | 
| 57478 | 1074 |   \end{tabular}
 | 
| 28760 
cbc435f7b16b
unified use of declaration environment with IsarImplementation;
 wenzelm parents: 
28758diff
changeset | 1075 | |
| 55112 
b1a5d603fd12
prefer rail cartouche -- avoid back-slashed quotes;
 wenzelm parents: 
55029diff
changeset | 1076 |   @{rail \<open>
 | 
| 62903 | 1077 |     (@@{command SML_file} |
 | 
| 1078 |       @@{command SML_file_debug} |
 | |
| 1079 |       @@{command SML_file_no_debug} |
 | |
| 1080 |       @@{command ML_file} |
 | |
| 1081 |       @@{command ML_file_debug} |
 | |
| 62969 | 1082 |       @@{command ML_file_no_debug}) @{syntax name} ';'?
 | 
| 27040 | 1083 | ; | 
| 42596 
6c621a9d612a
modernized rail diagrams using @{rail} antiquotation;
 wenzelm parents: 
41435diff
changeset | 1084 |     (@@{command ML} | @@{command ML_prf} | @@{command ML_val} |
 | 
| 
6c621a9d612a
modernized rail diagrams using @{rail} antiquotation;
 wenzelm parents: 
41435diff
changeset | 1085 |       @@{command ML_command} | @@{command setup} | @@{command local_setup}) @{syntax text}
 | 
| 27040 | 1086 | ; | 
| 59783 
00b62aa9f430
tuned syntax diagrams -- no duplication of "target";
 wenzelm parents: 
59781diff
changeset | 1087 |     @@{command attribute_setup} @{syntax name} '=' @{syntax text} @{syntax text}?
 | 
| 55112 
b1a5d603fd12
prefer rail cartouche -- avoid back-slashed quotes;
 wenzelm parents: 
55029diff
changeset | 1088 | \<close>} | 
| 27040 | 1089 | |
| 61665 | 1090 | \<^descr> \<^theory_text>\<open>SML_file name\<close> reads and evaluates the given Standard ML file. Top-level | 
| 62862 | 1091 | SML bindings are stored within the (global or local) theory context; the | 
| 1092 | initial environment is restricted to the Standard ML implementation of | |
| 1093 | Poly/ML, without the many add-ons of Isabelle/ML. Multiple \<^theory_text>\<open>SML_file\<close> | |
| 1094 | commands may be used to build larger Standard ML projects, independently of | |
| 1095 | the regular Isabelle/ML environment. | |
| 56275 
600f432ab556
added command 'SML_file' for Standard ML without Isabelle/ML add-ons;
 wenzelm parents: 
55837diff
changeset | 1096 | |
| 61665 | 1097 | \<^descr> \<^theory_text>\<open>ML_file name\<close> reads and evaluates the given ML file. The current theory | 
| 1098 |   context is passed down to the ML toplevel and may be modified, using @{ML
 | |
| 1099 | "Context.>>"} or derived ML commands. Top-level ML bindings are stored | |
| 1100 | within the (global or local) theory context. | |
| 62903 | 1101 | |
| 1102 | \<^descr> \<^theory_text>\<open>SML_file_debug\<close>, \<^theory_text>\<open>SML_file_no_debug\<close>, \<^theory_text>\<open>ML_file_debug\<close>, and | |
| 1103 |   \<^theory_text>\<open>ML_file_no_debug\<close> change the @{attribute ML_debugger} option locally while
 | |
| 1104 | the given file is compiled. | |
| 1105 | ||
| 61665 | 1106 | \<^descr> \<^theory_text>\<open>ML text\<close> is similar to \<^theory_text>\<open>ML_file\<close>, but evaluates directly the given | 
| 1107 | \<open>text\<close>. Top-level ML bindings are stored within the (global or local) theory | |
| 1108 | context. | |
| 28281 | 1109 | |
| 61665 | 1110 | \<^descr> \<^theory_text>\<open>ML_prf\<close> is analogous to \<^theory_text>\<open>ML\<close> but works within a proof context. | 
| 1111 | Top-level ML bindings are stored within the proof context in a purely | |
| 1112 | sequential fashion, disregarding the nested proof structure. ML bindings | |
| 1113 | introduced by \<^theory_text>\<open>ML_prf\<close> are discarded at the end of the proof. | |
| 27040 | 1114 | |
| 61665 | 1115 | \<^descr> \<^theory_text>\<open>ML_val\<close> and \<^theory_text>\<open>ML_command\<close> are diagnostic versions of \<^theory_text>\<open>ML\<close>, which means | 
| 1116 | that the context may not be updated. \<^theory_text>\<open>ML_val\<close> echos the bindings produced | |
| 1117 | at the ML toplevel, but \<^theory_text>\<open>ML_command\<close> is silent. | |
| 65491 
7fb81fa1d668
more uniform thy_deps (like class_deps), see also c48d536231fe;
 wenzelm parents: 
63680diff
changeset | 1118 | |
| 61665 | 1119 | \<^descr> \<^theory_text>\<open>setup "text"\<close> changes the current theory context by applying \<open>text\<close>, | 
| 1120 |   which refers to an ML expression of type @{ML_type "theory -> theory"}. This
 | |
| 1121 | enables to initialize any object-logic specific tools and packages written | |
| 1122 | in ML, for example. | |
| 30461 | 1123 | |
| 61665 | 1124 | \<^descr> \<^theory_text>\<open>local_setup\<close> is similar to \<^theory_text>\<open>setup\<close> for a local theory context, and an | 
| 1125 |   ML expression of type @{ML_type "local_theory -> local_theory"}. This allows
 | |
| 1126 | to invoke local theory specification packages without going through concrete | |
| 1127 | outer syntax, for example. | |
| 28758 | 1128 | |
| 61665 | 1129 | \<^descr> \<^theory_text>\<open>attribute_setup name = "text" description\<close> defines an attribute in the | 
| 1130 | current context. The given \<open>text\<close> has to be an ML expression of type | |
| 1131 |   @{ML_type "attribute context_parser"}, cf.\ basic parsers defined in
 | |
| 1132 |   structure @{ML_structure Args} and @{ML_structure Attrib}.
 | |
| 30526 | 1133 | |
| 1134 | In principle, attributes can operate both on a given theorem and the | |
| 61664 | 1135 | implicit context, although in practice only one is modified and the other | 
| 1136 | serves as parameter. Here are examples for these two cases: | |
| 58618 | 1137 | \<close> | 
| 30526 | 1138 | |
| 59905 | 1139 | (*<*)experiment begin(*>*) | 
| 62903 | 1140 | attribute_setup my_rule = | 
| 1141 | \<open>Attrib.thms >> (fn ths => | |
| 1142 | Thm.rule_attribute ths | |
| 1143 | (fn context: Context.generic => fn th: thm => | |
| 1144 | let val th' = th OF ths | |
| 1145 | in th' end))\<close> | |
| 30526 | 1146 | |
| 62903 | 1147 | attribute_setup my_declaration = | 
| 1148 | \<open>Attrib.thms >> (fn ths => | |
| 1149 | Thm.declaration_attribute | |
| 1150 | (fn th: thm => fn context: Context.generic => | |
| 1151 | let val context' = context | |
| 1152 | in context' end))\<close> | |
| 59905 | 1153 | (*<*)end(*>*) | 
| 30526 | 1154 | |
| 58618 | 1155 | text \<open> | 
| 61664 | 1156 |   \<^descr> @{attribute ML_print_depth} controls the printing depth of the ML toplevel
 | 
| 62903 | 1157 | pretty printer. Typically the limit should be less than 10. Bigger values | 
| 1158 | such as 100--1000 are occasionally useful for debugging. | |
| 57478 | 1159 | |
| 61664 | 1160 |   \<^descr> @{attribute ML_source_trace} indicates whether the source text that is
 | 
| 1161 | given to the ML compiler should be output: it shows the raw Standard ML | |
| 57478 | 1162 | after expansion of Isabelle/ML antiquotations. | 
| 1163 | ||
| 62903 | 1164 |   \<^descr> @{attribute ML_debugger} controls compilation of sources with or without
 | 
| 1165 |   debugging information. The global system option @{system_option_ref
 | |
| 1166 | ML_debugger} does the same when building a session image. It is also | |
| 1167 | possible use commands like \<^theory_text>\<open>ML_file_debug\<close> etc. The ML debugger is | |
| 1168 |   explained further in @{cite "isabelle-jedit"}.
 | |
| 1169 | ||
| 61664 | 1170 |   \<^descr> @{attribute ML_exception_trace} indicates whether the ML run-time system
 | 
| 1171 | should print a detailed stack trace on exceptions. The result is dependent | |
| 62903 | 1172 | on various ML compiler optimizations. The boundary for the exception trace | 
| 1173 | is the current Isar command transactions: it is occasionally better to | |
| 1174 |   insert the combinator @{ML Runtime.exn_trace} into ML code for debugging
 | |
| 1175 |   @{cite "isabelle-implementation"}, closer to the point where it actually
 | |
| 1176 | happens. | |
| 57478 | 1177 | |
| 62903 | 1178 |   \<^descr> @{attribute ML_exception_debugger} controls detailed exception trace via
 | 
| 1179 | the Poly/ML debugger, at the cost of extra compile-time and run-time | |
| 1180 | overhead. Relevant ML modules need to be compiled beforehand with debugging | |
| 1181 |   enabled, see @{attribute ML_debugger} above.
 | |
| 58618 | 1182 | \<close> | 
| 57478 | 1183 | |
| 27040 | 1184 | |
| 66757 | 1185 | section \<open>External file dependencies\<close> | 
| 1186 | ||
| 1187 | text \<open> | |
| 1188 |   \begin{matharray}{rcl}
 | |
| 1189 |     @{command_def "external_file"} & : & \<open>any \<rightarrow> any\<close> \\
 | |
| 1190 |   \end{matharray}
 | |
| 1191 | ||
| 1192 |   @{rail \<open>@@{command external_file} @{syntax name} ';'?\<close>}
 | |
| 1193 | ||
| 1194 | \<^descr> \<^theory_text>\<open>external_file name\<close> declares the formal dependency on the given file | |
| 1195 |   name, such that the Isabelle build process knows about it (see also @{cite
 | |
| 1196 |   "isabelle-system"}). The file can be read e.g.\ in Isabelle/ML via @{ML
 | |
| 1197 | File.read}, without specific management by the Prover IDE. | |
| 1198 | \<close> | |
| 1199 | ||
| 1200 | ||
| 1201 | ||
| 58618 | 1202 | section \<open>Primitive specification elements\<close> | 
| 27040 | 1203 | |
| 58618 | 1204 | subsection \<open>Sorts\<close> | 
| 27040 | 1205 | |
| 58618 | 1206 | text \<open> | 
| 27040 | 1207 |   \begin{matharray}{rcll}
 | 
| 61493 | 1208 |     @{command_def "default_sort"} & : & \<open>local_theory \<rightarrow> local_theory\<close>
 | 
| 27040 | 1209 |   \end{matharray}
 | 
| 1210 | ||
| 55112 
b1a5d603fd12
prefer rail cartouche -- avoid back-slashed quotes;
 wenzelm parents: 
55029diff
changeset | 1211 |   @{rail \<open>
 | 
| 42596 
6c621a9d612a
modernized rail diagrams using @{rail} antiquotation;
 wenzelm parents: 
41435diff
changeset | 1212 |     @@{command default_sort} @{syntax sort}
 | 
| 55112 
b1a5d603fd12
prefer rail cartouche -- avoid back-slashed quotes;
 wenzelm parents: 
55029diff
changeset | 1213 | \<close>} | 
| 27040 | 1214 | |
| 61665 | 1215 | \<^descr> \<^theory_text>\<open>default_sort s\<close> makes sort \<open>s\<close> the new default sort for any type | 
| 1216 | variable that is given explicitly in the text, but lacks a sort constraint | |
| 1217 | (wrt.\ the current context). Type variables generated by type inference are | |
| 1218 | not affected. | |
| 28767 | 1219 | |
| 61664 | 1220 | Usually the default sort is only changed when defining a new object-logic. | 
| 1221 |   For example, the default sort in Isabelle/HOL is @{class type}, the class of
 | |
| 1222 | all HOL types. | |
| 28767 | 1223 | |
| 61664 | 1224 | When merging theories, the default sorts of the parents are logically | 
| 1225 | intersected, i.e.\ the representations as lists of classes are joined. | |
| 58618 | 1226 | \<close> | 
| 27040 | 1227 | |
| 1228 | ||
| 58618 | 1229 | subsection \<open>Types \label{sec:types-pure}\<close>
 | 
| 27040 | 1230 | |
| 58618 | 1231 | text \<open> | 
| 27040 | 1232 |   \begin{matharray}{rcll}
 | 
| 61493 | 1233 |     @{command_def "type_synonym"} & : & \<open>local_theory \<rightarrow> local_theory\<close> \\
 | 
| 1234 |     @{command_def "typedecl"} & : & \<open>local_theory \<rightarrow> local_theory\<close> \\
 | |
| 27040 | 1235 |   \end{matharray}
 | 
| 1236 | ||
| 55112 
b1a5d603fd12
prefer rail cartouche -- avoid back-slashed quotes;
 wenzelm parents: 
55029diff
changeset | 1237 |   @{rail \<open>
 | 
| 42596 
6c621a9d612a
modernized rail diagrams using @{rail} antiquotation;
 wenzelm parents: 
41435diff
changeset | 1238 |     @@{command type_synonym} (@{syntax typespec} '=' @{syntax type} @{syntax mixfix}?)
 | 
| 27040 | 1239 | ; | 
| 42596 
6c621a9d612a
modernized rail diagrams using @{rail} antiquotation;
 wenzelm parents: 
41435diff
changeset | 1240 |     @@{command typedecl} @{syntax typespec} @{syntax mixfix}?
 | 
| 55112 
b1a5d603fd12
prefer rail cartouche -- avoid back-slashed quotes;
 wenzelm parents: 
55029diff
changeset | 1241 | \<close>} | 
| 27040 | 1242 | |
| 61665 | 1243 | \<^descr> \<^theory_text>\<open>type_synonym (\<alpha>\<^sub>1, \<dots>, \<alpha>\<^sub>n) t = \<tau>\<close> introduces a \<^emph>\<open>type synonym\<close> \<open>(\<alpha>\<^sub>1, \<dots>, | 
| 1244 | \<alpha>\<^sub>n) t\<close> for the existing type \<open>\<tau>\<close>. Unlike the semantic type definitions in | |
| 1245 | Isabelle/HOL, type synonyms are merely syntactic abbreviations without any | |
| 1246 | logical significance. Internally, type synonyms are fully expanded. | |
| 65491 
7fb81fa1d668
more uniform thy_deps (like class_deps), see also c48d536231fe;
 wenzelm parents: 
63680diff
changeset | 1247 | |
| 61665 | 1248 | \<^descr> \<^theory_text>\<open>typedecl (\<alpha>\<^sub>1, \<dots>, \<alpha>\<^sub>n) t\<close> declares a new type constructor \<open>t\<close>. If the | 
| 1249 | object-logic defines a base sort \<open>s\<close>, then the constructor is declared to | |
| 1250 | operate on that, via the axiomatic type-class instance \<open>t :: (s, \<dots>, s)s\<close>. | |
| 27040 | 1251 | |
| 57487 | 1252 | |
| 1253 |   \begin{warn}
 | |
| 61664 | 1254 |     If you introduce a new type axiomatically, i.e.\ via @{command_ref
 | 
| 1255 |     typedecl} and @{command_ref axiomatization}
 | |
| 1256 |     (\secref{sec:axiomatizations}), the minimum requirement is that it has a
 | |
| 1257 | non-empty model, to avoid immediate collapse of the logical environment. | |
| 1258 | Moreover, one needs to demonstrate that the interpretation of such | |
| 1259 | free-form axiomatizations can coexist with other axiomatization schemes | |
| 1260 |     for types, notably @{command_def typedef} in Isabelle/HOL
 | |
| 1261 |     (\secref{sec:hol-typedef}), or any other extension that people might have
 | |
| 1262 | introduced elsewhere. | |
| 57487 | 1263 |   \end{warn}
 | 
| 58618 | 1264 | \<close> | 
| 27040 | 1265 | |
| 1266 | ||
| 58618 | 1267 | section \<open>Naming existing theorems \label{sec:theorems}\<close>
 | 
| 27040 | 1268 | |
| 58618 | 1269 | text \<open> | 
| 27040 | 1270 |   \begin{matharray}{rcll}
 | 
| 61493 | 1271 |     @{command_def "lemmas"} & : & \<open>local_theory \<rightarrow> local_theory\<close> \\
 | 
| 1272 |     @{command_def "named_theorems"} & : & \<open>local_theory \<rightarrow> local_theory\<close> \\
 | |
| 27040 | 1273 |   \end{matharray}
 | 
| 1274 | ||
| 55112 
b1a5d603fd12
prefer rail cartouche -- avoid back-slashed quotes;
 wenzelm parents: 
55029diff
changeset | 1275 |   @{rail \<open>
 | 
| 62969 | 1276 |     @@{command lemmas} (@{syntax thmdef}? @{syntax thms} + @'and')
 | 
| 59785 | 1277 |       @{syntax for_fixes}
 | 
| 57946 
6a26aa5fa65e
updated documentation concerning 'named_theorems';
 wenzelm parents: 
57941diff
changeset | 1278 | ; | 
| 59785 | 1279 |     @@{command named_theorems} (@{syntax name} @{syntax text}? + @'and')
 | 
| 55112 
b1a5d603fd12
prefer rail cartouche -- avoid back-slashed quotes;
 wenzelm parents: 
55029diff
changeset | 1280 | \<close>} | 
| 27040 | 1281 | |
| 61665 | 1282 |   \<^descr> \<^theory_text>\<open>lemmas a = b\<^sub>1 \<dots> b\<^sub>n\<close>~@{keyword_def "for"}~\<open>x\<^sub>1 \<dots> x\<^sub>m\<close> evaluates given
 | 
| 1283 | facts (with attributes) in the current context, which may be augmented by | |
| 1284 | local variables. Results are standardized before being stored, i.e.\ | |
| 1285 | schematic variables are renamed to enforce index \<open>0\<close> uniformly. | |
| 45600 
1bbbac9a0cb0
'lemmas' / 'theorems' commands allow 'for' fixes and standardize the result before storing;
 wenzelm parents: 
42936diff
changeset | 1286 | |
| 61665 | 1287 | \<^descr> \<^theory_text>\<open>named_theorems name description\<close> declares a dynamic fact within the | 
| 1288 | context. The same \<open>name\<close> is used to define an attribute with the usual | |
| 1289 |   \<open>add\<close>/\<open>del\<close> syntax (e.g.\ see \secref{sec:simp-rules}) to maintain the
 | |
| 61664 | 1290 | content incrementally, in canonical declaration order of the text structure. | 
| 58618 | 1291 | \<close> | 
| 27040 | 1292 | |
| 1293 | ||
| 58618 | 1294 | section \<open>Oracles\<close> | 
| 27040 | 1295 | |
| 58618 | 1296 | text \<open> | 
| 47483 | 1297 |   \begin{matharray}{rcll}
 | 
| 61493 | 1298 |     @{command_def "oracle"} & : & \<open>theory \<rightarrow> theory\<close> & (axiomatic!) \\
 | 
| 47483 | 1299 |   \end{matharray}
 | 
| 1300 | ||
| 61664 | 1301 | Oracles allow Isabelle to take advantage of external reasoners such as | 
| 1302 | arithmetic decision procedures, model checkers, fast tautology checkers or | |
| 1303 | computer algebra systems. Invoked as an oracle, an external reasoner can | |
| 1304 | create arbitrary Isabelle theorems. | |
| 28756 | 1305 | |
| 61664 | 1306 | It is the responsibility of the user to ensure that the external reasoner is | 
| 1307 | as trustworthy as the application requires. Another typical source of errors | |
| 1308 | is the linkup between Isabelle and the external tool, not just its concrete | |
| 1309 | implementation, but also the required translation between two different | |
| 1310 | logical environments. | |
| 28756 | 1311 | |
| 1312 | Isabelle merely guarantees well-formedness of the propositions being | |
| 61664 | 1313 | asserted, and records within the internal derivation object how presumed | 
| 1314 | theorems depend on unproven suppositions. | |
| 28756 | 1315 | |
| 55112 
b1a5d603fd12
prefer rail cartouche -- avoid back-slashed quotes;
 wenzelm parents: 
55029diff
changeset | 1316 |   @{rail \<open>
 | 
| 42596 
6c621a9d612a
modernized rail diagrams using @{rail} antiquotation;
 wenzelm parents: 
41435diff
changeset | 1317 |     @@{command oracle} @{syntax name} '=' @{syntax text}
 | 
| 55112 
b1a5d603fd12
prefer rail cartouche -- avoid back-slashed quotes;
 wenzelm parents: 
55029diff
changeset | 1318 | \<close>} | 
| 27040 | 1319 | |
| 61665 | 1320 | \<^descr> \<^theory_text>\<open>oracle name = "text"\<close> turns the given ML expression \<open>text\<close> of type | 
| 1321 |   @{ML_text "'a -> cterm"} into an ML function of type @{ML_text "'a -> thm"},
 | |
| 1322 |   which is bound to the global identifier @{ML_text name}. This acts like an
 | |
| 1323 | infinitary specification of axioms! Invoking the oracle only works within | |
| 1324 | the scope of the resulting theory. | |
| 27040 | 1325 | |
| 28756 | 1326 | |
| 63680 | 1327 | See \<^file>\<open>~~/src/HOL/ex/Iff_Oracle.thy\<close> for a worked example of defining a new | 
| 1328 | primitive rule as oracle, and turning it into a proof method. | |
| 58618 | 1329 | \<close> | 
| 27040 | 1330 | |
| 1331 | ||
| 58618 | 1332 | section \<open>Name spaces\<close> | 
| 27040 | 1333 | |
| 58618 | 1334 | text \<open> | 
| 27040 | 1335 |   \begin{matharray}{rcl}
 | 
| 66248 | 1336 |     @{command_def "alias"} & : & \<open>local_theory \<rightarrow> local_theory\<close> \\
 | 
| 1337 |     @{command_def "type_alias"} & : & \<open>local_theory \<rightarrow> local_theory\<close> \\
 | |
| 61493 | 1338 |     @{command_def "hide_class"} & : & \<open>theory \<rightarrow> theory\<close> \\
 | 
| 1339 |     @{command_def "hide_type"} & : & \<open>theory \<rightarrow> theory\<close> \\
 | |
| 1340 |     @{command_def "hide_const"} & : & \<open>theory \<rightarrow> theory\<close> \\
 | |
| 1341 |     @{command_def "hide_fact"} & : & \<open>theory \<rightarrow> theory\<close> \\
 | |
| 27040 | 1342 |   \end{matharray}
 | 
| 1343 | ||
| 55112 
b1a5d603fd12
prefer rail cartouche -- avoid back-slashed quotes;
 wenzelm parents: 
55029diff
changeset | 1344 |   @{rail \<open>
 | 
| 66248 | 1345 |     (@{command alias} | @{command type_alias}) @{syntax name} '=' @{syntax name}
 | 
| 1346 | ; | |
| 1347 |     (@{command hide_class} | @{command hide_type} |
 | |
| 1348 |       @{command hide_const} | @{command hide_fact}) ('(' @'open' ')')? (@{syntax name} + )
 | |
| 55112 
b1a5d603fd12
prefer rail cartouche -- avoid back-slashed quotes;
 wenzelm parents: 
55029diff
changeset | 1349 | \<close>} | 
| 27040 | 1350 | |
| 61664 | 1351 | Isabelle organizes any kind of name declarations (of types, constants, | 
| 1352 | theorems etc.) by separate hierarchically structured name spaces. Normally | |
| 61665 | 1353 | the user does not have to control the behaviour of name spaces by hand, yet | 
| 61664 | 1354 | the following commands provide some way to do so. | 
| 27040 | 1355 | |
| 66248 | 1356 | \<^descr> \<^theory_text>\<open>alias\<close> and \<^theory_text>\<open>type_alias\<close> introduce aliases for constants and type | 
| 1357 | constructors, respectively. This allows adhoc changes to name-space | |
| 1358 | accesses. | |
| 1359 | ||
| 1360 | \<^descr> \<^theory_text>\<open>type_alias b = c\<close> introduces an alias for an existing type constructor. | |
| 1361 | ||
| 61665 | 1362 | \<^descr> \<^theory_text>\<open>hide_class names\<close> fully removes class declarations from a given name | 
| 1363 | space; with the \<open>(open)\<close> option, only the unqualified base name is hidden. | |
| 36177 
8e0770d2e499
separate commands 'hide_class', 'hide_type', 'hide_const', 'hide_fact';
 wenzelm parents: 
35681diff
changeset | 1364 | |
| 61664 | 1365 | Note that hiding name space accesses has no impact on logical declarations | 
| 1366 | --- they remain valid internally. Entities that are no longer accessible to | |
| 1367 | the user are printed with the special qualifier ``\<open>??\<close>'' prefixed to the | |
| 1368 | full internal name. | |
| 27040 | 1369 | |
| 61665 | 1370 | \<^descr> \<^theory_text>\<open>hide_type\<close>, \<^theory_text>\<open>hide_const\<close>, and \<^theory_text>\<open>hide_fact\<close> are similar to | 
| 1371 | \<^theory_text>\<open>hide_class\<close>, but hide types, constants, and facts, respectively. | |
| 58618 | 1372 | \<close> | 
| 27040 | 1373 | |
| 26869 | 1374 | end |