| author | huffman | 
| Tue, 17 Apr 2007 00:37:14 +0200 | |
| changeset 22720 | 296813d7d306 | 
| parent 22504 | 22b638460a13 | 
| child 22870 | c37e32bdbea2 | 
| permissions | -rw-r--r-- | 
| 18537 | 1 | % | 
| 2 | \begin{isabellebody}%
 | |
| 3 | \def\isabellecontext{prelim}%
 | |
| 4 | % | |
| 5 | \isadelimtheory | |
| 6 | \isanewline | |
| 7 | \isanewline | |
| 8 | \isanewline | |
| 9 | % | |
| 10 | \endisadelimtheory | |
| 11 | % | |
| 12 | \isatagtheory | |
| 13 | \isacommand{theory}\isamarkupfalse%
 | |
| 14 | \ prelim\ \isakeyword{imports}\ base\ \isakeyword{begin}%
 | |
| 15 | \endisatagtheory | |
| 16 | {\isafoldtheory}%
 | |
| 17 | % | |
| 18 | \isadelimtheory | |
| 19 | % | |
| 20 | \endisadelimtheory | |
| 21 | % | |
| 22 | \isamarkupchapter{Preliminaries%
 | |
| 23 | } | |
| 24 | \isamarkuptrue% | |
| 25 | % | |
| 20429 | 26 | \isamarkupsection{Contexts \label{sec:context}%
 | 
| 18537 | 27 | } | 
| 28 | \isamarkuptrue% | |
| 29 | % | |
| 30 | \begin{isamarkuptext}%
 | |
| 20451 | 31 | A logical context represents the background that is required for | 
| 32 | formulating statements and composing proofs. It acts as a medium to | |
| 33 | produce formal content, depending on earlier material (declarations, | |
| 34 | results etc.). | |
| 18537 | 35 | |
| 20451 | 36 | For example, derivations within the Isabelle/Pure logic can be | 
| 37 |   described as a judgment \isa{{\isasymGamma}\ {\isasymturnstile}\isactrlsub {\isasymTheta}\ {\isasymphi}}, which means that a
 | |
| 20429 | 38 |   proposition \isa{{\isasymphi}} is derivable from hypotheses \isa{{\isasymGamma}}
 | 
| 39 |   within the theory \isa{{\isasymTheta}}.  There are logical reasons for
 | |
| 20451 | 40 |   keeping \isa{{\isasymTheta}} and \isa{{\isasymGamma}} separate: theories can be
 | 
| 41 | liberal about supporting type constructors and schematic | |
| 42 | polymorphism of constants and axioms, while the inner calculus of | |
| 43 |   \isa{{\isasymGamma}\ {\isasymturnstile}\ {\isasymphi}} is strictly limited to Simple Type Theory (with
 | |
| 44 | fixed type variables in the assumptions). | |
| 18537 | 45 | |
| 20429 | 46 | \medskip Contexts and derivations are linked by the following key | 
| 47 | principles: | |
| 48 | ||
| 49 |   \begin{itemize}
 | |
| 50 | ||
| 51 | \item Transfer: monotonicity of derivations admits results to be | |
| 20451 | 52 |   transferred into a \emph{larger} context, i.e.\ \isa{{\isasymGamma}\ {\isasymturnstile}\isactrlsub {\isasymTheta}\ {\isasymphi}} implies \isa{{\isasymGamma}{\isacharprime}\ {\isasymturnstile}\isactrlsub {\isasymTheta}\isactrlsub {\isacharprime}\ {\isasymphi}} for contexts \isa{{\isasymTheta}{\isacharprime}\ {\isasymsupseteq}\ {\isasymTheta}} and \isa{{\isasymGamma}{\isacharprime}\ {\isasymsupseteq}\ {\isasymGamma}}.
 | 
| 20429 | 53 | |
| 54 | \item Export: discharge of hypotheses admits results to be exported | |
| 20451 | 55 |   into a \emph{smaller} context, i.e.\ \isa{{\isasymGamma}{\isacharprime}\ {\isasymturnstile}\isactrlsub {\isasymTheta}\ {\isasymphi}}
 | 
| 56 |   implies \isa{{\isasymGamma}\ {\isasymturnstile}\isactrlsub {\isasymTheta}\ {\isasymDelta}\ {\isasymLongrightarrow}\ {\isasymphi}} where \isa{{\isasymGamma}{\isacharprime}\ {\isasymsupseteq}\ {\isasymGamma}} and
 | |
| 57 |   \isa{{\isasymDelta}\ {\isacharequal}\ {\isasymGamma}{\isacharprime}\ {\isacharminus}\ {\isasymGamma}}.  Note that \isa{{\isasymTheta}} remains unchanged here,
 | |
| 58 |   only the \isa{{\isasymGamma}} part is affected.
 | |
| 18537 | 59 | |
| 20429 | 60 |   \end{itemize}
 | 
| 18537 | 61 | |
| 20451 | 62 | \medskip By modeling the main characteristics of the primitive | 
| 63 |   \isa{{\isasymTheta}} and \isa{{\isasymGamma}} above, and abstracting over any
 | |
| 64 | particular logical content, we arrive at the fundamental notions of | |
| 65 |   \emph{theory context} and \emph{proof context} in Isabelle/Isar.
 | |
| 66 |   These implement a certain policy to manage arbitrary \emph{context
 | |
| 67 | data}. There is a strongly-typed mechanism to declare new kinds of | |
| 20429 | 68 | data at compile time. | 
| 18537 | 69 | |
| 20451 | 70 | The internal bootstrap process of Isabelle/Pure eventually reaches a | 
| 71 |   stage where certain data slots provide the logical content of \isa{{\isasymTheta}} and \isa{{\isasymGamma}} sketched above, but this does not stop there!
 | |
| 72 | Various additional data slots support all kinds of mechanisms that | |
| 73 | are not necessarily part of the core logic. | |
| 18537 | 74 | |
| 20429 | 75 | For example, there would be data for canonical introduction and | 
| 76 | elimination rules for arbitrary operators (depending on the | |
| 77 | object-logic and application), which enables users to perform | |
| 20451 | 78 |   standard proof steps implicitly (cf.\ the \isa{rule} method
 | 
| 79 |   \cite{isabelle-isar-ref}).
 | |
| 18537 | 80 | |
| 20451 | 81 | \medskip Thus Isabelle/Isar is able to bring forth more and more | 
| 82 | concepts successively. In particular, an object-logic like | |
| 83 | Isabelle/HOL continues the Isabelle/Pure setup by adding specific | |
| 84 | components for automated reasoning (classical reasoner, tableau | |
| 85 | prover, structured induction etc.) and derived specification | |
| 86 | mechanisms (inductive predicates, recursive functions etc.). All of | |
| 87 | this is ultimately based on the generic data management by theory | |
| 88 | and proof contexts introduced here.% | |
| 18537 | 89 | \end{isamarkuptext}%
 | 
| 90 | \isamarkuptrue% | |
| 91 | % | |
| 92 | \isamarkupsubsection{Theory context \label{sec:context-theory}%
 | |
| 93 | } | |
| 94 | \isamarkuptrue% | |
| 95 | % | |
| 96 | \begin{isamarkuptext}%
 | |
| 20447 | 97 | \glossary{Theory}{FIXME}
 | 
| 98 | ||
| 20451 | 99 |   A \emph{theory} is a data container with explicit named and unique
 | 
| 100 | identifier. Theories are related by a (nominal) sub-theory | |
| 101 | relation, which corresponds to the dependency graph of the original | |
| 102 | construction; each theory is derived from a certain sub-graph of | |
| 103 | ancestor theories. | |
| 104 | ||
| 105 |   The \isa{merge} operation produces the least upper bound of two
 | |
