author | blanchet |
Fri, 25 Oct 2019 15:23:14 +0200 | |
changeset 70938 | 6d84c3c333d5 |
parent 70608 | d997c7ba3305 |
child 71166 | c9433e8e314e |
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 |
|
69597 | 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:
46999
diff
changeset
|
64 |
; |
50128
599c935aac82
alternative completion for outer syntax keywords;
wenzelm
parents:
49243
diff
changeset
|
65 |
keywords: @'keywords' (keyword_decls + @'and') |
599c935aac82
alternative completion for outer syntax keywords;
wenzelm
parents:
49243
diff
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:
67013
diff
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} + @'|') ')' |
|
69597 | 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:
46999
diff
changeset
|
83 |
|
59781 | 84 |
Empty imports are only allowed in the bootstrap process of the special |
69597 | 85 |
theory \<^theory>\<open>Pure\<close>, which is the start of any other formal development |
61664 | 86 |
based on Isabelle. Regular user theories usually refer to some more complex |
69597 | 87 |
entry point, such as theory \<^theory>\<open>Main\<close> 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> |
|
69913 | 96 |
\<open>:: thy_goal_defn\<close> or @{keyword "keywords"}~\<^verbatim>\<open>"datatype"\<close> \<open>:: thy_defn\<close> for |
97 |
theory-level definitions with and without proof, respectively. Additional |
|
61664 | 98 |
@{syntax tags} provide defaults for document preparation |
69962
82e945d472d5
documentation of document markers and re-interpreted command tags;
wenzelm
parents:
69913
diff
changeset
|
99 |
(\secref{sec:document-markers}). |
50128
599c935aac82
alternative completion for outer syntax keywords;
wenzelm
parents:
49243
diff
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:
63680
diff
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:
63680
diff
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:
63680
diff
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:
59939
diff
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:
47114
diff
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:
47114
diff
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 |
|
69597 | 141 |
\<^rail>\<open> |
62969 | 142 |
@@{command context} @{syntax name} @'begin' |
27040 | 143 |
; |
55112
b1a5d603fd12
prefer rail cartouche -- avoid back-slashed quotes;
wenzelm
parents:
55029
diff
changeset
|
144 |
@@{command context} @{syntax_ref "includes"}? (@{syntax context_elem} * ) @'begin' |
47484 | 145 |
; |
62969 | 146 |
@{syntax_def target}: '(' @'in' @{syntax name} ')' |
69597 | 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:
47114
diff
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:
63680
diff
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:
63680
diff
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:
59926
diff
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:
59781
diff
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:
63680
diff
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:
59781
diff
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 |
|
69597 | 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:
59905
diff
changeset
|
235 |
@@{command print_bundles} ('!'?) |
9830c944670f
more uniform "verbose" option to print name space;
wenzelm
parents:
59905
diff
changeset
|
236 |
; |
62969 | 237 |
(@@{command include} | @@{command including}) (@{syntax name}+) |
47484 | 238 |
; |
62969 | 239 |
@{syntax_def "includes"}: @'includes' (@{syntax name}+) |
69597 | 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:
53370
diff
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:
61891
diff
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 |
|
69597 | 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:
59905
diff
changeset
|
306 |
; |
9830c944670f
more uniform "verbose" option to print name space;
wenzelm
parents:
59905
diff
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} |
|
69597 | 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:
63680
diff
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:
63680
diff
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:
63680
diff
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:
63680
diff
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 |
||
69597 | 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} |
69597 | 363 |
\<close> |
57487 | 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 |
|
69597 | 402 |
\<^rail>\<open> |
42596
6c621a9d612a
modernized rail diagrams using @{rail} antiquotation;
wenzelm
parents:
41435
diff
changeset
|
403 |
(@@{command declaration} | @@{command syntax_declaration}) |
59783
00b62aa9f430
tuned syntax diagrams -- no duplication of "target";
wenzelm
parents:
59781
diff
changeset
|
404 |
('(' @'pervasive' ')')? \<newline> @{syntax text} |
27040 | 405 |
; |
62969 | 406 |
@@{command declare} (@{syntax thms} + @'and') |
69597 | 407 |
\<close> |
27040 | 408 |
|
69597 | 409 |
\<^descr> \<^theory_text>\<open>declaration d\<close> adds the declaration function \<open>d\<close> of ML type \<^ML_type>\<open>declaration\<close>, to the current local theory under construction. In later |
61665 | 410 |
application contexts, the function is transformed according to the morphisms |
411 |
being involved in the interpretation hierarchy. |
|
27040 | 412 |
|
61665 | 413 |
If the \<^theory_text>\<open>(pervasive)\<close> option is given, the corresponding declaration is |
61664 | 414 |
applied to all possible contexts involved, including the global background |
415 |
theory. |
|
33516 | 416 |
|
61665 | 417 |
\<^descr> \<^theory_text>\<open>syntax_declaration\<close> is similar to \<^theory_text>\<open>declaration\<close>, but is meant to affect |
418 |
only ``syntactic'' tools by convention (such as notation and type-checking |
|
419 |
information). |
|
40784 | 420 |
|
61665 | 421 |
\<^descr> \<^theory_text>\<open>declare thms\<close> declares theorems to the current local theory context. No |
422 |
theorem binding is involved here, unlike \<^theory_text>\<open>lemmas\<close> (cf.\ |
|
423 |
\secref{sec:theorems}), so \<^theory_text>\<open>declare\<close> only has the effect of applying |
|
424 |
attributes as included in the theorem specification. |
|
58618 | 425 |
\<close> |
27040 | 426 |
|
427 |
||
58618 | 428 |
section \<open>Locales \label{sec:locale}\<close> |
27040 | 429 |
|
58618 | 430 |
text \<open> |
54049 | 431 |
A locale is a functor that maps parameters (including implicit type |
61664 | 432 |
parameters) and a specification to a list of declarations. The syntax of |
433 |
locales is modeled after the Isar proof context commands (cf.\ |
|
434 |
\secref{sec:proof-context}). |
|
54049 | 435 |
|
61664 | 436 |
Locale hierarchies are supported by maintaining a graph of dependencies |
437 |
between locale instances in the global theory. Dependencies may be |
|
438 |
introduced through import (where a locale is defined as sublocale of the |
|
439 |
imported instances) or by proving that an existing locale is a sublocale of |
|
440 |
one or several locale instances. |
|
54049 | 441 |
|
442 |
A locale may be opened with the purpose of appending to its list of |
|
61664 | 443 |
declarations (cf.\ \secref{sec:target}). When opening a locale declarations |
444 |
from all dependencies are collected and are presented as a local theory. In |
|
445 |
this process, which is called \<^emph>\<open>roundup\<close>, redundant locale instances are |
|
446 |
omitted. A locale instance is redundant if it is subsumed by an instance |
|
447 |
encountered earlier. A more detailed description of this process is |
|
448 |
available elsewhere @{cite Ballarin2014}. |
|
58618 | 449 |
\<close> |
27040 | 450 |
|
451 |
||
58618 | 452 |
subsection \<open>Locale expressions \label{sec:locale-expr}\<close> |
33846 | 453 |
|
58618 | 454 |
text \<open> |
61606
6d5213bd9709
uniform mandatory qualifier for all locale expressions, including 'statespace' parent;
wenzelm
parents:
61566
diff
changeset
|
455 |
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:
61566
diff
changeset
|
456 |
locales. The context consists of the declaration elements from the locale |
6d5213bd9709
uniform mandatory qualifier for all locale expressions, including 'statespace' parent;
wenzelm
parents:
61566
diff
changeset
|
457 |
instances. Redundant locale instances are omitted according to roundup. |
33846 | 458 |
|
69597 | 459 |
\<^rail>\<open> |
59785 | 460 |
@{syntax_def locale_expr}: (instance + '+') @{syntax for_fixes} |
33846 | 461 |
; |
67764 | 462 |
instance: (qualifier ':')? @{syntax name} (pos_insts | named_insts) \<newline> |
463 |
rewrites? |
|
33846 | 464 |
; |
61606
6d5213bd9709
uniform mandatory qualifier for all locale expressions, including 'statespace' parent;
wenzelm
parents:
61566
diff
changeset
|
465 |
qualifier: @{syntax name} ('?')? |
33846 | 466 |
; |
42617 | 467 |
pos_insts: ('_' | @{syntax term})* |
33846 | 468 |
; |
42617 | 469 |
named_insts: @'where' (@{syntax name} '=' @{syntax term} + @'and') |
67740 | 470 |
; |
471 |
rewrites: @'rewrites' (@{syntax thmdecl}? @{syntax prop} + @'and') |
|
69597 | 472 |
\<close> |
33846 | 473 |
|
61606
6d5213bd9709
uniform mandatory qualifier for all locale expressions, including 'statespace' parent;
wenzelm
parents:
61566
diff
changeset
|
474 |
A locale instance consists of a reference to a locale and either positional |
67740 | 475 |
or named parameter instantiations optionally followed by rewrites clauses. |
476 |
Identical instantiations (that is, those |
|
61606
6d5213bd9709
uniform mandatory qualifier for all locale expressions, including 'statespace' parent;
wenzelm
parents:
61566
diff
changeset
|
477 |
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:
61566
diff
changeset
|
478 |
enables to omit the instantiation for a parameter inside a positional |
6d5213bd9709
uniform mandatory qualifier for all locale expressions, including 'statespace' parent;
wenzelm
parents:
61566
diff
changeset
|
479 |
instantiation. |
33846 | 480 |
|
61606
6d5213bd9709
uniform mandatory qualifier for all locale expressions, including 'statespace' parent;
wenzelm
parents:
61566
diff
changeset
|
481 |
Terms in instantiations are from the context the locale expressions is |
6d5213bd9709
uniform mandatory qualifier for all locale expressions, including 'statespace' parent;
wenzelm
parents:
61566
diff
changeset
|
482 |
declared in. Local names may be added to this context with the optional |
61665 | 483 |
\<^theory_text>\<open>for\<close> clause. This is useful for shadowing names bound in outer contexts, |
484 |
and for declaring syntax. In addition, syntax declarations from one instance |
|
485 |
are effective when parsing subsequent instances of the same expression. |
|
33846 | 486 |
|
61606
6d5213bd9709
uniform mandatory qualifier for all locale expressions, including 'statespace' parent;
wenzelm
parents:
61566
diff
changeset
|
487 |
Instances have an optional qualifier which applies to names in declarations. |
6d5213bd9709
uniform mandatory qualifier for all locale expressions, including 'statespace' parent;
wenzelm
parents:
61566
diff
changeset
|
488 |
Names include local definitions and theorem names. If present, the qualifier |
6d5213bd9709
uniform mandatory qualifier for all locale expressions, including 'statespace' parent;
wenzelm
parents:
61566
diff
changeset
|
489 |
itself is either mandatory (default) or non-mandatory (when followed by |
6d5213bd9709
uniform mandatory qualifier for all locale expressions, including 'statespace' parent;
wenzelm
parents:
61566
diff
changeset
|
490 |
``\<^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:
61566
diff
changeset
|
491 |
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:
61566
diff
changeset
|
492 |
one locale instance subsumes another. |
67740 | 493 |
|
494 |
Rewrite clauses amend instances with equations that act as rewrite rules. |
|
495 |
This is particularly useful for changing concepts introduced through |
|
496 |
definitions. Rewrite clauses are available only in interpretation commands |
|
497 |
(see \secref{sec:locale-interpretation} below) and must be proved the user. |
|
58618 | 498 |
\<close> |
33846 | 499 |
|
500 |
||
58618 | 501 |
subsection \<open>Locale declarations\<close> |
27040 | 502 |
|
58618 | 503 |
text \<open> |
70608 | 504 |
\begin{tabular}{rcll} |
61493 | 505 |
@{command_def "locale"} & : & \<open>theory \<rightarrow> local_theory\<close> \\ |
506 |
@{command_def "experiment"} & : & \<open>theory \<rightarrow> local_theory\<close> \\ |
|
507 |
@{command_def "print_locale"}\<open>\<^sup>*\<close> & : & \<open>context \<rightarrow>\<close> \\ |
|
508 |
@{command_def "print_locales"}\<open>\<^sup>*\<close> & : & \<open>context \<rightarrow>\<close> \\ |
|
509 |
@{command_def "locale_deps"}\<open>\<^sup>*\<close> & : & \<open>context \<rightarrow>\<close> \\ |
|
510 |
@{method_def intro_locales} & : & \<open>method\<close> \\ |
|
511 |
@{method_def unfold_locales} & : & \<open>method\<close> \\ |
|
70608 | 512 |
@{attribute_def trace_locales} & : & \<open>attribute\<close> & default \<open>false\<close> \\ |
513 |
\end{tabular} |
|
27040 | 514 |
|
515 |
\indexisarelem{fixes}\indexisarelem{constrains}\indexisarelem{assumes} |
|
28787 | 516 |
\indexisarelem{defines}\indexisarelem{notes} |
69597 | 517 |
\<^rail>\<open> |
42596
6c621a9d612a
modernized rail diagrams using @{rail} antiquotation;
wenzelm
parents:
41435
diff
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:
59905
diff
changeset
|
524 |
@@{command print_locales} ('!'?) |
9830c944670f
more uniform "verbose" option to print name space;
wenzelm
parents:
59905
diff
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:
41435
diff
changeset
|
531 |
@'constrains' (@{syntax name} '::' @{syntax type} + @'and') | |
6c621a9d612a
modernized rail diagrams using @{rail} antiquotation;
wenzelm
parents:
41435
diff
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') |
69597 | 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:
63680
diff
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:
63680
diff
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:
63680
diff
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 |
|
69018 | 612 |
\<^descr> \<^theory_text>\<open>print_locale "locale"\<close> prints the contents of the named locale. The |
61665 | 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. |
|
70608 | 631 |
|
632 |
\<^descr> @{attribute trace_locales}, when set to |
|
633 |
\<open>true\<close>, prints the locale instances activated during |
|
634 |
roundup. Useful for understanding local theories created by complex |
|
635 |
locale hierarchies. |
|
58618 | 636 |
\<close> |
27040 | 637 |
|
638 |
||
67740 | 639 |
subsection \<open>Locale interpretation \label{sec:locale-interpretation}\<close> |
27040 | 640 |
|
58618 | 641 |
text \<open> |
27040 | 642 |
\begin{matharray}{rcl} |
61673
fd4ac1530d63
represent both algebraic and local-theory views on locale interpretation in interfaces
haftmann
parents:
61671
diff
changeset
|
643 |
@{command "interpretation"} & : & \<open>local_theory \<rightarrow> proof(prove)\<close> \\ |
61493 | 644 |
@{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:
61853
diff
changeset
|
645 |
@{command_def "global_interpretation"} & : & \<open>theory | local_theory \<rightarrow> proof(prove)\<close> \\ |
61493 | 646 |
@{command_def "sublocale"} & : & \<open>theory | local_theory \<rightarrow> proof(prove)\<close> \\ |
647 |
@{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:
61671
diff
changeset
|
648 |
@{command_def "print_interps"}\<open>\<^sup>*\<close> & : & \<open>context \<rightarrow>\<close> \\ |
27040 | 649 |
\end{matharray} |
650 |
||
61664 | 651 |
Locales may be instantiated, and the resulting instantiated declarations |
652 |
added to the current context. This requires proof (of the instantiated |
|
61706 | 653 |
specification) and is called \<^emph>\<open>locale interpretation\<close>. Interpretation is |
654 |
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:
61853
diff
changeset
|
655 |
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:
61853
diff
changeset
|
656 |
into locales (\<^theory_text>\<open>sublocale\<close>). |
47483 | 657 |
|
69597 | 658 |
\<^rail>\<open> |
67740 | 659 |
@@{command interpretation} @{syntax locale_expr} |
27040 | 660 |
; |
67740 | 661 |
@@{command interpret} @{syntax locale_expr} |
27040 | 662 |
; |
67764 | 663 |
@@{command global_interpretation} @{syntax locale_expr} definitions? |
61673
fd4ac1530d63
represent both algebraic and local-theory views on locale interpretation in interfaces
haftmann
parents:
61671
diff
changeset
|
664 |
; |
62969 | 665 |
@@{command sublocale} (@{syntax name} ('<' | '\<subseteq>'))? @{syntax locale_expr} \<newline> |
67764 | 666 |
definitions? |
61673
fd4ac1530d63
represent both algebraic and local-theory views on locale interpretation in interfaces
haftmann
parents:
61671
diff
changeset
|
667 |
; |
42617 | 668 |
@@{command print_dependencies} '!'? @{syntax locale_expr} |
27040 | 669 |
; |
62969 | 670 |
@@{command print_interps} @{syntax name} |
41434
710cdb9e0d17
Documentation for 'interpret' and 'sublocale' with mixins.
ballarin
parents:
41249
diff
changeset
|
671 |
; |
42596
6c621a9d612a
modernized rail diagrams using @{rail} antiquotation;
wenzelm
parents:
41435
diff
changeset
|
672 |
|
61673
fd4ac1530d63
represent both algebraic and local-theory views on locale interpretation in interfaces
haftmann
parents:
61671
diff
changeset
|
673 |
definitions: @'defines' (@{syntax thmdecl}? @{syntax name} \<newline> |
70058 | 674 |
@{syntax mixfix}? '=' @{syntax term} + @'and'); |
69597 | 675 |
\<close> |
27040 | 676 |
|
61706 | 677 |
The core of each interpretation command is a locale expression \<open>expr\<close>; the |
678 |
command generates proof obligations for the instantiated specifications. |
|
679 |
Once these are discharged by the user, instantiated declarations (in |
|
680 |
particular, facts) are added to the context in a post-processing phase, in a |
|
681 |
manner specific to each command. |
|
53368
92b9965f479d
Clarifies documentation of interpretation in local theories.
ballarin
parents:
53015
diff
changeset
|
682 |
|
61706 | 683 |
Interpretation commands are aware of interpretations that are already |
684 |
active: post-processing is achieved through a variant of roundup that takes |
|
61664 | 685 |
interpretations of the current global or local theory into account. In order |
686 |
to simplify the proof obligations according to existing interpretations use |
|
687 |
methods @{method intro_locales} or @{method unfold_locales}. |
|
53368
92b9965f479d
Clarifies documentation of interpretation in local theories.
ballarin
parents:
53015
diff
changeset
|
688 |
|
67764 | 689 |
Rewrites clauses \<^theory_text>\<open>rewrites eqns\<close> occur within expressions. They amend the |
690 |
morphism through which a locale instance is interpreted with rewrite rules, |
|
691 |
also called rewrite morphisms. This is particularly useful for interpreting |
|
692 |
concepts introduced through definitions. The equations must be proved the |
|
693 |
user. To enable syntax of the instantiated locale within the equation, while |
|
694 |
reading a locale expression, equations of a locale instance are read in a |
|
695 |
temporary context where the instance is already activated. If activation |
|
696 |
fails, typically due to duplicate constant declarations, processing falls |
|
697 |
back to reading the equation first. |
|
61673
fd4ac1530d63
represent both algebraic and local-theory views on locale interpretation in interfaces
haftmann
parents:
61671
diff
changeset
|
698 |
|
61706 | 699 |
Given definitions \<open>defs\<close> produce corresponding definitions in the local |
67740 | 700 |
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:
61853
diff
changeset
|
701 |
stemming from the symmetric of those definitions. Hence these need not be |
61706 | 702 |
proved explicitly the user. Such rewrite definitions are a even more useful |
703 |
device for interpreting concepts introduced through definitions, but they |
|
704 |
are only supported for interpretation commands operating in a local theory |
|
61823 | 705 |
whose implementing target actually supports this. Note that despite |
706 |
the suggestive \<^theory_text>\<open>and\<close> connective, \<open>defs\<close> |
|
61891
76189756ff65
documentation on last state of the art concerning interpretation
haftmann
parents:
61853
diff
changeset
|
707 |
are processed sequentially without mutual recursion. |
61673
fd4ac1530d63
represent both algebraic and local-theory views on locale interpretation in interfaces
haftmann
parents:
61671
diff
changeset
|
708 |
|
67740 | 709 |
\<^descr> \<^theory_text>\<open>interpretation expr\<close> interprets \<open>expr\<close> into a local theory |
61706 | 710 |
such that its lifetime is limited to the current context block (e.g. a |
711 |
locale or unnamed context). At the closing @{command end} of the block the |
|
712 |
interpretation and its declarations disappear. Hence facts based on |
|
713 |
interpretation can be established without creating permanent links to the |
|
714 |
interpreted locale instances, as would be the case with @{command |
|
715 |
sublocale}. |
|
61673
fd4ac1530d63
represent both algebraic and local-theory views on locale interpretation in interfaces
haftmann
parents:
61671
diff
changeset
|
716 |
|
61891
76189756ff65
documentation on last state of the art concerning interpretation
haftmann
parents:
61853
diff
changeset
|
717 |
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:
61853
diff
changeset
|
718 |
context block, hence \<^theory_text>\<open>interpretation\<close> behaves identically to |
76189756ff65
documentation on last state of the art concerning interpretation
haftmann
parents:
61853
diff
changeset
|
719 |
\<^theory_text>\<open>global_interpretation\<close> then. |
76189756ff65
documentation on last state of the art concerning interpretation
haftmann
parents:
61853
diff
changeset
|
720 |
|
67740 | 721 |
\<^descr> \<^theory_text>\<open>interpret expr\<close> interprets \<open>expr\<close> into a proof context: |
61706 | 722 |
the interpretation and its declarations disappear when closing the current |
723 |
proof block. Note that for \<^theory_text>\<open>interpret\<close> the \<open>eqns\<close> should be explicitly |
|
724 |
universally quantified. |
|
61673
fd4ac1530d63
represent both algebraic and local-theory views on locale interpretation in interfaces
haftmann
parents:
61671
diff
changeset
|
725 |
|
67764 | 726 |
\<^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:
61853
diff
changeset
|
727 |
into a global theory. |
61673
fd4ac1530d63
represent both algebraic and local-theory views on locale interpretation in interfaces
haftmann
parents:
61671
diff
changeset
|
728 |
|
53369
b4bcac7d065b
Clarifies that interpretation does not only apply to facts, but to declaratoins in general.
ballarin
parents:
53368
diff
changeset
|
729 |
When adding declarations to locales, interpreted versions of these |
61664 | 730 |
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:
61853
diff
changeset
|
731 |
global theory as well. That is, interpretations into global theories |
61664 | 732 |
dynamically participate in any declarations added to locales. |
54049 | 733 |
|
61664 | 734 |
Free variables in the interpreted expression are allowed. They are turned |
735 |
into schematic variables in the generated declarations. In order to use a |
|
736 |
free variable whose name is already bound in the context --- for example, |
|
61665 | 737 |
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:
47484
diff
changeset
|
738 |
|
67764 | 739 |
\<^descr> \<^theory_text>\<open>sublocale name \<subseteq> expr defines defs\<close> interprets \<open>expr\<close> |
61706 | 740 |
into the locale \<open>name\<close>. A proof that the specification of \<open>name\<close> implies the |
741 |
specification of \<open>expr\<close> is required. As in the localized version of the |
|
742 |
theorem command, the proof is in the context of \<open>name\<close>. After the proof |
|
743 |
obligation has been discharged, the locale hierarchy is changed as if \<open>name\<close> |
|
744 |
imported \<open>expr\<close> (hence the name \<^theory_text>\<open>sublocale\<close>). When the context of \<open>name\<close> is |
|
745 |
subsequently entered, traversing the locale hierarchy will involve the |
|
746 |
locale instances of \<open>expr\<close>, and their declarations will be added to the |
|
747 |
context. This makes \<^theory_text>\<open>sublocale\<close> dynamic: extensions of a locale that is |
|
748 |
instantiated in \<open>expr\<close> may take place after the \<^theory_text>\<open>sublocale\<close> declaration and |
|
749 |
still become available in the context. Circular \<^theory_text>\<open>sublocale\<close> declarations |
|
750 |
are allowed as long as they do not lead to infinite chains. |
|
41434
710cdb9e0d17
Documentation for 'interpret' and 'sublocale' with mixins.
ballarin
parents:
41249
diff
changeset
|
751 |
|
61664 | 752 |
If interpretations of \<open>name\<close> exist in the current global theory, the command |
753 |
adds interpretations for \<open>expr\<close> as well, with the same qualifier, although |
|
754 |
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:
41249
diff
changeset
|
755 |
|
67764 | 756 |
Rewrites clauses in the expression or rewrite definitions \<open>defs\<close> can help break |
67740 | 757 |
infinite chains induced by circular \<^theory_text>\<open>sublocale\<close> declarations. |
27040 | 758 |
|
61665 | 759 |
In a named context block the \<^theory_text>\<open>sublocale\<close> command may also be used, but the |
760 |
locale argument must be omitted. The command then refers to the locale (or |
|
761 |
class) target of the context block. |
|
51747 | 762 |
|
61665 | 763 |
\<^descr> \<^theory_text>\<open>print_dependencies expr\<close> is useful for understanding the effect of an |
764 |
interpretation of \<open>expr\<close> in the current context. It lists all locale |
|
765 |
instances for which interpretations would be added to the current context. |
|
766 |
Variant \<^theory_text>\<open>print_dependencies!\<close> does not generalize parameters and assumes an |
|
767 |
empty context --- that is, it prints all locale instances that would be |
|
768 |
considered for interpretation. The latter is useful for understanding the |
|
769 |
dependencies of a locale expression. |
|
41435 | 770 |
|
61665 | 771 |
\<^descr> \<^theory_text>\<open>print_interps locale\<close> lists all interpretations of \<open>locale\<close> in the |
772 |
current theory or proof context, including those due to a combination of an |
|
773 |
\<^theory_text>\<open>interpretation\<close> or \<^theory_text>\<open>interpret\<close> and one or several \<^theory_text>\<open>sublocale\<close> |
|
774 |
declarations. |
|
33867 | 775 |
|
27040 | 776 |
\begin{warn} |
61664 | 777 |
If a global theory inherits declarations (body elements) for a locale from |
778 |
one parent and an interpretation of that locale from another parent, the |
|
779 |
interpretation will not be applied to the declarations. |
|
54049 | 780 |
\end{warn} |
781 |
||
782 |
\begin{warn} |
|
61664 | 783 |
Since attributes are applied to interpreted theorems, interpretation may |
784 |
modify the context of common proof tools, e.g.\ the Simplifier or |
|
61665 | 785 |
Classical Reasoner. As the behaviour of such tools is \<^emph>\<open>not\<close> stable under |
61664 | 786 |
interpretation morphisms, manual declarations might have to be added to |
787 |
the target context of the interpretation to revert such declarations. |
|
27040 | 788 |
\end{warn} |
789 |
||
790 |
\begin{warn} |
|
51747 | 791 |
An interpretation in a local theory or proof context may subsume previous |
61664 | 792 |
interpretations. This happens if the same specification fragment is |
793 |
interpreted twice and the instantiation of the second interpretation is |
|
794 |
more general than the interpretation of the first. The locale package does |
|
795 |
not attempt to remove subsumed interpretations. |
|
27040 | 796 |
\end{warn} |
797 |
||
61673
fd4ac1530d63
represent both algebraic and local-theory views on locale interpretation in interfaces
haftmann
parents:
61671
diff
changeset
|
798 |
\begin{warn} |
fd4ac1530d63
represent both algebraic and local-theory views on locale interpretation in interfaces
haftmann
parents:
61671
diff
changeset
|
799 |
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:
61671
diff
changeset
|
800 |
its result is discarded immediately. |
fd4ac1530d63
represent both algebraic and local-theory views on locale interpretation in interfaces
haftmann
parents:
61671
diff
changeset
|
801 |
\end{warn} |
59003
16d92d37a8a1
documentation stubs about permanent_interpretation
haftmann
parents:
58724
diff
changeset
|
802 |
\<close> |
16d92d37a8a1
documentation stubs about permanent_interpretation
haftmann
parents:
58724
diff
changeset
|
803 |
|
16d92d37a8a1
documentation stubs about permanent_interpretation
haftmann
parents:
58724
diff
changeset
|
804 |
|
58618 | 805 |
section \<open>Classes \label{sec:class}\<close> |
27040 | 806 |
|
58618 | 807 |
text \<open> |
27040 | 808 |
\begin{matharray}{rcl} |
61493 | 809 |
@{command_def "class"} & : & \<open>theory \<rightarrow> local_theory\<close> \\ |
810 |
@{command_def "instantiation"} & : & \<open>theory \<rightarrow> local_theory\<close> \\ |
|
811 |
@{command_def "instance"} & : & \<open>local_theory \<rightarrow> local_theory\<close> \\ |
|
812 |
@{command "instance"} & : & \<open>theory \<rightarrow> proof(prove)\<close> \\ |
|
813 |
@{command_def "subclass"} & : & \<open>local_theory \<rightarrow> local_theory\<close> \\ |
|
814 |
@{command_def "print_classes"}\<open>\<^sup>*\<close> & : & \<open>context \<rightarrow>\<close> \\ |
|
815 |
@{command_def "class_deps"}\<open>\<^sup>*\<close> & : & \<open>context \<rightarrow>\<close> \\ |
|
816 |
@{method_def intro_classes} & : & \<open>method\<close> \\ |
|
27040 | 817 |
\end{matharray} |
818 |
||
61664 | 819 |
A class is a particular locale with \<^emph>\<open>exactly one\<close> type variable \<open>\<alpha>\<close>. Beyond |
820 |
the underlying locale, a corresponding type class is established which is |
|
821 |
interpreted logically as axiomatic type class @{cite "Wenzel:1997:TPHOL"} |
|
822 |
whose logical content are the assumptions of the locale. Thus, classes |
|
823 |
provide the full generality of locales combined with the commodity of type |
|
824 |
classes (notably type-inference). See @{cite "isabelle-classes"} for a short |
|
47483 | 825 |
tutorial. |
826 |
||
69597 | 827 |
\<^rail>\<open> |
42704 | 828 |
@@{command class} class_spec @'begin'? |
829 |
; |
|
830 |
class_spec: @{syntax name} '=' |
|
62969 | 831 |
((@{syntax name} '+' (@{syntax context_elem}+)) | |
832 |
@{syntax name} | (@{syntax context_elem}+)) |
|
27040 | 833 |
; |
62969 | 834 |
@@{command instantiation} (@{syntax name} + @'and') '::' @{syntax arity} @'begin' |
27040 | 835 |
; |
62969 | 836 |
@@{command instance} (() | (@{syntax name} + @'and') '::' @{syntax arity} | |
837 |
@{syntax name} ('<' | '\<subseteq>') @{syntax name} ) |
|
31681 | 838 |
; |
62969 | 839 |
@@{command subclass} @{syntax name} |
58202 | 840 |
; |
60091 | 841 |
@@{command class_deps} (class_bounds class_bounds?)? |
60090 | 842 |
; |
60091 | 843 |
class_bounds: @{syntax sort} | '(' (@{syntax sort} + @'|') ')' |
69597 | 844 |
\<close> |
27040 | 845 |
|
61665 | 846 |
\<^descr> \<^theory_text>\<open>class c = superclasses + body\<close> defines a new class \<open>c\<close>, inheriting from |
847 |
\<open>superclasses\<close>. This introduces a locale \<open>c\<close> with import of all locales |
|
848 |
\<open>superclasses\<close>. |
|
27040 | 849 |
|
61664 | 850 |
Any @{element "fixes"} in \<open>body\<close> are lifted to the global theory level |
851 |
(\<^emph>\<open>class operations\<close> \<open>f\<^sub>1, \<dots>, f\<^sub>n\<close> of class \<open>c\<close>), mapping the local type |
|
852 |
parameter \<open>\<alpha>\<close> to a schematic type variable \<open>?\<alpha> :: c\<close>. |
|
27040 | 853 |
|
61664 | 854 |
Likewise, @{element "assumes"} in \<open>body\<close> are also lifted, mapping each local |
855 |
parameter \<open>f :: \<tau>[\<alpha>]\<close> to its corresponding global constant \<open>f :: \<tau>[?\<alpha> :: |
|
856 |
c]\<close>. The corresponding introduction rule is provided as |
|
857 |
\<open>c_class_axioms.intro\<close>. This rule should be rarely needed directly --- the |
|
858 |
@{method intro_classes} method takes care of the details of class membership |
|
859 |
proofs. |
|
27040 | 860 |
|
61665 | 861 |
\<^descr> \<^theory_text>\<open>instantiation t :: (s\<^sub>1, \<dots>, s\<^sub>n)s begin\<close> opens a target (cf.\ |
862 |
\secref{sec:target}) which allows to specify class operations \<open>f\<^sub>1, \<dots>, f\<^sub>n\<close> |
|
863 |
corresponding to sort \<open>s\<close> at the particular type instance \<open>(\<alpha>\<^sub>1 :: s\<^sub>1, \<dots>, |
|
864 |
\<alpha>\<^sub>n :: s\<^sub>n) t\<close>. A plain \<^theory_text>\<open>instance\<close> command in the target body poses a goal |
|
865 |
stating these type arities. The target is concluded by an @{command_ref |
|
866 |
(local) "end"} command. |
|
27040 | 867 |
|
61664 | 868 |
Note that a list of simultaneous type constructors may be given; this |
869 |
corresponds nicely to mutually recursive type definitions, e.g.\ in |
|
870 |
Isabelle/HOL. |
|
27040 | 871 |
|
61665 | 872 |
\<^descr> \<^theory_text>\<open>instance\<close> in an instantiation target body sets up a goal stating the |
873 |
type arities claimed at the opening \<^theory_text>\<open>instantiation\<close>. The proof would |
|
874 |
usually proceed by @{method intro_classes}, and then establish the |
|
875 |
characteristic theorems of the type classes involved. After finishing the |
|
876 |
proof, the background theory will be augmented by the proven type arities. |
|
31681 | 877 |
|
61665 | 878 |
On the theory level, \<^theory_text>\<open>instance t :: (s\<^sub>1, \<dots>, s\<^sub>n)s\<close> provides a convenient |
879 |
way to instantiate a type class with no need to specify operations: one can |
|
880 |
continue with the instantiation proof immediately. |
|
27040 | 881 |
|
61665 | 882 |
\<^descr> \<^theory_text>\<open>subclass c\<close> in a class context for class \<open>d\<close> sets up a goal stating that |
883 |
class \<open>c\<close> is logically contained in class \<open>d\<close>. After finishing the proof, |
|
884 |
class \<open>d\<close> is proven to be subclass \<open>c\<close> and the locale \<open>c\<close> is interpreted |
|
885 |
into \<open>d\<close> simultaneously. |
|
31681 | 886 |
|
61664 | 887 |
A weakened form of this is available through a further variant of @{command |
61665 | 888 |
instance}: \<^theory_text>\<open>instance c\<^sub>1 \<subseteq> c\<^sub>2\<close> opens a proof that class \<open>c\<^sub>2\<close> implies |
889 |
\<open>c\<^sub>1\<close> without reference to the underlying locales; this is useful if the |
|
890 |
properties to prove the logical connection are not sufficient on the locale |
|
891 |
level but on the theory level. |
|
61664 | 892 |
|
61665 | 893 |
\<^descr> \<^theory_text>\<open>print_classes\<close> prints all classes in the current theory. |
27040 | 894 |
|
61665 | 895 |
\<^descr> \<^theory_text>\<open>class_deps\<close> visualizes classes and their subclass relations as a |
896 |
directed acyclic graph. By default, all classes from the current theory |
|
61664 | 897 |
context are show. This may be restricted by optional bounds as follows: |
61665 | 898 |
\<^theory_text>\<open>class_deps upper\<close> or \<^theory_text>\<open>class_deps upper lower\<close>. A class is visualized, iff |
899 |
it is a subclass of some sort from \<open>upper\<close> and a superclass of some sort |
|
900 |
from \<open>lower\<close>. |
|
29706 | 901 |
|
61664 | 902 |
\<^descr> @{method intro_classes} repeatedly expands all class introduction rules of |
903 |
this theory. Note that this method usually needs not be named explicitly, as |
|
61665 | 904 |
it is already included in the default proof step (e.g.\ of \<^theory_text>\<open>proof\<close>). In |
905 |
particular, instantiation of trivial (syntactic) classes may be performed by |
|
906 |
a single ``\<^theory_text>\<open>..\<close>'' proof step. |
|
58618 | 907 |
\<close> |
26870 | 908 |
|
27040 | 909 |
|
58618 | 910 |
subsection \<open>The class target\<close> |
27040 | 911 |
|
58618 | 912 |
text \<open> |
27040 | 913 |
%FIXME check |
914 |
||
61664 | 915 |
A named context may refer to a locale (cf.\ \secref{sec:target}). If this |
916 |
locale is also a class \<open>c\<close>, apart from the common locale target behaviour |
|
917 |
the following happens. |
|
27040 | 918 |
|
61664 | 919 |
\<^item> Local constant declarations \<open>g[\<alpha>]\<close> referring to the local type parameter |
920 |
\<open>\<alpha>\<close> and local parameters \<open>f[\<alpha>]\<close> are accompanied by theory-level constants |
|
921 |
\<open>g[?\<alpha> :: c]\<close> referring to theory-level class operations \<open>f[?\<alpha> :: c]\<close>. |
|
27040 | 922 |
|
61664 | 923 |
\<^item> Local theorem bindings are lifted as are assumptions. |
27040 | 924 |
|
61664 | 925 |
\<^item> Local syntax refers to local operations \<open>g[\<alpha>]\<close> and global operations |
926 |
\<open>g[?\<alpha> :: c]\<close> uniformly. Type inference resolves ambiguities. In rare |
|
927 |
cases, manual type annotations are needed. |
|
58618 | 928 |
\<close> |
27040 | 929 |
|
930 |
||
58618 | 931 |
subsection \<open>Co-regularity of type classes and arities\<close> |
37768
e86221f3bac7
moved co-regularity to class section; avoid duplicated class_deps
haftmann
parents:
37112
diff
changeset
|
932 |
|
61664 | 933 |
text \<open> |
934 |
The class relation together with the collection of type-constructor arities |
|
935 |
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:
37112
diff
changeset
|
936 |
|
61421 | 937 |
\<^medskip> |
61664 | 938 |
For the subsequent formulation of co-regularity we assume that the class |
939 |
relation is closed by transitivity and reflexivity. Moreover the collection |
|
940 |
of arities \<open>t :: (\<^vec>s)c\<close> is completed such that \<open>t :: (\<^vec>s)c\<close> and |
|
941 |
\<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:
37112
diff
changeset
|
942 |
|
61664 | 943 |
Treating sorts as finite sets of classes (meaning the intersection), the |
944 |
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:
37112
diff
changeset
|
945 |
\[ |
61493 | 946 |
\<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:
37112
diff
changeset
|
947 |
\] |
e86221f3bac7
moved co-regularity to class section; avoid duplicated class_deps
haftmann
parents:
37112
diff
changeset
|
948 |
|
61664 | 949 |
This relation on sorts is further extended to tuples of sorts (of the same |
950 |
length) in the component-wise way. |
|
37768
e86221f3bac7
moved co-regularity to class section; avoid duplicated class_deps
haftmann
parents:
37112
diff
changeset
|
951 |
|
61421 | 952 |
\<^medskip> |
61664 | 953 |
Co-regularity of the class relation together with the arities relation |
954 |
means: |
|
37768
e86221f3bac7
moved co-regularity to class section; avoid duplicated class_deps
haftmann
parents:
37112
diff
changeset
|
955 |
\[ |
61493 | 956 |
\<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:
37112
diff
changeset
|
957 |
\] |
61664 | 958 |
for all such arities. In other words, whenever the result classes of some |
959 |
type-constructor arities are related, then the argument sorts need to be |
|
960 |
related in the same way. |
|
37768
e86221f3bac7
moved co-regularity to class section; avoid duplicated class_deps
haftmann
parents:
37112
diff
changeset
|
961 |
|
61421 | 962 |
\<^medskip> |
61664 | 963 |
Co-regularity is a very fundamental property of the order-sorted algebra of |
964 |
types. For example, it entails principle types and most general unifiers, |
|
965 |
e.g.\ see @{cite "nipkow-prehofer"}. |
|
58618 | 966 |
\<close> |
37768
e86221f3bac7
moved co-regularity to class section; avoid duplicated class_deps
haftmann
parents:
37112
diff
changeset
|
967 |
|
e86221f3bac7
moved co-regularity to class section; avoid duplicated class_deps
haftmann
parents:
37112
diff
changeset
|
968 |
|
62172
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
969 |
section \<open>Overloaded constant definitions \label{sec:overloading}\<close> |
27040 | 970 |
|
58618 | 971 |
text \<open> |
62172
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
972 |
Definitions essentially express abbreviations within the logic. The simplest |
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
973 |
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:
61891
diff
changeset
|
974 |
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:
61891
diff
changeset
|
975 |
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:
61891
diff
changeset
|
976 |
type \<open>\<sigma>\<close>. |
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
977 |
|
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
978 |
\<^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:
61891
diff
changeset
|
979 |
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:
61891
diff
changeset
|
980 |
type constructor \<open>\<kappa>\<close>. At most occasions overloading will be used in a |
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
981 |
Haskell-like fashion together with type classes by means of \<^theory_text>\<open>instantiation\<close> |
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
982 |
(see \secref{sec:class}). Sometimes low-level overloading is desirable; this |
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
983 |
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:
61891
diff
changeset
|
984 |
|
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
985 |
The right-hand side of overloaded definitions may mention overloaded |
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
986 |
constants recursively at type instances corresponding to the immediate |
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
987 |
argument types \<open>\<beta>\<^sub>1, \<dots>, \<beta>\<^sub>n\<close>. Incomplete specification patterns impose |
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
988 |
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:
61891
diff
changeset
|
989 |
side means that all corresponding occurrences on some right-hand side need |
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
990 |
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:
61891
diff
changeset
|
991 |
details are given by Kun\v{c}ar @{cite "Kuncar:2015"}. |
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
992 |
|
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
993 |
\<^medskip> |
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
994 |
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:
61891
diff
changeset
|
995 |
interface for end-users. Regular specification elements such as @{command |
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
996 |
definition}, @{command inductive}, @{command function} may be used in the |
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
997 |
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:
61891
diff
changeset
|
998 |
\<equiv> c :: \<sigma>\<close> to keep the declaration and definition of a constant separate. |
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
999 |
|
47483 | 1000 |
\begin{matharray}{rcl} |
62172
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
1001 |
@{command_def "consts"} & : & \<open>theory \<rightarrow> theory\<close> \\ |
61493 | 1002 |
@{command_def "overloading"} & : & \<open>theory \<rightarrow> local_theory\<close> \\ |
47483 | 1003 |
\end{matharray} |
1004 |
||
69597 | 1005 |
\<^rail>\<open> |
62172
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
1006 |
@@{command consts} ((@{syntax name} '::' @{syntax type} @{syntax mixfix}?) +) |
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
1007 |
; |
42704 | 1008 |
@@{command overloading} ( spec + ) @'begin' |
1009 |
; |
|
62172
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
1010 |
spec: @{syntax name} ( '\<equiv>' | '==' ) @{syntax term} ( '(' @'unchecked' ')' )? |
69597 | 1011 |
\<close> |
27040 | 1012 |
|
62172
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
1013 |
\<^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:
61891
diff
changeset
|
1014 |
\<open>\<sigma>\<close>. The optional mixfix annotations may attach concrete syntax to the |
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
1015 |
constants declared. |
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
1016 |
|
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
1017 |
\<^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:
61891
diff
changeset
|
1018 |
a theory target (cf.\ \secref{sec:target}) which allows to specify already |
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
1019 |
declared constants via definitions in the body. These are identified by an |
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
1020 |
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:
61891
diff
changeset
|
1021 |
particular type instances. The definitions themselves are established using |
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
1022 |
common specification tools, using the names \<open>x\<^sub>i\<close> as reference to the |
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
1023 |
corresponding constants. |
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
1024 |
|
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
1025 |
Option \<^theory_text>\<open>(unchecked)\<close> disables global dependency checks for the |
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
1026 |
corresponding definition, which is occasionally useful for exotic |
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
1027 |
overloading; this is a form of axiomatic specification. It is at the |
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
1028 |
discretion of the user to avoid malformed theory specifications! |
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
1029 |
\<close> |
27040 | 1030 |
|
62172
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
1031 |
|
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
1032 |
subsubsection \<open>Example\<close> |
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
1033 |
|
62173 | 1034 |
consts Length :: "'a \<Rightarrow> nat" |
62172
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
1035 |
|
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
1036 |
overloading |
62173 | 1037 |
Length\<^sub>0 \<equiv> "Length :: unit \<Rightarrow> nat" |
1038 |
Length\<^sub>1 \<equiv> "Length :: 'a \<times> unit \<Rightarrow> nat" |
|
1039 |
Length\<^sub>2 \<equiv> "Length :: 'a \<times> 'b \<times> unit \<Rightarrow> nat" |
|
1040 |
Length\<^sub>3 \<equiv> "Length :: 'a \<times> 'b \<times> 'c \<times> unit \<Rightarrow> nat" |
|
62172
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
1041 |
begin |
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
1042 |
|
62173 | 1043 |
fun Length\<^sub>0 :: "unit \<Rightarrow> nat" where "Length\<^sub>0 () = 0" |
1044 |
fun Length\<^sub>1 :: "'a \<times> unit \<Rightarrow> nat" where "Length\<^sub>1 (a, ()) = 1" |
|
1045 |
fun Length\<^sub>2 :: "'a \<times> 'b \<times> unit \<Rightarrow> nat" where "Length\<^sub>2 (a, b, ()) = 2" |
|
1046 |
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:
61891
diff
changeset
|
1047 |
|
7eaeae127955
updated section on "Overloaded constant definitions";
wenzelm
parents:
61891
diff
changeset
|
1048 |
end |
27040 | 1049 |
|
62173 | 1050 |
lemma "Length (a, b, c, ()) = 3" by simp |
1051 |
lemma "Length ((a, b), (c, d), ()) = 2" by simp |
|
1052 |
lemma "Length ((a, b, c, d, e), ()) = 1" by simp |
|
1053 |
||
27040 | 1054 |
|
58618 | 1055 |
section \<open>Incorporating ML code \label{sec:ML}\<close> |
27040 | 1056 |
|
58618 | 1057 |
text \<open> |
27040 | 1058 |
\begin{matharray}{rcl} |
62862 | 1059 |
@{command_def "SML_file"} & : & \<open>local_theory \<rightarrow> local_theory\<close> \\ |
62903 | 1060 |
@{command_def "SML_file_debug"} & : & \<open>local_theory \<rightarrow> local_theory\<close> \\ |
1061 |
@{command_def "SML_file_no_debug"} & : & \<open>local_theory \<rightarrow> local_theory\<close> \\ |
|
61493 | 1062 |
@{command_def "ML_file"} & : & \<open>local_theory \<rightarrow> local_theory\<close> \\ |
62903 | 1063 |
@{command_def "ML_file_debug"} & : & \<open>local_theory \<rightarrow> local_theory\<close> \\ |
1064 |
@{command_def "ML_file_no_debug"} & : & \<open>local_theory \<rightarrow> local_theory\<close> \\ |
|
61493 | 1065 |
@{command_def "ML"} & : & \<open>local_theory \<rightarrow> local_theory\<close> \\ |
68276 | 1066 |
@{command_def "ML_export"} & : & \<open>local_theory \<rightarrow> local_theory\<close> \\ |
61493 | 1067 |
@{command_def "ML_prf"} & : & \<open>proof \<rightarrow> proof\<close> \\ |
1068 |
@{command_def "ML_val"} & : & \<open>any \<rightarrow>\<close> \\ |
|
1069 |
@{command_def "ML_command"} & : & \<open>any \<rightarrow>\<close> \\ |
|
1070 |
@{command_def "setup"} & : & \<open>theory \<rightarrow> theory\<close> \\ |
|
1071 |
@{command_def "local_setup"} & : & \<open>local_theory \<rightarrow> local_theory\<close> \\ |
|
1072 |
@{command_def "attribute_setup"} & : & \<open>local_theory \<rightarrow> local_theory\<close> \\ |
|
28760
cbc435f7b16b
unified use of declaration environment with IsarImplementation;
wenzelm
parents:
28758
diff
changeset
|
1073 |
\end{matharray} |
57478 | 1074 |
\begin{tabular}{rcll} |
61493 | 1075 |
@{attribute_def ML_print_depth} & : & \<open>attribute\<close> & default 10 \\ |
1076 |
@{attribute_def ML_source_trace} & : & \<open>attribute\<close> & default \<open>false\<close> \\ |
|
62903 | 1077 |
@{attribute_def ML_debugger} & : & \<open>attribute\<close> & default \<open>false\<close> \\ |
61493 | 1078 |
@{attribute_def ML_exception_trace} & : & \<open>attribute\<close> & default \<open>false\<close> \\ |
62903 | 1079 |
@{attribute_def ML_exception_debugger} & : & \<open>attribute\<close> & default \<open>false\<close> \\ |
70260 | 1080 |
@{attribute_def ML_environment} & : & \<open>attribute\<close> & default \<open>Isabelle\<close> \\ |
57478 | 1081 |
\end{tabular} |
28760
cbc435f7b16b
unified use of declaration environment with IsarImplementation;
wenzelm
parents:
28758
diff
changeset
|
1082 |
|
69597 | 1083 |
\<^rail>\<open> |
62903 | 1084 |
(@@{command SML_file} | |
1085 |
@@{command SML_file_debug} | |
|
1086 |
@@{command SML_file_no_debug} | |
|
1087 |
@@{command ML_file} | |
|
1088 |
@@{command ML_file_debug} | |
|
62969 | 1089 |
@@{command ML_file_no_debug}) @{syntax name} ';'? |
27040 | 1090 |
; |
68276 | 1091 |
(@@{command ML} | @@{command ML_export} | @@{command ML_prf} | |
1092 |
@@{command ML_val} | @@{command ML_command} | @@{command setup} | |
|
1093 |
@@{command local_setup}) @{syntax text} |
|
27040 | 1094 |
; |
59783
00b62aa9f430
tuned syntax diagrams -- no duplication of "target";
wenzelm
parents:
59781
diff
changeset
|
1095 |
@@{command attribute_setup} @{syntax name} '=' @{syntax text} @{syntax text}? |
69597 | 1096 |
\<close> |
27040 | 1097 |
|
61665 | 1098 |
\<^descr> \<^theory_text>\<open>SML_file name\<close> reads and evaluates the given Standard ML file. Top-level |
62862 | 1099 |
SML bindings are stored within the (global or local) theory context; the |
1100 |
initial environment is restricted to the Standard ML implementation of |
|
1101 |
Poly/ML, without the many add-ons of Isabelle/ML. Multiple \<^theory_text>\<open>SML_file\<close> |
|
1102 |
commands may be used to build larger Standard ML projects, independently of |
|
1103 |
the regular Isabelle/ML environment. |
|
56275
600f432ab556
added command 'SML_file' for Standard ML without Isabelle/ML add-ons;
wenzelm
parents:
55837
diff
changeset
|
1104 |
|
61665 | 1105 |
\<^descr> \<^theory_text>\<open>ML_file name\<close> reads and evaluates the given ML file. The current theory |
69597 | 1106 |
context is passed down to the ML toplevel and may be modified, using \<^ML>\<open>Context.>>\<close> or derived ML commands. Top-level ML bindings are stored |
61665 | 1107 |
within the (global or local) theory context. |
62903 | 1108 |
|
1109 |
\<^descr> \<^theory_text>\<open>SML_file_debug\<close>, \<^theory_text>\<open>SML_file_no_debug\<close>, \<^theory_text>\<open>ML_file_debug\<close>, and |
|
1110 |
\<^theory_text>\<open>ML_file_no_debug\<close> change the @{attribute ML_debugger} option locally while |
|
1111 |
the given file is compiled. |
|
1112 |
||
68276 | 1113 |
\<^descr> \<^theory_text>\<open>ML\<close> is similar to \<^theory_text>\<open>ML_file\<close>, but evaluates directly the given \<open>text\<close>. |
1114 |
Top-level ML bindings are stored within the (global or local) theory |
|
61665 | 1115 |
context. |
28281 | 1116 |
|
68276 | 1117 |
\<^descr> \<^theory_text>\<open>ML_export\<close> is similar to \<^theory_text>\<open>ML\<close>, but the resulting toplevel bindings are |
1118 |
exported to the global bootstrap environment of the ML process --- it has |
|
68278 | 1119 |
a lasting effect that cannot be retracted. This allows ML evaluation |
68276 | 1120 |
without a formal theory context, e.g. for command-line tools via @{tool |
1121 |
process} @{cite "isabelle-system"}. |
|
1122 |
||
61665 | 1123 |
\<^descr> \<^theory_text>\<open>ML_prf\<close> is analogous to \<^theory_text>\<open>ML\<close> but works within a proof context. |
1124 |
Top-level ML bindings are stored within the proof context in a purely |
|
1125 |
sequential fashion, disregarding the nested proof structure. ML bindings |
|
1126 |
introduced by \<^theory_text>\<open>ML_prf\<close> are discarded at the end of the proof. |
|
27040 | 1127 |
|
61665 | 1128 |
\<^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 |
1129 |
that the context may not be updated. \<^theory_text>\<open>ML_val\<close> echos the bindings produced |
|
1130 |
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:
63680
diff
changeset
|
1131 |
|
61665 | 1132 |
\<^descr> \<^theory_text>\<open>setup "text"\<close> changes the current theory context by applying \<open>text\<close>, |
69597 | 1133 |
which refers to an ML expression of type \<^ML_type>\<open>theory -> theory\<close>. This |
61665 | 1134 |
enables to initialize any object-logic specific tools and packages written |
1135 |
in ML, for example. |
|
30461 | 1136 |
|
61665 | 1137 |
\<^descr> \<^theory_text>\<open>local_setup\<close> is similar to \<^theory_text>\<open>setup\<close> for a local theory context, and an |
69597 | 1138 |
ML expression of type \<^ML_type>\<open>local_theory -> local_theory\<close>. This allows |
61665 | 1139 |
to invoke local theory specification packages without going through concrete |
1140 |
outer syntax, for example. |
|
28758 | 1141 |
|
61665 | 1142 |
\<^descr> \<^theory_text>\<open>attribute_setup name = "text" description\<close> defines an attribute in the |
1143 |
current context. The given \<open>text\<close> has to be an ML expression of type |
|
69597 | 1144 |
\<^ML_type>\<open>attribute context_parser\<close>, cf.\ basic parsers defined in |
1145 |
structure \<^ML_structure>\<open>Args\<close> and \<^ML_structure>\<open>Attrib\<close>. |
|
30526 | 1146 |
|
1147 |
In principle, attributes can operate both on a given theorem and the |
|
61664 | 1148 |
implicit context, although in practice only one is modified and the other |
1149 |
serves as parameter. Here are examples for these two cases: |
|
58618 | 1150 |
\<close> |
30526 | 1151 |
|
59905 | 1152 |
(*<*)experiment begin(*>*) |
62903 | 1153 |
attribute_setup my_rule = |
1154 |
\<open>Attrib.thms >> (fn ths => |
|
1155 |
Thm.rule_attribute ths |
|
1156 |
(fn context: Context.generic => fn th: thm => |
|
1157 |
let val th' = th OF ths |
|
1158 |
in th' end))\<close> |
|
30526 | 1159 |
|
62903 | 1160 |
attribute_setup my_declaration = |
1161 |
\<open>Attrib.thms >> (fn ths => |
|
1162 |
Thm.declaration_attribute |
|
1163 |
(fn th: thm => fn context: Context.generic => |
|
1164 |
let val context' = context |
|
1165 |
in context' end))\<close> |
|
59905 | 1166 |
(*<*)end(*>*) |
30526 | 1167 |
|
58618 | 1168 |
text \<open> |
61664 | 1169 |
\<^descr> @{attribute ML_print_depth} controls the printing depth of the ML toplevel |
62903 | 1170 |
pretty printer. Typically the limit should be less than 10. Bigger values |
1171 |
such as 100--1000 are occasionally useful for debugging. |
|
57478 | 1172 |
|
61664 | 1173 |
\<^descr> @{attribute ML_source_trace} indicates whether the source text that is |
1174 |
given to the ML compiler should be output: it shows the raw Standard ML |
|
57478 | 1175 |
after expansion of Isabelle/ML antiquotations. |
1176 |
||
62903 | 1177 |
\<^descr> @{attribute ML_debugger} controls compilation of sources with or without |
1178 |
debugging information. The global system option @{system_option_ref |
|
1179 |
ML_debugger} does the same when building a session image. It is also |
|
1180 |
possible use commands like \<^theory_text>\<open>ML_file_debug\<close> etc. The ML debugger is |
|
1181 |
explained further in @{cite "isabelle-jedit"}. |
|
1182 |
||
61664 | 1183 |
\<^descr> @{attribute ML_exception_trace} indicates whether the ML run-time system |
1184 |
should print a detailed stack trace on exceptions. The result is dependent |
|
62903 | 1185 |
on various ML compiler optimizations. The boundary for the exception trace |
1186 |
is the current Isar command transactions: it is occasionally better to |
|
69597 | 1187 |
insert the combinator \<^ML>\<open>Runtime.exn_trace\<close> into ML code for debugging |
62903 | 1188 |
@{cite "isabelle-implementation"}, closer to the point where it actually |
1189 |
happens. |
|
57478 | 1190 |
|
62903 | 1191 |
\<^descr> @{attribute ML_exception_debugger} controls detailed exception trace via |
1192 |
the Poly/ML debugger, at the cost of extra compile-time and run-time |
|
1193 |
overhead. Relevant ML modules need to be compiled beforehand with debugging |
|
1194 |
enabled, see @{attribute ML_debugger} above. |
|
70260 | 1195 |
|
1196 |
\<^descr> @{attribute ML_environment} determines the named ML environment for |
|
1197 |
toplevel declarations, e.g.\ in command \<^theory_text>\<open>ML\<close> or \<^theory_text>\<open>ML_file\<close>. The following |
|
1198 |
ML environments are predefined in Isabelle/Pure: |
|
1199 |
||
1200 |
\<^item> \<open>Isabelle\<close> for Isabelle/ML. It contains all modules of Isabelle/Pure and |
|
1201 |
further add-ons, e.g. material from Isabelle/HOL. |
|
1202 |
||
1203 |
\<^item> \<open>SML\<close> for official Standard ML. It contains only the initial basis |
|
1204 |
according to \<^url>\<open>http://sml-family.org/Basis/overview.html\<close>. |
|
1205 |
||
1206 |
The Isabelle/ML function \<^ML>\<open>ML_Env.setup\<close> defines a new ML environment. |
|
1207 |
This is useful to incorporate big SML projects in an isolated name space, |
|
1208 |
possibly with variations on ML syntax; the existing setup of |
|
1209 |
\<^ML>\<open>ML_Env.SML_operations\<close> follows the official standard. |
|
1210 |
||
1211 |
It is also possible to move toplevel bindings between ML environments, using |
|
1212 |
a notation with ``\<open>>\<close>'' as separator. For example: |
|
58618 | 1213 |
\<close> |
57478 | 1214 |
|
70260 | 1215 |
(*<*)experiment begin(*>*) |
1216 |
declare [[ML_environment = "Isabelle>SML"]] |
|
1217 |
ML \<open>val println = writeln\<close> |
|
1218 |
||
1219 |
declare [[ML_environment = "SML"]] |
|
1220 |
ML \<open>println "test"\<close> |
|
1221 |
||
1222 |
declare [[ML_environment = "Isabelle"]] |
|
1223 |
ML \<open>ML \<open>println\<close> (*bad*) handle ERROR msg => warning msg\<close> |
|
1224 |
(*<*)end(*>*) |
|
1225 |
||
27040 | 1226 |
|
70261 | 1227 |
section \<open>Generated files and exported files\<close> |
66757 | 1228 |
|
1229 |
text \<open> |
|
70057 | 1230 |
Write access to the physical file-system is incompatible with the stateless |
70261 | 1231 |
model of processing Isabelle documents. To avoid bad effects, the following |
1232 |
concepts for abstract file-management are provided by Isabelle: |
|
1233 |
||
1234 |
\<^descr>[Generated files] are stored within the theory context in Isabelle/ML. |
|
1235 |
This allows to operate on the content in Isabelle/ML, e.g. via the command |
|
1236 |
@{command compile_generated_files}. |
|
1237 |
||
1238 |
\<^descr>[Exported files] are stored within the session database in |
|
1239 |
Isabelle/Scala. This allows to deliver artefacts to external tools, see |
|
1240 |
also @{cite "isabelle-system"} for session \<^verbatim>\<open>ROOT\<close> declaration |
|
1241 |
\<^theory_text>\<open>export_files\<close>, and @{tool build} option \<^verbatim>\<open>-e\<close>. |
|
1242 |
||
1243 |
A notable example is the command @{command_ref export_code} |
|
1244 |
(\chref{ch:export-code}): it uses both concepts simultaneously. |
|
1245 |
||
1246 |
File names are hierarchically structured, using a slash as separator. The |
|
1247 |
(long) theory name is used as a prefix: the resulting name needs to be |
|
1248 |
globally unique. |
|
70057 | 1249 |
|
1250 |
\begin{matharray}{rcll} |
|
1251 |
@{command_def "generate_file"} & : & \<open>local_theory \<rightarrow> local_theory\<close> \\ |
|
1252 |
@{command_def "export_generated_files"} & : & \<open>context \<rightarrow>\<close> \\ |
|
1253 |
@{command_def "compile_generated_files"} & : & \<open>context \<rightarrow>\<close> \\ |
|
66757 | 1254 |
@{command_def "external_file"} & : & \<open>any \<rightarrow> any\<close> \\ |
1255 |
\end{matharray} |
|
1256 |
||
70057 | 1257 |
\<^rail>\<open> |
1258 |
@@{command generate_file} path '=' content |
|
1259 |
; |
|
1260 |
path: @{syntax embedded} |
|
1261 |
; |
|
1262 |
content: @{syntax embedded} |
|
1263 |
; |
|
1264 |
@@{command export_generated_files} (files_in_theory + @'and') |
|
1265 |
; |
|
1266 |
files_in_theory: (@'_' | (path+)) (('(' @'in' @{syntax name} ')')?) |
|
1267 |
; |
|
1268 |
@@{command compile_generated_files} (files_in_theory + @'and') \<newline> |
|
1269 |
(@'external_files' (external_files + @'and'))? \<newline> |
|
1270 |
(@'export_files' (export_files + @'and'))? \<newline> |
|
1271 |
(@'export_prefix' path)? |
|
1272 |
; |
|
1273 |
external_files: (path+) (('(' @'in' path ')')?) |
|
1274 |
; |
|
1275 |
export_files: (path+) (executable?) |
|
1276 |
; |
|
1277 |
executable: '(' ('exe' | 'executable') ')' |
|
1278 |
; |
|
1279 |
@@{command external_file} @{syntax name} ';'? |
|
1280 |
\<close> |
|
1281 |
||
1282 |
\<^descr> \<^theory_text>\<open>generate_file path = content\<close> augments the table of generated files |
|
1283 |
within the current theory by a new entry: duplicates are not allowed. The |
|
1284 |
name extension determines a pre-existent file-type; the \<open>content\<close> is a |
|
1285 |
string that is preprocessed according to rules of this file-type. |
|
1286 |
||
1287 |
For example, Isabelle/Pure supports \<^verbatim>\<open>.hs\<close> as file-type for Haskell: |
|
1288 |
embedded cartouches are evaluated as Isabelle/ML expressions of type |
|
1289 |
\<^ML_type>\<open>string\<close>, the result is inlined in Haskell string syntax. |
|
1290 |
||
1291 |
\<^descr> \<^theory_text>\<open>export_generated_files paths (in thy)\<close> retrieves named generated files |
|
1292 |
from the given theory (that needs be reachable via imports of the current |
|
1293 |
one). By default, the current theory node is used. Using ``\<^verbatim>\<open>_\<close>'' |
|
1294 |
(underscore) instead of explicit path names refers to \emph{all} files of a |
|
1295 |
theory node. |
|
1296 |
||
1297 |
The overall list of files is prefixed with the respective (long) theory name |
|
1298 |
and exported to the session database. In Isabelle/jEdit the result can be |
|
1299 |
browsed via the virtual file-system with prefix ``\<^verbatim>\<open>isabelle-export:\<close>'' |
|
1300 |
(using the regular file-browser). |
|
1301 |
||
1302 |
\<^descr> \<^theory_text>\<open>compile_generated_files paths (in thy) where compile_body\<close> retrieves |
|
1303 |
named generated files as for \<^theory_text>\<open>export_generated_files\<close> and writes them into |
|
1304 |
a temporary directory, such that the \<open>compile_body\<close> may operate on them as |
|
1305 |
an ML function of type \<^ML_type>\<open>Path.T -> unit\<close>. This may create further |
|
1306 |
files, e.g.\ executables produced by a compiler that is invoked as external |
|
1307 |
process (e.g.\ via \<^ML>\<open>Isabelle_System.bash\<close>), or any other files. |
|
1308 |
||
1309 |
The option ``\<^theory_text>\<open>external_files paths (in base_dir)\<close>'' copies files from the |
|
1310 |
physical file-system into the temporary directory, \emph{before} invoking |
|
1311 |
\<open>compile_body\<close>. The \<open>base_dir\<close> prefix is removed from each of the \<open>paths\<close>, |
|
1312 |
but the remaining sub-directory structure is reconstructed in the target |
|
1313 |
directory. |
|
1314 |
||
1315 |
The option ``\<^theory_text>\<open>export_files paths\<close>'' exports the specified files from the |
|
1316 |
temporary directory to the session database, \emph{after} invoking |
|
1317 |
\<open>compile_body\<close>. Entries may be decorated with ``\<^theory_text>\<open>(exe)\<close>'' to say that it is |
|
1318 |
a platform-specific executable program: the executable file-attribute will |
|
1319 |
be set, and on Windows the \<^verbatim>\<open>.exe\<close> file-extension will be included; |
|
1320 |
``\<^theory_text>\<open>(executable)\<close>'' only refers to the file-attribute, without special |
|
1321 |
treatment of the \<^verbatim>\<open>.exe\<close> extension. |
|
1322 |
||
1323 |
The option ``\<^theory_text>\<open>export_prefix path\<close>'' specifies an extra path prefix for all |
|
1324 |
exports of \<^theory_text>\<open>export_files\<close> above. |
|
66757 | 1325 |
|
1326 |
\<^descr> \<^theory_text>\<open>external_file name\<close> declares the formal dependency on the given file |
|
1327 |
name, such that the Isabelle build process knows about it (see also @{cite |
|
70057 | 1328 |
"isabelle-system"}). This is required for any files mentioned in |
1329 |
\<^theory_text>\<open>compile_generated_files / external_files\<close> above, in order to document |
|
1330 |
source dependencies properly. It is also possible to use \<^theory_text>\<open>external_file\<close> |
|
1331 |
alone, e.g.\ when other Isabelle/ML tools use \<^ML>\<open>File.read\<close>, without |
|
1332 |
specific management of content by the Prover IDE. |
|
66757 | 1333 |
\<close> |
1334 |
||
1335 |
||
58618 | 1336 |
section \<open>Primitive specification elements\<close> |
27040 | 1337 |
|
58618 | 1338 |
subsection \<open>Sorts\<close> |
27040 | 1339 |
|
58618 | 1340 |
text \<open> |
27040 | 1341 |
\begin{matharray}{rcll} |
61493 | 1342 |
@{command_def "default_sort"} & : & \<open>local_theory \<rightarrow> local_theory\<close> |
27040 | 1343 |
\end{matharray} |
1344 |
||
69597 | 1345 |
\<^rail>\<open> |
42596
6c621a9d612a
modernized rail diagrams using @{rail} antiquotation;
wenzelm
parents:
41435
diff
changeset
|
1346 |
@@{command default_sort} @{syntax sort} |
69597 | 1347 |
\<close> |
27040 | 1348 |
|
61665 | 1349 |
\<^descr> \<^theory_text>\<open>default_sort s\<close> makes sort \<open>s\<close> the new default sort for any type |
1350 |
variable that is given explicitly in the text, but lacks a sort constraint |
|
1351 |
(wrt.\ the current context). Type variables generated by type inference are |
|
1352 |
not affected. |
|
28767 | 1353 |
|
61664 | 1354 |
Usually the default sort is only changed when defining a new object-logic. |
69597 | 1355 |
For example, the default sort in Isabelle/HOL is \<^class>\<open>type\<close>, the class of |
61664 | 1356 |
all HOL types. |
28767 | 1357 |
|
61664 | 1358 |
When merging theories, the default sorts of the parents are logically |
1359 |
intersected, i.e.\ the representations as lists of classes are joined. |
|
58618 | 1360 |
\<close> |
27040 | 1361 |
|
1362 |
||
58618 | 1363 |
subsection \<open>Types \label{sec:types-pure}\<close> |
27040 | 1364 |
|
58618 | 1365 |
text \<open> |
27040 | 1366 |
\begin{matharray}{rcll} |
61493 | 1367 |
@{command_def "type_synonym"} & : & \<open>local_theory \<rightarrow> local_theory\<close> \\ |
1368 |
@{command_def "typedecl"} & : & \<open>local_theory \<rightarrow> local_theory\<close> \\ |
|
27040 | 1369 |
\end{matharray} |
1370 |
||
69597 | 1371 |
\<^rail>\<open> |
42596
6c621a9d612a
modernized rail diagrams using @{rail} antiquotation;
wenzelm
parents:
41435
diff
changeset
|
1372 |
@@{command type_synonym} (@{syntax typespec} '=' @{syntax type} @{syntax mixfix}?) |
27040 | 1373 |
; |
42596
6c621a9d612a
modernized rail diagrams using @{rail} antiquotation;
wenzelm
parents:
41435
diff
changeset
|
1374 |
@@{command typedecl} @{syntax typespec} @{syntax mixfix}? |
69597 | 1375 |
\<close> |
27040 | 1376 |
|
61665 | 1377 |
\<^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>, |
1378 |
\<alpha>\<^sub>n) t\<close> for the existing type \<open>\<tau>\<close>. Unlike the semantic type definitions in |
|
1379 |
Isabelle/HOL, type synonyms are merely syntactic abbreviations without any |
|
1380 |
logical significance. Internally, type synonyms are fully expanded. |
|
65491
7fb81fa1d668
more uniform thy_deps (like class_deps), see also c48d536231fe;
wenzelm
parents:
63680
diff
changeset
|
1381 |
|
61665 | 1382 |
\<^descr> \<^theory_text>\<open>typedecl (\<alpha>\<^sub>1, \<dots>, \<alpha>\<^sub>n) t\<close> declares a new type constructor \<open>t\<close>. If the |
1383 |
object-logic defines a base sort \<open>s\<close>, then the constructor is declared to |
|
1384 |
operate on that, via the axiomatic type-class instance \<open>t :: (s, \<dots>, s)s\<close>. |
|
27040 | 1385 |
|
57487 | 1386 |
|
1387 |
\begin{warn} |
|
61664 | 1388 |
If you introduce a new type axiomatically, i.e.\ via @{command_ref |
1389 |
typedecl} and @{command_ref axiomatization} |
|
1390 |
(\secref{sec:axiomatizations}), the minimum requirement is that it has a |
|
1391 |
non-empty model, to avoid immediate collapse of the logical environment. |
|
1392 |
Moreover, one needs to demonstrate that the interpretation of such |
|
1393 |
free-form axiomatizations can coexist with other axiomatization schemes |
|
1394 |
for types, notably @{command_def typedef} in Isabelle/HOL |
|
1395 |
(\secref{sec:hol-typedef}), or any other extension that people might have |
|
1396 |
introduced elsewhere. |
|
57487 | 1397 |
\end{warn} |
58618 | 1398 |
\<close> |
27040 | 1399 |
|
1400 |
||
58618 | 1401 |
section \<open>Naming existing theorems \label{sec:theorems}\<close> |
27040 | 1402 |
|
58618 | 1403 |
text \<open> |
27040 | 1404 |
\begin{matharray}{rcll} |
61493 | 1405 |
@{command_def "lemmas"} & : & \<open>local_theory \<rightarrow> local_theory\<close> \\ |
1406 |
@{command_def "named_theorems"} & : & \<open>local_theory \<rightarrow> local_theory\<close> \\ |
|
27040 | 1407 |
\end{matharray} |
1408 |
||
69597 | 1409 |
\<^rail>\<open> |
62969 | 1410 |
@@{command lemmas} (@{syntax thmdef}? @{syntax thms} + @'and') |
59785 | 1411 |
@{syntax for_fixes} |
57946
6a26aa5fa65e
updated documentation concerning 'named_theorems';
wenzelm
parents:
57941
diff
changeset
|
1412 |
; |
59785 | 1413 |
@@{command named_theorems} (@{syntax name} @{syntax text}? + @'and') |
69597 | 1414 |
\<close> |
27040 | 1415 |
|
61665 | 1416 |
\<^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 |
1417 |
facts (with attributes) in the current context, which may be augmented by |
|
1418 |
local variables. Results are standardized before being stored, i.e.\ |
|
1419 |
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:
42936
diff
changeset
|
1420 |
|
61665 | 1421 |
\<^descr> \<^theory_text>\<open>named_theorems name description\<close> declares a dynamic fact within the |
1422 |
context. The same \<open>name\<close> is used to define an attribute with the usual |
|
1423 |
\<open>add\<close>/\<open>del\<close> syntax (e.g.\ see \secref{sec:simp-rules}) to maintain the |
|
61664 | 1424 |
content incrementally, in canonical declaration order of the text structure. |
58618 | 1425 |
\<close> |
27040 | 1426 |
|
1427 |
||
70560 | 1428 |
section \<open>Oracles \label{sec:oracles}\<close> |
27040 | 1429 |
|
58618 | 1430 |
text \<open> |
47483 | 1431 |
\begin{matharray}{rcll} |
61493 | 1432 |
@{command_def "oracle"} & : & \<open>theory \<rightarrow> theory\<close> & (axiomatic!) \\ |
70560 | 1433 |
@{command_def "thm_oracles"}\<open>\<^sup>*\<close> & : & \<open>context \<rightarrow>\<close> \\ |
47483 | 1434 |
\end{matharray} |
1435 |
||
61664 | 1436 |
Oracles allow Isabelle to take advantage of external reasoners such as |
1437 |
arithmetic decision procedures, model checkers, fast tautology checkers or |
|
1438 |
computer algebra systems. Invoked as an oracle, an external reasoner can |
|
1439 |
create arbitrary Isabelle theorems. |
|
28756 | 1440 |
|
61664 | 1441 |
It is the responsibility of the user to ensure that the external reasoner is |
1442 |
as trustworthy as the application requires. Another typical source of errors |
|
1443 |
is the linkup between Isabelle and the external tool, not just its concrete |
|
1444 |
implementation, but also the required translation between two different |
|
1445 |
logical environments. |
|
28756 | 1446 |
|
1447 |
Isabelle merely guarantees well-formedness of the propositions being |
|
61664 | 1448 |
asserted, and records within the internal derivation object how presumed |
70560 | 1449 |
theorems depend on unproven suppositions. This also includes implicit |
1450 |
type-class reasoning via the order-sorted algebra of class relations and |
|
1451 |
type arities (see also @{command_ref instantiation} and @{command_ref |
|
1452 |
instance}). |
|
28756 | 1453 |
|
69597 | 1454 |
\<^rail>\<open> |
42596
6c621a9d612a
modernized rail diagrams using @{rail} antiquotation;
wenzelm
parents:
41435
diff
changeset
|
1455 |
@@{command oracle} @{syntax name} '=' @{syntax text} |
70560 | 1456 |
; |
1457 |
@@{command thm_oracles} @{syntax thms} |
|
69597 | 1458 |
\<close> |
27040 | 1459 |
|
61665 | 1460 |
\<^descr> \<^theory_text>\<open>oracle name = "text"\<close> turns the given ML expression \<open>text\<close> of type |
69597 | 1461 |
\<^ML_text>\<open>'a -> cterm\<close> into an ML function of type \<^ML_text>\<open>'a -> thm\<close>, |
1462 |
which is bound to the global identifier \<^ML_text>\<open>name\<close>. This acts like an |
|
61665 | 1463 |
infinitary specification of axioms! Invoking the oracle only works within |
1464 |
the scope of the resulting theory. |
|
27040 | 1465 |
|
63680 | 1466 |
See \<^file>\<open>~~/src/HOL/ex/Iff_Oracle.thy\<close> for a worked example of defining a new |
1467 |
primitive rule as oracle, and turning it into a proof method. |
|
70560 | 1468 |
|
1469 |
\<^descr> \<^theory_text>\<open>thm_oracles thms\<close> displays all oracles used in the internal derivation |
|
1470 |
of the given theorems; this covers the full graph of transitive |
|
1471 |
dependencies. |
|
58618 | 1472 |
\<close> |
27040 | 1473 |
|
1474 |
||
58618 | 1475 |
section \<open>Name spaces\<close> |
27040 | 1476 |
|
58618 | 1477 |
text \<open> |
27040 | 1478 |
\begin{matharray}{rcl} |
66248 | 1479 |
@{command_def "alias"} & : & \<open>local_theory \<rightarrow> local_theory\<close> \\ |
1480 |
@{command_def "type_alias"} & : & \<open>local_theory \<rightarrow> local_theory\<close> \\ |
|
61493 | 1481 |
@{command_def "hide_class"} & : & \<open>theory \<rightarrow> theory\<close> \\ |
1482 |
@{command_def "hide_type"} & : & \<open>theory \<rightarrow> theory\<close> \\ |
|
1483 |
@{command_def "hide_const"} & : & \<open>theory \<rightarrow> theory\<close> \\ |
|
1484 |
@{command_def "hide_fact"} & : & \<open>theory \<rightarrow> theory\<close> \\ |
|
27040 | 1485 |
\end{matharray} |
1486 |
||
69597 | 1487 |
\<^rail>\<open> |
66248 | 1488 |
(@{command alias} | @{command type_alias}) @{syntax name} '=' @{syntax name} |
1489 |
; |
|
1490 |
(@{command hide_class} | @{command hide_type} | |
|
1491 |
@{command hide_const} | @{command hide_fact}) ('(' @'open' ')')? (@{syntax name} + ) |
|
69597 | 1492 |
\<close> |
27040 | 1493 |
|
61664 | 1494 |
Isabelle organizes any kind of name declarations (of types, constants, |
1495 |
theorems etc.) by separate hierarchically structured name spaces. Normally |
|
61665 | 1496 |
the user does not have to control the behaviour of name spaces by hand, yet |
61664 | 1497 |
the following commands provide some way to do so. |
27040 | 1498 |
|
66248 | 1499 |
\<^descr> \<^theory_text>\<open>alias\<close> and \<^theory_text>\<open>type_alias\<close> introduce aliases for constants and type |
1500 |
constructors, respectively. This allows adhoc changes to name-space |
|
1501 |
accesses. |
|
1502 |
||
1503 |
\<^descr> \<^theory_text>\<open>type_alias b = c\<close> introduces an alias for an existing type constructor. |
|
1504 |
||
61665 | 1505 |
\<^descr> \<^theory_text>\<open>hide_class names\<close> fully removes class declarations from a given name |
1506 |
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:
35681
diff
changeset
|
1507 |
|
61664 | 1508 |
Note that hiding name space accesses has no impact on logical declarations |
1509 |
--- they remain valid internally. Entities that are no longer accessible to |
|
1510 |
the user are printed with the special qualifier ``\<open>??\<close>'' prefixed to the |
|
1511 |
full internal name. |
|
27040 | 1512 |
|
61665 | 1513 |
\<^descr> \<^theory_text>\<open>hide_type\<close>, \<^theory_text>\<open>hide_const\<close>, and \<^theory_text>\<open>hide_fact\<close> are similar to |
1514 |
\<^theory_text>\<open>hide_class\<close>, but hide types, constants, and facts, respectively. |
|
58618 | 1515 |
\<close> |
27040 | 1516 |
|
26869 | 1517 |
end |