| 106 | theories, which actually degenerates into absorption of one theory | |
| 107 | into the other (due to the nominal sub-theory relation). | |
| 18537 | 108 | |
| 20429 | 109 |   The \isa{begin} operation starts a new theory by importing
 | 
| 110 |   several parent theories and entering a special \isa{draft} mode,
 | |
| 111 |   which is sustained until the final \isa{end} operation.  A draft
 | |
| 20451 | 112 | theory acts like a linear type, where updates invalidate earlier | 
| 113 | versions. An invalidated draft is called ``stale''. | |
| 20429 | 114 | |
| 20447 | 115 |   The \isa{checkpoint} operation produces an intermediate stepping
 | 
| 20451 | 116 | stone that will survive the next update: both the original and the | 
| 117 | changed theory remain valid and are related by the sub-theory | |
| 118 | relation. Checkpointing essentially recovers purely functional | |
| 119 | theory values, at the expense of some extra internal bookkeeping. | |
| 20447 | 120 | |
| 121 |   The \isa{copy} operation produces an auxiliary version that has
 | |
| 122 | the same data content, but is unrelated to the original: updates of | |
| 123 | the copy do not affect the original, neither does the sub-theory | |
| 124 | relation hold. | |
| 20429 | 125 | |
| 20447 | 126 |   \medskip The example in \figref{fig:ex-theory} below shows a theory
 | 
| 20451 | 127 |   graph derived from \isa{Pure}, with theory \isa{Length}
 | 
| 128 |   importing \isa{Nat} and \isa{List}.  The body of \isa{Length} consists of a sequence of updates, working mostly on
 | |
| 129 | drafts. Intermediate checkpoints may occur as well, due to the | |
| 130 | history mechanism provided by the Isar top-level, cf.\ | |
| 131 |   \secref{sec:isar-toplevel}.
 | |
| 20447 | 132 | |
| 133 |   \begin{figure}[htb]
 | |
| 134 |   \begin{center}
 | |
| 20429 | 135 |   \begin{tabular}{rcccl}
 | 
| 20447 | 136 |         &            & \isa{Pure} \\
 | 
| 137 |         &            & \isa{{\isasymdown}} \\
 | |
| 138 |         &            & \isa{FOL} \\
 | |
| 18537 | 139 | & $\swarrow$ & & $\searrow$ & \\ | 
| 21862 | 140 |   \isa{Nat} &    &              &            & \isa{List} \\
 | 
| 18537 | 141 | & $\searrow$ & & $\swarrow$ \\ | 
| 20447 | 142 |         &            & \isa{Length} \\
 | 
| 18537 | 143 |         &            & \multicolumn{3}{l}{~~$\isarkeyword{imports}$} \\
 | 
| 144 |         &            & \multicolumn{3}{l}{~~$\isarkeyword{begin}$} \\
 | |
| 145 | & & $\vdots$~~ \\ | |
| 20447 | 146 |         &            & \isa{{\isasymbullet}}~~ \\
 | 
| 147 | & & $\vdots$~~ \\ | |
| 148 |         &            & \isa{{\isasymbullet}}~~ \\
 | |
| 149 | & & $\vdots$~~ \\ | |
| 18537 | 150 |         &            & \multicolumn{3}{l}{~~$\isarkeyword{end}$} \\
 | 
| 20429 | 151 |   \end{tabular}
 | 
| 20451 | 152 |   \caption{A theory definition depending on ancestors}\label{fig:ex-theory}
 | 
| 20447 | 153 |   \end{center}
 | 
| 20451 | 154 |   \end{figure}
 | 
| 155 | ||
| 156 |   \medskip There is a separate notion of \emph{theory reference} for
 | |
| 157 | maintaining a live link to an evolving theory context: updates on | |
| 20490 | 158 | drafts are propagated automatically. Dynamic updating stops after | 
| 159 |   an explicit \isa{end} only.
 | |
| 20451 | 160 | |
| 161 | Derived entities may store a theory reference in order to indicate | |
| 162 | the context they belong to. This implicitly assumes monotonic | |
| 163 | reasoning, because the referenced context may become larger without | |
| 164 | further notice.% | |
| 18537 | 165 | \end{isamarkuptext}%
 | 
| 166 | \isamarkuptrue% | |
| 167 | % | |
| 20430 | 168 | \isadelimmlref | 
| 169 | % | |
| 170 | \endisadelimmlref | |
| 171 | % | |
| 172 | \isatagmlref | |
| 173 | % | |
| 174 | \begin{isamarkuptext}%
 | |
| 20447 | 175 | \begin{mldecls}
 | 
| 176 |   \indexmltype{theory}\verb|type theory| \\
 | |
| 177 |   \indexml{Theory.subthy}\verb|Theory.subthy: theory * theory -> bool| \\
 | |
| 178 |   \indexml{Theory.merge}\verb|Theory.merge: theory * theory -> theory| \\
 | |
| 179 |   \indexml{Theory.checkpoint}\verb|Theory.checkpoint: theory -> theory| \\
 | |
| 20547 | 180 |   \indexml{Theory.copy}\verb|Theory.copy: theory -> theory| \\
 | 
| 181 |   \end{mldecls}
 | |
| 182 |   \begin{mldecls}
 | |
| 20447 | 183 |   \indexmltype{theory-ref}\verb|type theory_ref| \\
 | 
| 184 |   \indexml{Theory.self-ref}\verb|Theory.self_ref: theory -> theory_ref| \\
 | |
| 185 |   \indexml{Theory.deref}\verb|Theory.deref: theory_ref -> theory| \\
 | |
| 186 |   \end{mldecls}
 | |
| 187 | ||
| 188 |   \begin{description}
 | |
| 189 | ||
| 20451 | 190 | \item \verb|theory| represents theory contexts. This is | 
| 191 | essentially a linear type! Most operations destroy the original | |
| 192 | version, which then becomes ``stale''. | |
| 20447 | 193 | |
| 194 |   \item \verb|Theory.subthy|~\isa{{\isacharparenleft}thy\isactrlsub {\isadigit{1}}{\isacharcomma}\ thy\isactrlsub {\isadigit{2}}{\isacharparenright}}
 | |
| 195 | compares theories according to the inherent graph structure of the | |
| 196 | construction. This sub-theory relation is a nominal approximation | |
| 197 |   of inclusion (\isa{{\isasymsubseteq}}) of the corresponding content.
 | |
| 198 | ||
| 199 |   \item \verb|Theory.merge|~\isa{{\isacharparenleft}thy\isactrlsub {\isadigit{1}}{\isacharcomma}\ thy\isactrlsub {\isadigit{2}}{\isacharparenright}}
 | |
| 200 | absorbs one theory into the other. This fails for unrelated | |
| 201 | theories! | |
| 202 | ||
| 203 |   \item \verb|Theory.checkpoint|~\isa{thy} produces a safe
 | |
| 204 |   stepping stone in the linear development of \isa{thy}.  The next
 | |
| 205 | update will result in two related, valid theories. | |
| 206 | ||
| 20451 | 207 |   \item \verb|Theory.copy|~\isa{thy} produces a variant of \isa{thy} that holds a copy of the same data.  The result is not
 | 
| 208 | related to the original; the original is unchanched. | |
| 20447 | 209 | |
| 20451 | 210 | \item \verb|theory_ref| represents a sliding reference to an | 
| 211 | always valid theory; updates on the original are propagated | |
| 20447 | 212 | automatically. | 
| 213 | ||
| 20449 | 214 |   \item \verb|Theory.self_ref|~\isa{thy} and \verb|Theory.deref|~\isa{thy{\isacharunderscore}ref} convert between \verb|theory| and \verb|theory_ref|.  As the referenced theory
 | 
| 20451 | 215 | evolves monotonically over time, later invocations of \verb|Theory.deref| may refer to a larger context. | 
| 20447 | 216 | |
| 217 |   \end{description}%
 | |
| 20430 | 218 | \end{isamarkuptext}%
 | 
| 219 | \isamarkuptrue% | |
| 220 | % | |
| 221 | \endisatagmlref | |
| 222 | {\isafoldmlref}%
 | |
| 223 | % | |
| 224 | \isadelimmlref | |
| 225 | % | |
| 226 | \endisadelimmlref | |
| 227 | % | |
| 18537 | 228 | \isamarkupsubsection{Proof context \label{sec:context-proof}%
 | 
| 229 | } | |
| 230 | \isamarkuptrue% | |
| 231 | % | |
| 232 | \begin{isamarkuptext}%
 | |
| 20447 | 233 | \glossary{Proof context}{The static context of a structured proof,
 | 
| 234 | acts like a local ``theory'' of the current portion of Isar proof | |
| 235 |   text, generalizes the idea of local hypotheses \isa{{\isasymGamma}} in
 | |
| 236 |   judgments \isa{{\isasymGamma}\ {\isasymturnstile}\ {\isasymphi}} of natural deduction calculi.  There is a
 | |
| 237 | generic notion of introducing and discharging hypotheses. | |
| 238 | Arbritrary auxiliary context data may be adjoined.} | |
| 20429 | 239 | |
| 20447 | 240 | A proof context is a container for pure data with a back-reference | 
| 20449 | 241 |   to the theory it belongs to.  The \isa{init} operation creates a
 | 
| 20451 | 242 | proof context from a given theory. Modifications to draft theories | 
| 243 | are propagated to the proof context as usual, but there is also an | |
| 244 |   explicit \isa{transfer} operation to force resynchronization
 | |
| 245 | with more substantial updates to the underlying theory. The actual | |
| 246 | context data does not require any special bookkeeping, thanks to the | |
| 247 | lack of destructive features. | |
| 20429 | 248 | |
| 20447 | 249 | Entities derived in a proof context need to record inherent logical | 
| 250 | requirements explicitly, since there is no separate context | |
| 251 | identification as for theories. For example, hypotheses used in | |
| 20451 | 252 |   primitive derivations (cf.\ \secref{sec:thms}) are recorded
 | 
| 20447 | 253 |   separately within the sequent \isa{{\isasymGamma}\ {\isasymturnstile}\ {\isasymphi}}, just to make double
 | 
| 254 | sure. Results could still leak into an alien proof context do to | |
| 255 | programming errors, but Isabelle/Isar includes some extra validity | |
| 22504 | 256 | checks in critical positions, notably at the end of a sub-proof. | 
| 20429 | 257 | |
| 20451 | 258 | Proof contexts may be manipulated arbitrarily, although the common | 
| 259 | discipline is to follow block structure as a mental model: a given | |
| 260 | context is extended consecutively, and results are exported back | |
| 261 | into the original context. Note that the Isar proof states model | |
| 262 | block-structured reasoning explicitly, using a stack of proof | |
| 263 |   contexts internally, cf.\ \secref{sec:isar-proof-state}.%
 | |
| 18537 | 264 | \end{isamarkuptext}%
 | 
| 265 | \isamarkuptrue% | |
| 266 | % | |
| 20430 | 267 | \isadelimmlref | 
| 268 | % | |
| 269 | \endisadelimmlref | |
| 270 | % | |
| 271 | \isatagmlref | |
| 272 | % | |
| 273 | \begin{isamarkuptext}%
 | |
| 20449 | 274 | \begin{mldecls}
 | 
| 275 |   \indexmltype{Proof.context}\verb|type Proof.context| \\
 | |
| 276 |   \indexml{ProofContext.init}\verb|ProofContext.init: theory -> Proof.context| \\
 | |
| 277 |   \indexml{ProofContext.theory-of}\verb|ProofContext.theory_of: Proof.context -> theory| \\
 | |
| 278 |   \indexml{ProofContext.transfer}\verb|ProofContext.transfer: theory -> Proof.context -> Proof.context| \\
 | |
| 279 |   \end{mldecls}
 | |
| 280 | ||
| 281 |   \begin{description}
 | |
| 282 | ||
| 283 | \item \verb|Proof.context| represents proof contexts. Elements | |
| 284 | of this type are essentially pure values, with a sliding reference | |
| 285 | to the background theory. | |
| 286 | ||
| 287 |   \item \verb|ProofContext.init|~\isa{thy} produces a proof context
 | |
| 288 |   derived from \isa{thy}, initializing all data.
 | |
| 289 | ||
| 290 |   \item \verb|ProofContext.theory_of|~\isa{ctxt} selects the
 | |
| 20451 | 291 |   background theory from \isa{ctxt}, dereferencing its internal
 | 
| 292 | \verb|theory_ref|. | |
| 20449 | 293 | |
| 294 |   \item \verb|ProofContext.transfer|~\isa{thy\ ctxt} promotes the
 | |
| 295 |   background theory of \isa{ctxt} to the super theory \isa{thy}.
 | |
| 296 | ||
| 297 |   \end{description}%
 | |
| 20430 | 298 | \end{isamarkuptext}%
 | 
| 299 | \isamarkuptrue% | |
| 300 | % | |
| 301 | \endisatagmlref | |
| 302 | {\isafoldmlref}%
 | |
| 303 | % | |
| 304 | \isadelimmlref | |
| 305 | % | |
| 306 | \endisadelimmlref | |
| 307 | % | |
| 20451 | 308 | \isamarkupsubsection{Generic contexts \label{sec:generic-context}%
 | 
| 20429 | 309 | } | 
| 310 | \isamarkuptrue% | |
| 311 | % | |
| 20430 | 312 | \begin{isamarkuptext}%
 | 
| 20449 | 313 | A generic context is the disjoint sum of either a theory or proof | 
| 20451 | 314 | context. Occasionally, this enables uniform treatment of generic | 
| 20450 | 315 | context data, typically extra-logical information. Operations on | 
| 20449 | 316 | generic contexts include the usual injections, partial selections, | 
| 317 | and combinators for lifting operations on either component of the | |
| 318 | disjoint sum. | |
| 319 | ||
| 320 |   Moreover, there are total operations \isa{theory{\isacharunderscore}of} and \isa{proof{\isacharunderscore}of} to convert a generic context into either kind: a theory
 | |
| 20451 | 321 | can always be selected from the sum, while a proof context might | 
| 322 |   have to be constructed by an ad-hoc \isa{init} operation.%
 | |
| 20430 | 323 | \end{isamarkuptext}%
 | 
| 324 | \isamarkuptrue% | |
| 325 | % | |
| 326 | \isadelimmlref | |
| 327 | % | |
| 328 | \endisadelimmlref | |
| 329 | % | |
| 330 | \isatagmlref | |
| 331 | % | |
| 332 | \begin{isamarkuptext}%
 | |
| 20449 | 333 | \begin{mldecls}
 | 
| 334 |   \indexmltype{Context.generic}\verb|type Context.generic| \\
 | |
| 335 |   \indexml{Context.theory-of}\verb|Context.theory_of: Context.generic -> theory| \\
 | |
| 336 |   \indexml{Context.proof-of}\verb|Context.proof_of: Context.generic -> Proof.context| \\
 | |
| 337 |   \end{mldecls}
 | |
| 338 | ||
| 339 |   \begin{description}
 | |
| 340 | ||
| 20451 | 341 | \item \verb|Context.generic| is the direct sum of \verb|theory| and \verb|Proof.context|, with the datatype | 
| 342 | constructors \verb|Context.Theory| and \verb|Context.Proof|. | |
| 20449 | 343 | |
| 344 |   \item \verb|Context.theory_of|~\isa{context} always produces a
 | |
| 345 |   theory from the generic \isa{context}, using \verb|ProofContext.theory_of| as required.
 | |
| 346 | ||
| 347 |   \item \verb|Context.proof_of|~\isa{context} always produces a
 | |
| 20451 | 348 |   proof context from the generic \isa{context}, using \verb|ProofContext.init| as required (note that this re-initializes the
 | 
| 349 | context data with each invocation). | |
| 20449 | 350 | |
| 351 |   \end{description}%
 | |
| 20430 | 352 | \end{isamarkuptext}%
 | 
| 353 | \isamarkuptrue% | |
| 354 | % | |
| 355 | \endisatagmlref | |
| 356 | {\isafoldmlref}%
 | |
| 357 | % | |
| 358 | \isadelimmlref | |
| 359 | % | |
| 360 | \endisadelimmlref | |
| 361 | % | |
| 20477 | 362 | \isamarkupsubsection{Context data \label{sec:context-data}%
 | 
| 20447 | 363 | } | 
| 364 | \isamarkuptrue% | |
| 365 | % | |
| 366 | \begin{isamarkuptext}%
 | |
| 20451 | 367 | The main purpose of theory and proof contexts is to manage arbitrary | 
| 368 | data. New data types can be declared incrementally at compile time. | |
| 369 | There are separate declaration mechanisms for any of the three kinds | |
| 370 | of contexts: theory, proof, generic. | |
| 20449 | 371 | |
| 372 |   \paragraph{Theory data} may refer to destructive entities, which are
 | |
| 20451 | 373 | maintained in direct correspondence to the linear evolution of | 
| 374 |   theory values, including explicit copies.\footnote{Most existing
 | |
| 375 | instances of destructive theory data are merely historical relics | |
| 376 | (e.g.\ the destructive theorem storage, and destructive hints for | |
| 377 | the Simplifier and Classical rules).} A theory data declaration | |
| 378 | needs to implement the following specification (depending on type | |
| 379 |   \isa{T}):
 | |
| 20449 | 380 | |
| 381 | \medskip | |
| 382 |   \begin{tabular}{ll}
 | |
| 383 |   \isa{name{\isacharcolon}\ string} \\
 | |
| 384 |   \isa{empty{\isacharcolon}\ T} & initial value \\
 | |
| 385 |   \isa{copy{\isacharcolon}\ T\ {\isasymrightarrow}\ T} & refresh impure data \\
 | |
| 386 |   \isa{extend{\isacharcolon}\ T\ {\isasymrightarrow}\ T} & re-initialize on import \\
 | |
| 387 |   \isa{merge{\isacharcolon}\ T\ {\isasymtimes}\ T\ {\isasymrightarrow}\ T} & join on import \\
 | |
| 388 |   \isa{print{\isacharcolon}\ T\ {\isasymrightarrow}\ unit} & diagnostic output \\
 | |
| 389 |   \end{tabular}
 | |
| 390 | \medskip | |
| 391 | ||
| 392 |   \noindent The \isa{name} acts as a comment for diagnostic
 | |
| 393 |   messages; \isa{copy} is just the identity for pure data; \isa{extend} is acts like a unitary version of \isa{merge}, both
 | |
| 394 |   should also include the functionality of \isa{copy} for impure
 | |
| 395 | data. | |
| 396 | ||
| 20451 | 397 |   \paragraph{Proof context data} is purely functional.  A declaration
 | 
| 398 | needs to implement the following specification: | |
| 20449 | 399 | |
| 400 | \medskip | |
| 401 |   \begin{tabular}{ll}
 | |
| 402 |   \isa{name{\isacharcolon}\ string} \\
 | |
| 403 |   \isa{init{\isacharcolon}\ theory\ {\isasymrightarrow}\ T} & produce initial value \\
 | |
| 404 |   \isa{print{\isacharcolon}\ T\ {\isasymrightarrow}\ unit} & diagnostic output \\
 | |
| 405 |   \end{tabular}
 | |
| 406 | \medskip | |
| 407 | ||
| 408 |   \noindent The \isa{init} operation is supposed to produce a pure
 | |
| 20451 | 409 | value from the given background theory. The remainder is analogous | 
| 410 | to theory data. | |
| 20449 | 411 | |
| 20451 | 412 |   \paragraph{Generic data} provides a hybrid interface for both theory
 | 
| 413 | and proof data. The declaration is essentially the same as for | |
| 414 |   (pure) theory data, without \isa{copy}, though.  The \isa{init} operation for proof contexts merely selects the current data
 | |
| 415 | value from the background theory. | |
| 20449 | 416 | |
| 417 |   \bigskip In any case, a data declaration of type \isa{T} results
 | |
| 418 | in the following interface: | |
| 419 | ||
| 420 | \medskip | |
| 421 |   \begin{tabular}{ll}
 | |
| 422 |   \isa{init{\isacharcolon}\ theory\ {\isasymrightarrow}\ theory} \\
 | |
| 423 |   \isa{get{\isacharcolon}\ context\ {\isasymrightarrow}\ T} \\
 | |
| 424 |   \isa{put{\isacharcolon}\ T\ {\isasymrightarrow}\ context\ {\isasymrightarrow}\ context} \\
 | |
| 425 |   \isa{map{\isacharcolon}\ {\isacharparenleft}T\ {\isasymrightarrow}\ T{\isacharparenright}\ {\isasymrightarrow}\ context\ {\isasymrightarrow}\ context} \\
 | |
| 426 |   \isa{print{\isacharcolon}\ context\ {\isasymrightarrow}\ unit}
 | |
| 427 |   \end{tabular}
 | |
| 428 | \medskip | |
| 429 | ||
| 430 |   \noindent Here \isa{init} needs to be applied to the current
 | |
| 431 | theory context once, in order to register the initial setup. The | |
| 432 | other operations provide access for the particular kind of context | |
| 433 | (theory, proof, or generic context). Note that this is a safe | |
| 434 | interface: there is no other way to access the corresponding data | |
| 20451 | 435 | slot of a context. By keeping these operations private, a component | 
| 436 | may maintain abstract values authentically, without other components | |
| 437 | interfering.% | |
| 20447 | 438 | \end{isamarkuptext}%
 | 
| 439 | \isamarkuptrue% | |
| 440 | % | |
| 20450 | 441 | \isadelimmlref | 
| 442 | % | |
| 443 | \endisadelimmlref | |
| 444 | % | |
| 445 | \isatagmlref | |
| 446 | % | |
| 447 | \begin{isamarkuptext}%
 | |
| 448 | \begin{mldecls}
 | |
| 449 |   \indexmlfunctor{TheoryDataFun}\verb|functor TheoryDataFun| \\
 | |
| 450 |   \indexmlfunctor{ProofDataFun}\verb|functor ProofDataFun| \\
 | |
| 451 |   \indexmlfunctor{GenericDataFun}\verb|functor GenericDataFun| \\
 | |
| 452 |   \end{mldecls}
 | |
| 453 | ||
| 454 |   \begin{description}
 | |
| 455 | ||
| 456 |   \item \verb|TheoryDataFun|\isa{{\isacharparenleft}spec{\isacharparenright}} declares data for
 | |
| 457 | type \verb|theory| according to the specification provided as | |
| 20451 | 458 | argument structure. The resulting structure provides data init and | 
| 459 | access operations as described above. | |
| 20450 | 460 | |
| 20471 | 461 |   \item \verb|ProofDataFun|\isa{{\isacharparenleft}spec{\isacharparenright}} is analogous to
 | 
| 462 | \verb|TheoryDataFun| for type \verb|Proof.context|. | |
| 20450 | 463 | |
| 20471 | 464 |   \item \verb|GenericDataFun|\isa{{\isacharparenleft}spec{\isacharparenright}} is analogous to
 | 
| 465 | \verb|TheoryDataFun| for type \verb|Context.generic|. | |
| 20450 | 466 | |
| 467 |   \end{description}%
 | |
| 468 | \end{isamarkuptext}%
 | |
| 469 | \isamarkuptrue% | |
| 470 | % | |
| 471 | \endisatagmlref | |
| 472 | {\isafoldmlref}%
 | |
| 473 | % | |
| 474 | \isadelimmlref | |
| 475 | % | |
| 476 | \endisadelimmlref | |
| 477 | % | |
| 20477 | 478 | \isamarkupsection{Names%
 | 
| 20438 | 479 | } | 
| 480 | \isamarkuptrue% | |
| 481 | % | |
| 482 | \begin{isamarkuptext}%
 | |
| 20477 | 483 | In principle, a name is just a string, but there are various | 
| 20490 | 484 |   convention for encoding additional structure.  For example, ``\isa{Foo{\isachardot}bar{\isachardot}baz}'' is considered as a qualified name consisting of
 | 
| 485 | three basic name components. The individual constituents of a name | |
| 486 | may have further substructure, e.g.\ the string | |
| 487 | ``\verb,\,\verb,<alpha>,'' encodes as a single symbol.% | |
| 20438 | 488 | \end{isamarkuptext}%
 | 
| 489 | \isamarkuptrue% | |
| 490 | % | |
| 491 | \isamarkupsubsection{Strings of symbols%
 | |
| 492 | } | |
| 493 | \isamarkuptrue% | |
| 494 | % | |
| 495 | \begin{isamarkuptext}%
 | |
| 20477 | 496 | \glossary{Symbol}{The smallest unit of text in Isabelle, subsumes
 | 
| 497 | plain ASCII characters as well as an infinite collection of named | |
| 498 | symbols (for greek, math etc.).} | |
| 20471 | 499 | |
| 20477 | 500 |   A \emph{symbol} constitutes the smallest textual unit in Isabelle
 | 
| 20490 | 501 | --- raw characters are normally not encountered at all. Isabelle | 
| 502 | strings consist of a sequence of symbols, represented as a packed | |
| 503 | string or a list of strings. Each symbol is in itself a small | |
| 504 | string, which has either one of the following forms: | |
| 20438 | 505 | |
| 20451 | 506 |   \begin{enumerate}
 | 
| 507 | ||
| 20490 | 508 |   \item a single ASCII character ``\isa{c}'', for example
 | 
| 509 | ``\verb,a,'', | |
| 20438 | 510 | |
| 20490 | 511 |   \item a regular symbol ``\verb,\,\verb,<,\isa{ident}\verb,>,'',
 | 
| 20477 | 512 | for example ``\verb,\,\verb,<alpha>,'', | 
| 20438 | 513 | |
| 20490 | 514 |   \item a control symbol ``\verb,\,\verb,<^,\isa{ident}\verb,>,'',
 | 
| 20477 | 515 | for example ``\verb,\,\verb,<^bold>,'', | 
| 20438 | 516 | |
| 20490 | 517 |   \item a raw symbol ``\verb,\,\verb,<^raw:,\isa{text}\verb,>,''
 | 
| 518 |   where \isa{text} constists of printable characters excluding
 | |
| 20477 | 519 | ``\verb,.,'' and ``\verb,>,'', for example | 
| 520 |   ``\verb,\,\verb,<^raw:$\sum_{i = 1}^n$>,'',
 | |
| 20438 | 521 | |
| 20490 | 522 |   \item a numbered raw control symbol ``\verb,\,\verb,<^raw,\isa{n}\verb,>, where \isa{n} consists of digits, for example
 | 
| 20451 | 523 | ``\verb,\,\verb,<^raw42>,''. | 
| 20438 | 524 | |
| 20451 | 525 |   \end{enumerate}
 | 
| 20438 | 526 | |
| 20477 | 527 |   \noindent The \isa{ident} syntax for symbol names is \isa{letter\ {\isacharparenleft}letter\ {\isacharbar}\ digit{\isacharparenright}\isactrlsup {\isacharasterisk}}, where \isa{letter\ {\isacharequal}\ A{\isachardot}{\isachardot}Za{\isachardot}{\isachardot}z} and \isa{digit\ {\isacharequal}\ {\isadigit{0}}{\isachardot}{\isachardot}{\isadigit{9}}}.  There are infinitely many
 | 
| 528 | regular symbols and control symbols, but a fixed collection of | |
| 529 | standard symbols is treated specifically. For example, | |
| 20490 | 530 | ``\verb,\,\verb,<alpha>,'' is classified as a letter, which means it | 
| 531 | may occur within regular Isabelle identifiers. | |
| 20438 | 532 | |
| 20490 | 533 | Since the character set underlying Isabelle symbols is 7-bit ASCII | 
| 534 | and 8-bit characters are passed through transparently, Isabelle may | |
| 535 | also process Unicode/UCS data in UTF-8 encoding. Unicode provides | |
| 536 | its own collection of mathematical symbols, but there is no built-in | |
| 537 | link to the standard collection of Isabelle. | |
| 20438 | 538 | |
| 20477 | 539 | \medskip Output of Isabelle symbols depends on the print mode | 
| 540 |   (\secref{FIXME}).  For example, the standard {\LaTeX} setup of the
 | |
| 541 | Isabelle document preparation system would present | |
| 542 |   ``\verb,\,\verb,<alpha>,'' as \isa{{\isasymalpha}}, and
 | |
| 543 |   ``\verb,\,\verb,<^bold>,\verb,\,\verb,<alpha>,'' as \isa{\isactrlbold {\isasymalpha}}.%
 | |
| 20438 | 544 | \end{isamarkuptext}%
 | 
| 545 | \isamarkuptrue% | |
| 546 | % | |
| 547 | \isadelimmlref | |
| 548 | % | |
| 549 | \endisadelimmlref | |
| 550 | % | |
| 551 | \isatagmlref | |
| 552 | % | |
| 553 | \begin{isamarkuptext}%
 | |
| 554 | \begin{mldecls}
 | |
| 555 |   \indexmltype{Symbol.symbol}\verb|type Symbol.symbol| \\
 | |
| 556 |   \indexml{Symbol.explode}\verb|Symbol.explode: string -> Symbol.symbol list| \\
 | |
| 557 |   \indexml{Symbol.is-letter}\verb|Symbol.is_letter: Symbol.symbol -> bool| \\
 | |
| 558 |   \indexml{Symbol.is-digit}\verb|Symbol.is_digit: Symbol.symbol -> bool| \\
 | |
| 559 |   \indexml{Symbol.is-quasi}\verb|Symbol.is_quasi: Symbol.symbol -> bool| \\
 | |
| 20547 | 560 |   \indexml{Symbol.is-blank}\verb|Symbol.is_blank: Symbol.symbol -> bool| \\
 | 
| 561 |   \end{mldecls}
 | |
| 562 |   \begin{mldecls}
 | |
| 20438 | 563 |   \indexmltype{Symbol.sym}\verb|type Symbol.sym| \\
 | 
| 564 |   \indexml{Symbol.decode}\verb|Symbol.decode: Symbol.symbol -> Symbol.sym| \\
 | |
| 565 |   \end{mldecls}
 | |
| 566 | ||
| 567 |   \begin{description}
 | |
| 568 | ||
| 20490 | 569 | \item \verb|Symbol.symbol| represents individual Isabelle | 
| 570 | symbols; this is an alias for \verb|string|. | |
| 20438 | 571 | |
| 20477 | 572 |   \item \verb|Symbol.explode|~\isa{str} produces a symbol list
 | 
| 20490 | 573 | from the packed form. This function supercedes \verb|String.explode| for virtually all purposes of manipulating text in | 
| 20477 | 574 | Isabelle! | 
| 20438 | 575 | |
| 20477 | 576 | \item \verb|Symbol.is_letter|, \verb|Symbol.is_digit|, \verb|Symbol.is_quasi|, \verb|Symbol.is_blank| classify standard | 
| 577 | symbols according to fixed syntactic conventions of Isabelle, cf.\ | |
| 578 |   \cite{isabelle-isar-ref}.
 | |
| 20438 | 579 | |
| 580 | \item \verb|Symbol.sym| is a concrete datatype that represents | |
| 20490 | 581 | the different kinds of symbols explicitly, with constructors \verb|Symbol.Char|, \verb|Symbol.Sym|, \verb|Symbol.Ctrl|, \verb|Symbol.Raw|. | 
| 20438 | 582 | |
| 583 | \item \verb|Symbol.decode| converts the string representation of a | |
| 20451 | 584 | symbol into the datatype version. | 
| 20438 | 585 | |
| 586 |   \end{description}%
 | |
| 587 | \end{isamarkuptext}%
 | |
| 588 | \isamarkuptrue% | |
| 589 | % | |
| 590 | \endisatagmlref | |
| 591 | {\isafoldmlref}%
 | |
| 592 | % | |
| 593 | \isadelimmlref | |
| 594 | % | |
| 595 | \endisadelimmlref | |
| 596 | % | |
| 20477 | 597 | \isamarkupsubsection{Basic names \label{sec:basic-names}%
 | 
| 20438 | 598 | } | 
| 599 | \isamarkuptrue% | |
| 600 | % | |
| 601 | \begin{isamarkuptext}%
 | |
| 20477 | 602 | A \emph{basic name} essentially consists of a single Isabelle
 | 
| 603 | identifier. There are conventions to mark separate classes of basic | |
| 604 |   names, by attaching a suffix of underscores (\isa{{\isacharunderscore}}): one
 | |
| 605 |   underscore means \emph{internal name}, two underscores means
 | |
| 606 |   \emph{Skolem name}, three underscores means \emph{internal Skolem
 | |
| 607 | name}. | |
| 608 | ||
| 609 |   For example, the basic name \isa{foo} has the internal version
 | |
| 610 |   \isa{foo{\isacharunderscore}}, with Skolem versions \isa{foo{\isacharunderscore}{\isacharunderscore}} and \isa{foo{\isacharunderscore}{\isacharunderscore}{\isacharunderscore}}, respectively.
 | |
| 20471 | 611 | |
| 20490 | 612 | These special versions provide copies of the basic name space, apart | 
| 613 | from anything that normally appears in the user text. For example, | |
| 614 | system generated variables in Isar proof contexts are usually marked | |
| 615 |   as internal, which prevents mysterious name references like \isa{xaa} to appear in the text.
 | |
| 20477 | 616 | |
| 20490 | 617 | \medskip Manipulating binding scopes often requires on-the-fly | 
| 618 |   renamings.  A \emph{name context} contains a collection of already
 | |
| 619 |   used names.  The \isa{declare} operation adds names to the
 | |
| 620 | context. | |
| 20438 | 621 | |
| 20490 | 622 |   The \isa{invents} operation derives a number of fresh names from
 | 
| 623 | a given starting point. For example, the first three names derived | |
| 624 |   from \isa{a} are \isa{a}, \isa{b}, \isa{c}.
 | |
| 20438 | 625 | |
| 20477 | 626 |   The \isa{variants} operation produces fresh names by
 | 
| 20490 | 627 |   incrementing tentative names as base-26 numbers (with digits \isa{a{\isachardot}{\isachardot}z}) until all clashes are resolved.  For example, name \isa{foo} results in variants \isa{fooa}, \isa{foob}, \isa{fooc}, \dots, \isa{fooaa}, \isa{fooab} etc.; each renaming
 | 
| 628 | step picks the next unused variant from this sequence.% | |
| 20438 | 629 | \end{isamarkuptext}%
 | 
| 630 | \isamarkuptrue% | |
| 631 | % | |
| 20451 | 632 | \isadelimmlref | 
| 633 | % | |
| 634 | \endisadelimmlref | |
| 635 | % | |
| 636 | \isatagmlref | |
| 637 | % | |
| 638 | \begin{isamarkuptext}%
 | |
| 20477 | 639 | \begin{mldecls}
 | 
| 640 |   \indexml{Name.internal}\verb|Name.internal: string -> string| \\
 | |
| 20547 | 641 |   \indexml{Name.skolem}\verb|Name.skolem: string -> string| \\
 | 
| 642 |   \end{mldecls}
 | |
| 643 |   \begin{mldecls}
 | |
| 20477 | 644 |   \indexmltype{Name.context}\verb|type Name.context| \\
 | 
| 645 |   \indexml{Name.context}\verb|Name.context: Name.context| \\
 | |
| 646 |   \indexml{Name.declare}\verb|Name.declare: string -> Name.context -> Name.context| \\
 | |
| 647 |   \indexml{Name.invents}\verb|Name.invents: Name.context -> string -> int -> string list| \\
 | |
| 648 |   \indexml{Name.variants}\verb|Name.variants: string list -> Name.context -> string list * Name.context| \\
 | |
| 649 |   \end{mldecls}
 | |
| 650 | ||
| 651 |   \begin{description}
 | |
| 652 | ||
| 653 |   \item \verb|Name.internal|~\isa{name} produces an internal name
 | |
| 654 | by adding one underscore. | |
| 655 | ||
| 656 |   \item \verb|Name.skolem|~\isa{name} produces a Skolem name by
 | |
| 657 | adding two underscores. | |
| 658 | ||
| 659 | \item \verb|Name.context| represents the context of already used | |
| 660 | names; the initial value is \verb|Name.context|. | |
| 661 | ||
| 20490 | 662 |   \item \verb|Name.declare|~\isa{name} enters a used name into the
 | 
| 663 | context. | |
| 20477 | 664 | |
| 20490 | 665 |   \item \verb|Name.invents|~\isa{context\ name\ n} produces \isa{n} fresh names derived from \isa{name}.
 | 
| 666 | ||
| 667 |   \item \verb|Name.variants|~\isa{names\ context} produces fresh
 | |
| 668 |   varians of \isa{names}; the result is entered into the context.
 | |
| 20477 | 669 | |
| 670 |   \end{description}%
 | |
| 671 | \end{isamarkuptext}%
 | |
| 672 | \isamarkuptrue% | |
| 673 | % | |
| 674 | \endisatagmlref | |
| 675 | {\isafoldmlref}%
 | |
| 676 | % | |
| 677 | \isadelimmlref | |
| 678 | % | |
| 679 | \endisadelimmlref | |
| 680 | % | |
| 681 | \isamarkupsubsection{Indexed names%
 | |
| 682 | } | |
| 683 | \isamarkuptrue% | |
| 684 | % | |
| 685 | \begin{isamarkuptext}%
 | |
| 686 | An \emph{indexed name} (or \isa{indexname}) is a pair of a basic
 | |
| 20490 | 687 | name and a natural number. This representation allows efficient | 
| 688 | renaming by incrementing the second component only. The canonical | |
| 689 | way to rename two collections of indexnames apart from each other is | |
| 690 |   this: determine the maximum index \isa{maxidx} of the first
 | |
| 691 | collection, then increment all indexes of the second collection by | |
| 692 |   \isa{maxidx\ {\isacharplus}\ {\isadigit{1}}}; the maximum index of an empty collection is
 | |
| 693 |   \isa{{\isacharminus}{\isadigit{1}}}.
 | |
| 20477 | 694 | |
| 20490 | 695 | Occasionally, basic names and indexed names are injected into the | 
| 696 |   same pair type: the (improper) indexname \isa{{\isacharparenleft}x{\isacharcomma}\ {\isacharminus}{\isadigit{1}}{\isacharparenright}} is used
 | |
| 697 | to encode basic names. | |
| 698 | ||
| 699 | \medskip Isabelle syntax observes the following rules for | |
| 700 |   representing an indexname \isa{{\isacharparenleft}x{\isacharcomma}\ i{\isacharparenright}} as a packed string:
 | |
| 20477 | 701 | |
| 702 |   \begin{itemize}
 | |
| 703 | ||
| 20481 | 704 |   \item \isa{{\isacharquery}x} if \isa{x} does not end with a digit and \isa{i\ {\isacharequal}\ {\isadigit{0}}},
 | 
| 20477 | 705 | |
| 706 |   \item \isa{{\isacharquery}xi} if \isa{x} does not end with a digit,
 | |
| 707 | ||
| 20490 | 708 |   \item \isa{{\isacharquery}x{\isachardot}i} otherwise.
 | 
| 20477 | 709 | |
| 710 |   \end{itemize}
 | |
| 711 | ||
| 20490 | 712 | Indexnames may acquire large index numbers over time. Results are | 
| 713 |   normalized towards \isa{{\isadigit{0}}} at certain checkpoints, notably at
 | |
| 714 | the end of a proof. This works by producing variants of the | |
| 715 | corresponding basic name components. For example, the collection | |
| 716 |   \isa{{\isacharquery}x{\isadigit{1}}{\isacharcomma}\ {\isacharquery}x{\isadigit{7}}{\isacharcomma}\ {\isacharquery}x{\isadigit{4}}{\isadigit{2}}} becomes \isa{{\isacharquery}x{\isacharcomma}\ {\isacharquery}xa{\isacharcomma}\ {\isacharquery}xb}.%
 | |
| 20477 | 717 | \end{isamarkuptext}%
 | 
| 718 | \isamarkuptrue% | |
| 719 | % | |
| 720 | \isadelimmlref | |
| 721 | % | |
| 722 | \endisadelimmlref | |
| 723 | % | |
| 724 | \isatagmlref | |
| 725 | % | |
| 726 | \begin{isamarkuptext}%
 | |
| 727 | \begin{mldecls}
 | |
| 728 |   \indexmltype{indexname}\verb|type indexname| \\
 | |
| 729 |   \end{mldecls}
 | |
| 730 | ||
| 731 |   \begin{description}
 | |
| 732 | ||
| 733 | \item \verb|indexname| represents indexed names. This is an | |
| 734 | abbreviation for \verb|string * int|. The second component is | |
| 735 |   usually non-negative, except for situations where \isa{{\isacharparenleft}x{\isacharcomma}\ {\isacharminus}{\isadigit{1}}{\isacharparenright}}
 | |
| 20490 | 736 | is used to embed basic names into this type. | 
| 20477 | 737 | |
| 738 |   \end{description}%
 | |
| 20451 | 739 | \end{isamarkuptext}%
 | 
| 740 | \isamarkuptrue% | |
| 741 | % | |
| 742 | \endisatagmlref | |
| 743 | {\isafoldmlref}%
 | |
| 744 | % | |
| 745 | \isadelimmlref | |
| 746 | % | |
| 747 | \endisadelimmlref | |
| 748 | % | |
| 20477 | 749 | \isamarkupsubsection{Qualified names and name spaces%
 | 
| 20438 | 750 | } | 
| 751 | \isamarkuptrue% | |
| 752 | % | |
| 753 | \begin{isamarkuptext}%
 | |
| 20477 | 754 | A \emph{qualified name} consists of a non-empty sequence of basic
 | 
| 20490 | 755 | name components. The packed representation uses a dot as separator, | 
| 756 |   as in ``\isa{A{\isachardot}b{\isachardot}c}''.  The last component is called \emph{base}
 | |
| 757 |   name, the remaining prefix \emph{qualifier} (which may be empty).
 | |
| 758 | The idea of qualified names is to encode nested structures by | |
| 759 | recording the access paths as qualifiers. For example, an item | |
| 760 |   named ``\isa{A{\isachardot}b{\isachardot}c}'' may be understood as a local entity \isa{c}, within a local structure \isa{b}, within a global
 | |
| 761 |   structure \isa{A}.  Typically, name space hierarchies consist of
 | |
| 762 | 1--2 levels of qualification, but this need not be always so. | |
| 20477 | 763 | |
| 764 | The empty name is commonly used as an indication of unnamed | |
| 20490 | 765 | entities, whenever this makes any sense. The basic operations on | 
| 766 | qualified names are smart enough to pass through such improper names | |
| 20477 | 767 | unchanged. | 
| 768 | ||
| 769 |   \medskip A \isa{naming} policy tells how to turn a name
 | |
| 20490 | 770 |   specification into a fully qualified internal name (by the \isa{full} operation), and how fully qualified names may be accessed
 | 
| 771 | externally. For example, the default naming policy is to prefix an | |
| 772 |   implicit path: \isa{full\ x} produces \isa{path{\isachardot}x}, and the
 | |
| 773 |   standard accesses for \isa{path{\isachardot}x} include both \isa{x} and
 | |
| 774 |   \isa{path{\isachardot}x}.  Normally, the naming is implicit in the theory or
 | |
| 775 | proof context; there are separate versions of the corresponding. | |
| 20477 | 776 | |
| 777 |   \medskip A \isa{name\ space} manages a collection of fully
 | |
| 778 | internalized names, together with a mapping between external names | |
| 779 |   and internal names (in both directions).  The corresponding \isa{intern} and \isa{extern} operations are mostly used for
 | |
| 780 |   parsing and printing only!  The \isa{declare} operation augments
 | |
| 20490 | 781 | a name space according to the accesses determined by the naming | 
| 782 | policy. | |
| 20477 | 783 | |
| 20490 | 784 | \medskip As a general principle, there is a separate name space for | 
| 785 | each kind of formal entity, e.g.\ logical constant, type | |
| 786 | constructor, type class, theorem. It is usually clear from the | |
| 787 | occurrence in concrete syntax (or from the scope) which kind of | |
| 788 |   entity a name refers to.  For example, the very same name \isa{c} may be used uniformly for a constant, type constructor, and
 | |
| 789 | type class. | |
| 20477 | 790 | |
| 20481 | 791 | There are common schemes to name theorems systematically, according | 
| 20490 | 792 |   to the name of the main logical entity involved, e.g.\ \isa{c{\isachardot}intro} for a canonical theorem related to constant \isa{c}.
 | 
| 793 | This technique of mapping names from one space into another requires | |
| 794 | some care in order to avoid conflicts. In particular, theorem names | |
| 795 | derived from a type constructor or type class are better suffixed in | |
| 796 |   addition to the usual qualification, e.g.\ \isa{c{\isacharunderscore}type{\isachardot}intro}
 | |
| 797 |   and \isa{c{\isacharunderscore}class{\isachardot}intro} for theorems related to type \isa{c}
 | |
| 798 |   and class \isa{c}, respectively.%
 | |
| 20438 | 799 | \end{isamarkuptext}%
 | 
| 800 | \isamarkuptrue% | |
| 801 | % | |
| 20477 | 802 | \isadelimmlref | 
| 803 | % | |
| 804 | \endisadelimmlref | |
| 805 | % | |
| 806 | \isatagmlref | |
| 20438 | 807 | % | 
| 808 | \begin{isamarkuptext}%
 | |
| 20477 | 809 | \begin{mldecls}
 | 
| 810 |   \indexml{NameSpace.base}\verb|NameSpace.base: string -> string| \\
 | |
| 20530 
448594cbd82b
renamed NameSpace.drop_base to NameSpace.qualifier;
 wenzelm parents: 
20490diff
changeset | 811 |   \indexml{NameSpace.qualifier}\verb|NameSpace.qualifier: string -> string| \\
 | 
| 20477 | 812 |   \indexml{NameSpace.append}\verb|NameSpace.append: string -> string -> string| \\
 | 
| 21862 | 813 |   \indexml{NameSpace.implode}\verb|NameSpace.implode: string list -> string| \\
 | 
| 814 |   \indexml{NameSpace.explode}\verb|NameSpace.explode: string -> string list| \\
 | |
| 20547 | 815 |   \end{mldecls}
 | 
| 816 |   \begin{mldecls}
 | |
| 20477 | 817 |   \indexmltype{NameSpace.naming}\verb|type NameSpace.naming| \\
 | 
| 818 |   \indexml{NameSpace.default-naming}\verb|NameSpace.default_naming: NameSpace.naming| \\
 | |
| 819 |   \indexml{NameSpace.add-path}\verb|NameSpace.add_path: string -> NameSpace.naming -> NameSpace.naming| \\
 | |
| 20547 | 820 |   \indexml{NameSpace.full}\verb|NameSpace.full: NameSpace.naming -> string -> string| \\
 | 
| 821 |   \end{mldecls}
 | |
| 822 |   \begin{mldecls}
 | |
| 20477 | 823 |   \indexmltype{NameSpace.T}\verb|type NameSpace.T| \\
 | 
| 824 |   \indexml{NameSpace.empty}\verb|NameSpace.empty: NameSpace.T| \\
 | |
| 825 |   \indexml{NameSpace.merge}\verb|NameSpace.merge: NameSpace.T * NameSpace.T -> NameSpace.T| \\
 | |
| 826 |   \indexml{NameSpace.declare}\verb|NameSpace.declare: NameSpace.naming -> string -> NameSpace.T -> NameSpace.T| \\
 | |
| 827 |   \indexml{NameSpace.intern}\verb|NameSpace.intern: NameSpace.T -> string -> string| \\
 | |
| 828 |   \indexml{NameSpace.extern}\verb|NameSpace.extern: NameSpace.T -> string -> string| \\
 | |
| 829 |   \end{mldecls}
 | |
| 830 | ||
| 831 |   \begin{description}
 | |
| 832 | ||
| 833 |   \item \verb|NameSpace.base|~\isa{name} returns the base name of a
 | |
| 834 | qualified name. | |
| 835 | ||
| 20530 
448594cbd82b
renamed NameSpace.drop_base to NameSpace.qualifier;
 wenzelm parents: 
20490diff
changeset | 836 |   \item \verb|NameSpace.qualifier|~\isa{name} returns the qualifier
 | 
| 20477 | 837 | of a qualified name. | 
| 838 | ||
| 839 |   \item \verb|NameSpace.append|~\isa{name\isactrlisub {\isadigit{1}}\ name\isactrlisub {\isadigit{2}}}
 | |
| 840 | appends two qualified names. | |
| 841 | ||
| 21862 | 842 |   \item \verb|NameSpace.implode|~\isa{name} and \verb|NameSpace.explode|~\isa{names} convert between the packed string
 | 
| 20490 | 843 | representation and the explicit list form of qualified names. | 
| 20477 | 844 | |
| 845 | \item \verb|NameSpace.naming| represents the abstract concept of | |
| 846 | a naming policy. | |
| 847 | ||
| 848 | \item \verb|NameSpace.default_naming| is the default naming policy. | |
| 849 | In a theory context, this is usually augmented by a path prefix | |
| 850 | consisting of the theory name. | |
| 851 | ||
| 852 |   \item \verb|NameSpace.add_path|~\isa{path\ naming} augments the
 | |
| 20490 | 853 | naming policy by extending its path component. | 
| 20477 | 854 | |
| 855 |   \item \verb|NameSpace.full|\isa{naming\ name} turns a name
 | |
| 856 | specification (usually a basic name) into the fully qualified | |
| 857 | internal version, according to the given naming policy. | |
| 858 | ||
| 859 | \item \verb|NameSpace.T| represents name spaces. | |
| 860 | ||
| 20490 | 861 |   \item \verb|NameSpace.empty| and \verb|NameSpace.merge|~\isa{{\isacharparenleft}space\isactrlisub {\isadigit{1}}{\isacharcomma}\ space\isactrlisub {\isadigit{2}}{\isacharparenright}} are the canonical operations for
 | 
| 862 | maintaining name spaces according to theory data management | |
| 863 |   (\secref{sec:context-data}).
 | |
| 20477 | 864 | |
| 865 |   \item \verb|NameSpace.declare|~\isa{naming\ name\ space} enters a
 | |
| 20490 | 866 | fully qualified name into the name space, with external accesses | 
| 867 | determined by the naming policy. | |
| 20477 | 868 | |
| 869 |   \item \verb|NameSpace.intern|~\isa{space\ name} internalizes a
 | |
| 870 | (partially qualified) external name. | |
| 871 | ||
| 20490 | 872 | This operation is mostly for parsing! Note that fully qualified | 
| 873 | names stemming from declarations are produced via \verb|NameSpace.full| (or its derivatives for \verb|theory| and | |
| 874 | \verb|Proof.context|). | |
| 20477 | 875 | |
| 876 |   \item \verb|NameSpace.extern|~\isa{space\ name} externalizes a
 | |
| 877 | (fully qualified) internal name. | |
| 878 | ||
| 20490 | 879 | This operation is mostly for printing! Note unqualified names are | 
| 20477 | 880 | produced via \verb|NameSpace.base|. | 
| 881 | ||
| 882 |   \end{description}%
 | |
| 20438 | 883 | \end{isamarkuptext}%
 | 
| 884 | \isamarkuptrue% | |
| 885 | % | |
| 20477 | 886 | \endisatagmlref | 
| 887 | {\isafoldmlref}%
 | |
| 20438 | 888 | % | 
| 20477 | 889 | \isadelimmlref | 
| 890 | % | |
| 891 | \endisadelimmlref | |
| 20438 | 892 | % | 
| 18537 | 893 | \isadelimtheory | 
| 894 | % | |
| 895 | \endisadelimtheory | |
| 896 | % | |
| 897 | \isatagtheory | |
| 898 | \isacommand{end}\isamarkupfalse%
 | |
| 899 | % | |
| 900 | \endisatagtheory | |
| 901 | {\isafoldtheory}%
 | |
| 902 | % | |
| 903 | \isadelimtheory | |
| 904 | % | |
| 905 | \endisadelimtheory | |
| 906 | \isanewline | |
| 907 | \end{isabellebody}%
 | |
| 908 | %%% Local Variables: | |
| 909 | %%% mode: latex | |
| 910 | %%% TeX-master: "root" | |
| 911 | %%% End: |