src/Doc/Implementation/Prelim.thy
author wenzelm
Thu, 15 Nov 2018 21:33:00 +0100
changeset 69307 196347d2fd2d
parent 69292 06fda16e50fb
child 69597 ff784d5a5bfb
permissions -rw-r--r--
proper citation (amending 98ba42f19995);
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
61656
cfabbc083977 more uniform jEdit properties;
wenzelm
parents: 61580
diff changeset
     1
(*:maxLineLen=78:*)
cfabbc083977 more uniform jEdit properties;
wenzelm
parents: 61580
diff changeset
     2
29755
d66b34e46bdf observe usual theory naming conventions;
wenzelm
parents: 29581
diff changeset
     3
theory Prelim
d66b34e46bdf observe usual theory naming conventions;
wenzelm
parents: 29581
diff changeset
     4
imports Base
d66b34e46bdf observe usual theory naming conventions;
wenzelm
parents: 29581
diff changeset
     5
begin
18537
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
     6
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
     7
chapter \<open>Preliminaries\<close>
18537
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
     8
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
     9
section \<open>Contexts \label{sec:context}\<close>
18537
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    10
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
    11
text \<open>
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    12
  A logical context represents the background that is required for formulating
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    13
  statements and composing proofs. It acts as a medium to produce formal
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    14
  content, depending on earlier material (declarations, results etc.).
18537
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    15
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    16
  For example, derivations within the Isabelle/Pure logic can be described as
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    17
  a judgment \<open>\<Gamma> \<turnstile>\<^sub>\<Theta> \<phi>\<close>, which means that a proposition \<open>\<phi>\<close> is derivable from
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    18
  hypotheses \<open>\<Gamma>\<close> within the theory \<open>\<Theta>\<close>. There are logical reasons for keeping
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    19
  \<open>\<Theta>\<close> and \<open>\<Gamma>\<close> separate: theories can be liberal about supporting type
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    20
  constructors and schematic polymorphism of constants and axioms, while the
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    21
  inner calculus of \<open>\<Gamma> \<turnstile> \<phi>\<close> is strictly limited to Simple Type Theory (with
20451
27ea2ba48fa3 misc cleanup;
wenzelm
parents: 20450
diff changeset
    22
  fixed type variables in the assumptions).
18537
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    23
61416
b9a3324e4e62 more symbols;
wenzelm
parents: 61046
diff changeset
    24
  \<^medskip>
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    25
  Contexts and derivations are linked by the following key principles:
20429
116255c9209b more on contexts;
wenzelm
parents: 20214
diff changeset
    26
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    27
  \<^item> Transfer: monotonicity of derivations admits results to be transferred
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    28
  into a \<^emph>\<open>larger\<close> context, i.e.\ \<open>\<Gamma> \<turnstile>\<^sub>\<Theta> \<phi>\<close> implies \<open>\<Gamma>' \<turnstile>\<^sub>\<Theta>\<^sub>' \<phi>\<close> for contexts
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    29
  \<open>\<Theta>' \<supseteq> \<Theta>\<close> and \<open>\<Gamma>' \<supseteq> \<Gamma>\<close>.
18537
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    30
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    31
  \<^item> Export: discharge of hypotheses admits results to be exported into a
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    32
  \<^emph>\<open>smaller\<close> context, i.e.\ \<open>\<Gamma>' \<turnstile>\<^sub>\<Theta> \<phi>\<close> implies \<open>\<Gamma> \<turnstile>\<^sub>\<Theta> \<Delta> \<Longrightarrow> \<phi>\<close> where \<open>\<Gamma>' \<supseteq> \<Gamma>\<close>
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    33
  and \<open>\<Delta> = \<Gamma>' - \<Gamma>\<close>. Note that \<open>\<Theta>\<close> remains unchanged here, only the \<open>\<Gamma>\<close> part is
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    34
  affected.
20429
116255c9209b more on contexts;
wenzelm
parents: 20214
diff changeset
    35
18537
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    36
61416
b9a3324e4e62 more symbols;
wenzelm
parents: 61046
diff changeset
    37
  \<^medskip>
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    38
  By modeling the main characteristics of the primitive \<open>\<Theta>\<close> and \<open>\<Gamma>\<close> above, and
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    39
  abstracting over any particular logical content, we arrive at the
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    40
  fundamental notions of \<^emph>\<open>theory context\<close> and \<^emph>\<open>proof context\<close> in
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    41
  Isabelle/Isar. These implement a certain policy to manage arbitrary
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    42
  \<^emph>\<open>context data\<close>. There is a strongly-typed mechanism to declare new kinds of
20429
116255c9209b more on contexts;
wenzelm
parents: 20214
diff changeset
    43
  data at compile time.
18537
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    44
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    45
  The internal bootstrap process of Isabelle/Pure eventually reaches a stage
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    46
  where certain data slots provide the logical content of \<open>\<Theta>\<close> and \<open>\<Gamma>\<close> sketched
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    47
  above, but this does not stop there! Various additional data slots support
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    48
  all kinds of mechanisms that are not necessarily part of the core logic.
18537
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    49
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    50
  For example, there would be data for canonical introduction and elimination
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    51
  rules for arbitrary operators (depending on the object-logic and
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    52
  application), which enables users to perform standard proof steps implicitly
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    53
  (cf.\ the \<open>rule\<close> method @{cite "isabelle-isar-ref"}).
18537
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    54
61416
b9a3324e4e62 more symbols;
wenzelm
parents: 61046
diff changeset
    55
  \<^medskip>
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    56
  Thus Isabelle/Isar is able to bring forth more and more concepts
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    57
  successively. In particular, an object-logic like Isabelle/HOL continues the
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    58
  Isabelle/Pure setup by adding specific components for automated reasoning
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    59
  (classical reasoner, tableau prover, structured induction etc.) and derived
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    60
  specification mechanisms (inductive predicates, recursive functions etc.).
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    61
  All of this is ultimately based on the generic data management by theory and
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    62
  proof contexts introduced here.
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
    63
\<close>
18537
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    64
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    65
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
    66
subsection \<open>Theory context \label{sec:context-theory}\<close>
18537
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    67
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    68
text \<open>
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    69
  A \<^emph>\<open>theory\<close> is a data container with explicit name and unique identifier.
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    70
  Theories are related by a (nominal) sub-theory relation, which corresponds
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    71
  to the dependency graph of the original construction; each theory is derived
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    72
  from a certain sub-graph of ancestor theories. To this end, the system
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    73
  maintains a set of symbolic ``identification stamps'' within each theory.
18537
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    74
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    75
  The \<open>begin\<close> operation starts a new theory by importing several parent
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    76
  theories (with merged contents) and entering a special mode of nameless
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    77
  incremental updates, until the final \<open>end\<close> operation is performed.
34921
008126f730a0 formal markup of type aliases;
wenzelm
parents: 33524
diff changeset
    78
61416
b9a3324e4e62 more symbols;
wenzelm
parents: 61046
diff changeset
    79
  \<^medskip>
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    80
  The example in \figref{fig:ex-theory} below shows a theory graph derived
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    81
  from \<open>Pure\<close>, with theory \<open>Length\<close> importing \<open>Nat\<close> and \<open>List\<close>. The body of
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    82
  \<open>Length\<close> consists of a sequence of updates, resulting in locally a linear
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    83
  sub-theory relation for each intermediate step.
20447
5b75f1c4d7d6 more on contexts;
wenzelm
parents: 20437
diff changeset
    84
5b75f1c4d7d6 more on contexts;
wenzelm
parents: 20437
diff changeset
    85
  \begin{figure}[htb]
5b75f1c4d7d6 more on contexts;
wenzelm
parents: 20437
diff changeset
    86
  \begin{center}
20429
116255c9209b more on contexts;
wenzelm
parents: 20214
diff changeset
    87
  \begin{tabular}{rcccl}
61493
0debd22f0c0e isabelle update_cartouches -t;
wenzelm
parents: 61477
diff changeset
    88
        &            & \<open>Pure\<close> \\
0debd22f0c0e isabelle update_cartouches -t;
wenzelm
parents: 61477
diff changeset
    89
        &            & \<open>\<down>\<close> \\
0debd22f0c0e isabelle update_cartouches -t;
wenzelm
parents: 61477
diff changeset
    90
        &            & \<open>FOL\<close> \\
18537
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    91
        & $\swarrow$ &              & $\searrow$ & \\
61493
0debd22f0c0e isabelle update_cartouches -t;
wenzelm
parents: 61477
diff changeset
    92
  \<open>Nat\<close> &    &              &            & \<open>List\<close> \\
18537
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    93
        & $\searrow$ &              & $\swarrow$ \\
61493
0debd22f0c0e isabelle update_cartouches -t;
wenzelm
parents: 61477
diff changeset
    94
        &            & \<open>Length\<close> \\
26864
1417e704d724 replaced macros by antiquotations;
wenzelm
parents: 24137
diff changeset
    95
        &            & \multicolumn{3}{l}{~~@{keyword "begin"}} \\
18537
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    96
        &            & $\vdots$~~ \\
26864
1417e704d724 replaced macros by antiquotations;
wenzelm
parents: 24137
diff changeset
    97
        &            & \multicolumn{3}{l}{~~@{command "end"}} \\
20429
116255c9209b more on contexts;
wenzelm
parents: 20214
diff changeset
    98
  \end{tabular}
20451
27ea2ba48fa3 misc cleanup;
wenzelm
parents: 20450
diff changeset
    99
  \caption{A theory definition depending on ancestors}\label{fig:ex-theory}
20447
5b75f1c4d7d6 more on contexts;
wenzelm
parents: 20437
diff changeset
   100
  \end{center}
5b75f1c4d7d6 more on contexts;
wenzelm
parents: 20437
diff changeset
   101
  \end{figure}
20451
27ea2ba48fa3 misc cleanup;
wenzelm
parents: 20450
diff changeset
   102
61416
b9a3324e4e62 more symbols;
wenzelm
parents: 61046
diff changeset
   103
  \<^medskip>
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   104
  Derived formal entities may retain a reference to the background theory in
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   105
  order to indicate the formal context from which they were produced. This
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   106
  provides an immutable certificate of the background theory.
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   107
\<close>
18537
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   108
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   109
text %mlref \<open>
20447
5b75f1c4d7d6 more on contexts;
wenzelm
parents: 20437
diff changeset
   110
  \begin{mldecls}
5b75f1c4d7d6 more on contexts;
wenzelm
parents: 20437
diff changeset
   111
  @{index_ML_type theory} \\
60948
b710a5087116 prefer theory_id operations;
wenzelm
parents: 59902
diff changeset
   112
  @{index_ML Context.eq_thy: "theory * theory -> bool"} \\
b710a5087116 prefer theory_id operations;
wenzelm
parents: 59902
diff changeset
   113
  @{index_ML Context.subthy: "theory * theory -> bool"} \\
48930
10b89c127153 updated Theory.begin_theory;
wenzelm
parents: 47174
diff changeset
   114
  @{index_ML Theory.begin_theory: "string * Position.T -> theory list -> theory"} \\
39837
eacb7825025d cover some more theory operations;
wenzelm
parents: 39833
diff changeset
   115
  @{index_ML Theory.parents_of: "theory -> theory list"} \\
eacb7825025d cover some more theory operations;
wenzelm
parents: 39833
diff changeset
   116
  @{index_ML Theory.ancestors_of: "theory -> theory list"} \\
20547
wenzelm
parents: 20530
diff changeset
   117
  \end{mldecls}
20447
5b75f1c4d7d6 more on contexts;
wenzelm
parents: 20437
diff changeset
   118
61439
2bf52eec4e8a more symbols;
wenzelm
parents: 61416
diff changeset
   119
  \<^descr> Type @{ML_type theory} represents theory contexts.
20447
5b75f1c4d7d6 more on contexts;
wenzelm
parents: 20437
diff changeset
   120
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   121
  \<^descr> @{ML "Context.eq_thy"}~\<open>(thy\<^sub>1, thy\<^sub>2)\<close> check strict identity of two
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   122
  theories.
39837
eacb7825025d cover some more theory operations;
wenzelm
parents: 39833
diff changeset
   123
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   124
  \<^descr> @{ML "Context.subthy"}~\<open>(thy\<^sub>1, thy\<^sub>2)\<close> compares theories according to the
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   125
  intrinsic graph structure of the construction. This sub-theory relation is a
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   126
  nominal approximation of inclusion (\<open>\<subseteq>\<close>) of the corresponding content
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   127
  (according to the semantics of the ML modules that implement the data).
20447
5b75f1c4d7d6 more on contexts;
wenzelm
parents: 20437
diff changeset
   128
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   129
  \<^descr> @{ML "Theory.begin_theory"}~\<open>name parents\<close> constructs a new theory based
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   130
  on the given parents. This ML function is normally not invoked directly.
20447
5b75f1c4d7d6 more on contexts;
wenzelm
parents: 20437
diff changeset
   131
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   132
  \<^descr> @{ML "Theory.parents_of"}~\<open>thy\<close> returns the direct ancestors of \<open>thy\<close>.
39837
eacb7825025d cover some more theory operations;
wenzelm
parents: 39833
diff changeset
   133
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   134
  \<^descr> @{ML "Theory.ancestors_of"}~\<open>thy\<close> returns all ancestors of \<open>thy\<close> (not
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   135
  including \<open>thy\<close> itself).
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   136
\<close>
20430
wenzelm
parents: 20429
diff changeset
   137
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   138
text %mlantiq \<open>
39832
1080dee73a53 various concrete ML antiquotations;
wenzelm
parents: 39825
diff changeset
   139
  \begin{matharray}{rcl}
61493
0debd22f0c0e isabelle update_cartouches -t;
wenzelm
parents: 61477
diff changeset
   140
  @{ML_antiquotation_def "theory"} & : & \<open>ML_antiquotation\<close> \\
0debd22f0c0e isabelle update_cartouches -t;
wenzelm
parents: 61477
diff changeset
   141
  @{ML_antiquotation_def "theory_context"} & : & \<open>ML_antiquotation\<close> \\
39832
1080dee73a53 various concrete ML antiquotations;
wenzelm
parents: 39825
diff changeset
   142
  \end{matharray}
1080dee73a53 various concrete ML antiquotations;
wenzelm
parents: 39825
diff changeset
   143
55112
b1a5d603fd12 prefer rail cartouche -- avoid back-slashed quotes;
wenzelm
parents: 53015
diff changeset
   144
  @{rail \<open>
67146
909dcdec2122 more embedded cartouche arguments;
wenzelm
parents: 62969
diff changeset
   145
  @@{ML_antiquotation theory} embedded?
51686
532e0ac5a66d added ML antiquotation @{theory_context};
wenzelm
parents: 48992
diff changeset
   146
  ;
67146
909dcdec2122 more embedded cartouche arguments;
wenzelm
parents: 62969
diff changeset
   147
  @@{ML_antiquotation theory_context} embedded
55112
b1a5d603fd12 prefer rail cartouche -- avoid back-slashed quotes;
wenzelm
parents: 53015
diff changeset
   148
  \<close>}
39832
1080dee73a53 various concrete ML antiquotations;
wenzelm
parents: 39825
diff changeset
   149
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   150
  \<^descr> \<open>@{theory}\<close> refers to the background theory of the current context --- as
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   151
  abstract value.
39832
1080dee73a53 various concrete ML antiquotations;
wenzelm
parents: 39825
diff changeset
   152
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   153
  \<^descr> \<open>@{theory A}\<close> refers to an explicitly named ancestor theory \<open>A\<close> of the
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   154
  background theory of the current context --- as abstract value.
39832
1080dee73a53 various concrete ML antiquotations;
wenzelm
parents: 39825
diff changeset
   155
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   156
  \<^descr> \<open>@{theory_context A}\<close> is similar to \<open>@{theory A}\<close>, but presents the result
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   157
  as initial @{ML_type Proof.context} (see also @{ML
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   158
  Proof_Context.init_global}).
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   159
\<close>
39832
1080dee73a53 various concrete ML antiquotations;
wenzelm
parents: 39825
diff changeset
   160
18537
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   161
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   162
subsection \<open>Proof context \label{sec:context-proof}\<close>
18537
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   163
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   164
text \<open>
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   165
  A proof context is a container for pure data that refers to the theory from
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   166
  which it is derived. The \<open>init\<close> operation creates a proof context from a
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   167
  given theory. There is an explicit \<open>transfer\<close> operation to force
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   168
  resynchronization with updates to the background theory -- this is rarely
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   169
  required in practice.
20429
116255c9209b more on contexts;
wenzelm
parents: 20214
diff changeset
   170
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   171
  Entities derived in a proof context need to record logical requirements
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   172
  explicitly, since there is no separate context identification or symbolic
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   173
  inclusion as for theories. For example, hypotheses used in primitive
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   174
  derivations (cf.\ \secref{sec:thms}) are recorded separately within the
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   175
  sequent \<open>\<Gamma> \<turnstile> \<phi>\<close>, just to make double sure. Results could still leak into an
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   176
  alien proof context due to programming errors, but Isabelle/Isar includes
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   177
  some extra validity checks in critical positions, notably at the end of a
34921
008126f730a0 formal markup of type aliases;
wenzelm
parents: 33524
diff changeset
   178
  sub-proof.
20429
116255c9209b more on contexts;
wenzelm
parents: 20214
diff changeset
   179
20451
27ea2ba48fa3 misc cleanup;
wenzelm
parents: 20450
diff changeset
   180
  Proof contexts may be manipulated arbitrarily, although the common
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   181
  discipline is to follow block structure as a mental model: a given context
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   182
  is extended consecutively, and results are exported back into the original
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   183
  context. Note that an Isar proof state models block-structured reasoning
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   184
  explicitly, using a stack of proof contexts internally. For various
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   185
  technical reasons, the background theory of an Isar proof state must not be
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   186
  changed while the proof is still under construction!
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   187
\<close>
18537
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   188
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   189
text %mlref \<open>
20449
f8a7a8236c68 more stuff;
wenzelm
parents: 20447
diff changeset
   190
  \begin{mldecls}
f8a7a8236c68 more stuff;
wenzelm
parents: 20447
diff changeset
   191
  @{index_ML_type Proof.context} \\
42361
23f352990944 modernized structure Proof_Context;
wenzelm
parents: 42358
diff changeset
   192
  @{index_ML Proof_Context.init_global: "theory -> Proof.context"} \\
23f352990944 modernized structure Proof_Context;
wenzelm
parents: 42358
diff changeset
   193
  @{index_ML Proof_Context.theory_of: "Proof.context -> theory"} \\
23f352990944 modernized structure Proof_Context;
wenzelm
parents: 42358
diff changeset
   194
  @{index_ML Proof_Context.transfer: "theory -> Proof.context -> Proof.context"} \\
20449
f8a7a8236c68 more stuff;
wenzelm
parents: 20447
diff changeset
   195
  \end{mldecls}
f8a7a8236c68 more stuff;
wenzelm
parents: 20447
diff changeset
   196
61439
2bf52eec4e8a more symbols;
wenzelm
parents: 61416
diff changeset
   197
  \<^descr> Type @{ML_type Proof.context} represents proof contexts.
20449
f8a7a8236c68 more stuff;
wenzelm
parents: 20447
diff changeset
   198
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   199
  \<^descr> @{ML Proof_Context.init_global}~\<open>thy\<close> produces a proof context derived
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   200
  from \<open>thy\<close>, initializing all data.
20449
f8a7a8236c68 more stuff;
wenzelm
parents: 20447
diff changeset
   201
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   202
  \<^descr> @{ML Proof_Context.theory_of}~\<open>ctxt\<close> selects the background theory from
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   203
  \<open>ctxt\<close>.
20449
f8a7a8236c68 more stuff;
wenzelm
parents: 20447
diff changeset
   204
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   205
  \<^descr> @{ML Proof_Context.transfer}~\<open>thy ctxt\<close> promotes the background theory of
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   206
  \<open>ctxt\<close> to the super theory \<open>thy\<close>.
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   207
\<close>
20449
f8a7a8236c68 more stuff;
wenzelm
parents: 20447
diff changeset
   208
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   209
text %mlantiq \<open>
39832
1080dee73a53 various concrete ML antiquotations;
wenzelm
parents: 39825
diff changeset
   210
  \begin{matharray}{rcl}
61493
0debd22f0c0e isabelle update_cartouches -t;
wenzelm
parents: 61477
diff changeset
   211
  @{ML_antiquotation_def "context"} & : & \<open>ML_antiquotation\<close> \\
39832
1080dee73a53 various concrete ML antiquotations;
wenzelm
parents: 39825
diff changeset
   212
  \end{matharray}
1080dee73a53 various concrete ML antiquotations;
wenzelm
parents: 39825
diff changeset
   213
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   214
  \<^descr> \<open>@{context}\<close> refers to \<^emph>\<open>the\<close> context at compile-time --- as abstract
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   215
  value. Independently of (local) theory or proof mode, this always produces a
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   216
  meaningful result.
39832
1080dee73a53 various concrete ML antiquotations;
wenzelm
parents: 39825
diff changeset
   217
1080dee73a53 various concrete ML antiquotations;
wenzelm
parents: 39825
diff changeset
   218
  This is probably the most common antiquotation in interactive
1080dee73a53 various concrete ML antiquotations;
wenzelm
parents: 39825
diff changeset
   219
  experimentation with ML inside Isar.
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   220
\<close>
39832
1080dee73a53 various concrete ML antiquotations;
wenzelm
parents: 39825
diff changeset
   221
20430
wenzelm
parents: 20429
diff changeset
   222
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   223
subsection \<open>Generic contexts \label{sec:generic-context}\<close>
20429
116255c9209b more on contexts;
wenzelm
parents: 20214
diff changeset
   224
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   225
text \<open>
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   226
  A generic context is the disjoint sum of either a theory or proof context.
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   227
  Occasionally, this enables uniform treatment of generic context data,
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   228
  typically extra-logical information. Operations on generic contexts include
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   229
  the usual injections, partial selections, and combinators for lifting
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   230
  operations on either component of the disjoint sum.
20449
f8a7a8236c68 more stuff;
wenzelm
parents: 20447
diff changeset
   231
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   232
  Moreover, there are total operations \<open>theory_of\<close> and \<open>proof_of\<close> to convert a
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   233
  generic context into either kind: a theory can always be selected from the
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   234
  sum, while a proof context might have to be constructed by an ad-hoc \<open>init\<close>
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   235
  operation, which incurs a small runtime overhead.
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   236
\<close>
20430
wenzelm
parents: 20429
diff changeset
   237
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   238
text %mlref \<open>
20449
f8a7a8236c68 more stuff;
wenzelm
parents: 20447
diff changeset
   239
  \begin{mldecls}
f8a7a8236c68 more stuff;
wenzelm
parents: 20447
diff changeset
   240
  @{index_ML_type Context.generic} \\
f8a7a8236c68 more stuff;
wenzelm
parents: 20447
diff changeset
   241
  @{index_ML Context.theory_of: "Context.generic -> theory"} \\
f8a7a8236c68 more stuff;
wenzelm
parents: 20447
diff changeset
   242
  @{index_ML Context.proof_of: "Context.generic -> Proof.context"} \\
f8a7a8236c68 more stuff;
wenzelm
parents: 20447
diff changeset
   243
  \end{mldecls}
f8a7a8236c68 more stuff;
wenzelm
parents: 20447
diff changeset
   244
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   245
  \<^descr> Type @{ML_type Context.generic} is the direct sum of @{ML_type "theory"}
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   246
  and @{ML_type "Proof.context"}, with the datatype constructors @{ML
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   247
  "Context.Theory"} and @{ML "Context.Proof"}.
20449
f8a7a8236c68 more stuff;
wenzelm
parents: 20447
diff changeset
   248
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   249
  \<^descr> @{ML Context.theory_of}~\<open>context\<close> always produces a theory from the
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   250
  generic \<open>context\<close>, using @{ML "Proof_Context.theory_of"} as required.
20449
f8a7a8236c68 more stuff;
wenzelm
parents: 20447
diff changeset
   251
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   252
  \<^descr> @{ML Context.proof_of}~\<open>context\<close> always produces a proof context from the
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   253
  generic \<open>context\<close>, using @{ML "Proof_Context.init_global"} as required (note
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   254
  that this re-initializes the context data with each invocation).
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   255
\<close>
20437
wenzelm
parents: 20430
diff changeset
   256
20476
6d3f144cc1bd more on names;
wenzelm
parents: 20475
diff changeset
   257
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   258
subsection \<open>Context data \label{sec:context-data}\<close>
20447
5b75f1c4d7d6 more on contexts;
wenzelm
parents: 20437
diff changeset
   259
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   260
text \<open>
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   261
  The main purpose of theory and proof contexts is to manage arbitrary (pure)
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   262
  data. New data types can be declared incrementally at compile time. There
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   263
  are separate declaration mechanisms for any of the three kinds of contexts:
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   264
  theory, proof, generic.
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   265
\<close>
20449
f8a7a8236c68 more stuff;
wenzelm
parents: 20447
diff changeset
   266
61506
wenzelm
parents: 61503
diff changeset
   267
paragraph \<open>Theory data\<close>
wenzelm
parents: 61503
diff changeset
   268
text \<open>declarations need to implement the following ML signature:
20449
f8a7a8236c68 more stuff;
wenzelm
parents: 20447
diff changeset
   269
61416
b9a3324e4e62 more symbols;
wenzelm
parents: 61046
diff changeset
   270
  \<^medskip>
20449
f8a7a8236c68 more stuff;
wenzelm
parents: 20447
diff changeset
   271
  \begin{tabular}{ll}
61493
0debd22f0c0e isabelle update_cartouches -t;
wenzelm
parents: 61477
diff changeset
   272
  \<open>\<type> T\<close> & representing type \\
0debd22f0c0e isabelle update_cartouches -t;
wenzelm
parents: 61477
diff changeset
   273
  \<open>\<val> empty: T\<close> & empty default value \\
0debd22f0c0e isabelle update_cartouches -t;
wenzelm
parents: 61477
diff changeset
   274
  \<open>\<val> extend: T \<rightarrow> T\<close> & re-initialize on import \\
0debd22f0c0e isabelle update_cartouches -t;
wenzelm
parents: 61477
diff changeset
   275
  \<open>\<val> merge: T \<times> T \<rightarrow> T\<close> & join on import \\
20449
f8a7a8236c68 more stuff;
wenzelm
parents: 20447
diff changeset
   276
  \end{tabular}
61416
b9a3324e4e62 more symbols;
wenzelm
parents: 61046
diff changeset
   277
  \<^medskip>
20449
f8a7a8236c68 more stuff;
wenzelm
parents: 20447
diff changeset
   278
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   279
  The \<open>empty\<close> value acts as initial default for \<^emph>\<open>any\<close> theory that does not
69292
wenzelm
parents: 67146
diff changeset
   280
  declare actual data content; \<open>extend\<close> acts like a unitary version of
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   281
  \<open>merge\<close>.
20449
f8a7a8236c68 more stuff;
wenzelm
parents: 20447
diff changeset
   282
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   283
  Implementing \<open>merge\<close> can be tricky. The general idea is that \<open>merge (data\<^sub>1,
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   284
  data\<^sub>2)\<close> inserts those parts of \<open>data\<^sub>2\<close> into \<open>data\<^sub>1\<close> that are not yet
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   285
  present, while keeping the general order of things. The @{ML Library.merge}
34921
008126f730a0 formal markup of type aliases;
wenzelm
parents: 33524
diff changeset
   286
  function on plain lists may serve as canonical template.
008126f730a0 formal markup of type aliases;
wenzelm
parents: 33524
diff changeset
   287
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   288
  Particularly note that shared parts of the data must not be duplicated by
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   289
  naive concatenation, or a theory graph that is like a chain of diamonds
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   290
  would cause an exponential blowup!
61506
wenzelm
parents: 61503
diff changeset
   291
\<close>
34921
008126f730a0 formal markup of type aliases;
wenzelm
parents: 33524
diff changeset
   292
61506
wenzelm
parents: 61503
diff changeset
   293
paragraph \<open>Proof context data\<close>
wenzelm
parents: 61503
diff changeset
   294
text \<open>declarations need to implement the following ML signature:
20449
f8a7a8236c68 more stuff;
wenzelm
parents: 20447
diff changeset
   295
61416
b9a3324e4e62 more symbols;
wenzelm
parents: 61046
diff changeset
   296
  \<^medskip>
20449
f8a7a8236c68 more stuff;
wenzelm
parents: 20447
diff changeset
   297
  \begin{tabular}{ll}
61493
0debd22f0c0e isabelle update_cartouches -t;
wenzelm
parents: 61477
diff changeset
   298
  \<open>\<type> T\<close> & representing type \\
0debd22f0c0e isabelle update_cartouches -t;
wenzelm
parents: 61477
diff changeset
   299
  \<open>\<val> init: theory \<rightarrow> T\<close> & produce initial value \\
20449
f8a7a8236c68 more stuff;
wenzelm
parents: 20447
diff changeset
   300
  \end{tabular}
61416
b9a3324e4e62 more symbols;
wenzelm
parents: 61046
diff changeset
   301
  \<^medskip>
20449
f8a7a8236c68 more stuff;
wenzelm
parents: 20447
diff changeset
   302
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   303
  The \<open>init\<close> operation is supposed to produce a pure value from the given
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   304
  background theory and should be somehow ``immediate''. Whenever a proof
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   305
  context is initialized, which happens frequently, the the system invokes the
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   306
  \<open>init\<close> operation of \<^emph>\<open>all\<close> theory data slots ever declared. This also means
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   307
  that one needs to be economic about the total number of proof data
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   308
  declarations in the system, i.e.\ each ML module should declare at most one,
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   309
  sometimes two data slots for its internal use. Repeated data declarations to
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   310
  simulate a record type should be avoided!
61506
wenzelm
parents: 61503
diff changeset
   311
\<close>
20449
f8a7a8236c68 more stuff;
wenzelm
parents: 20447
diff changeset
   312
61506
wenzelm
parents: 61503
diff changeset
   313
paragraph \<open>Generic data\<close>
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   314
text \<open>
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   315
  provides a hybrid interface for both theory and proof data. The \<open>init\<close>
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   316
  operation for proof contexts is predefined to select the current data value
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   317
  from the background theory.
20449
f8a7a8236c68 more stuff;
wenzelm
parents: 20447
diff changeset
   318
61416
b9a3324e4e62 more symbols;
wenzelm
parents: 61046
diff changeset
   319
  \<^bigskip>
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   320
  Any of the above data declarations over type \<open>T\<close> result in an ML structure
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   321
  with the following signature:
20449
f8a7a8236c68 more stuff;
wenzelm
parents: 20447
diff changeset
   322
61416
b9a3324e4e62 more symbols;
wenzelm
parents: 61046
diff changeset
   323
  \<^medskip>
20449
f8a7a8236c68 more stuff;
wenzelm
parents: 20447
diff changeset
   324
  \begin{tabular}{ll}
61493
0debd22f0c0e isabelle update_cartouches -t;
wenzelm
parents: 61477
diff changeset
   325
  \<open>get: context \<rightarrow> T\<close> \\
0debd22f0c0e isabelle update_cartouches -t;
wenzelm
parents: 61477
diff changeset
   326
  \<open>put: T \<rightarrow> context \<rightarrow> context\<close> \\
0debd22f0c0e isabelle update_cartouches -t;
wenzelm
parents: 61477
diff changeset
   327
  \<open>map: (T \<rightarrow> T) \<rightarrow> context \<rightarrow> context\<close> \\
20449
f8a7a8236c68 more stuff;
wenzelm
parents: 20447
diff changeset
   328
  \end{tabular}
61416
b9a3324e4e62 more symbols;
wenzelm
parents: 61046
diff changeset
   329
  \<^medskip>
20449
f8a7a8236c68 more stuff;
wenzelm
parents: 20447
diff changeset
   330
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   331
  These other operations provide exclusive access for the particular kind of
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   332
  context (theory, proof, or generic context). This interface observes the ML
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   333
  discipline for types and scopes: there is no other way to access the
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   334
  corresponding data slot of a context. By keeping these operations private,
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   335
  an Isabelle/ML module may maintain abstract values authentically.
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   336
\<close>
20447
5b75f1c4d7d6 more on contexts;
wenzelm
parents: 20437
diff changeset
   337
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   338
text %mlref \<open>
20450
wenzelm
parents: 20449
diff changeset
   339
  \begin{mldecls}
33524
a08e6c1cbc04 updated functor Theory_Data, Proof_Data, Generic_Data;
wenzelm
parents: 33174
diff changeset
   340
  @{index_ML_functor Theory_Data} \\
a08e6c1cbc04 updated functor Theory_Data, Proof_Data, Generic_Data;
wenzelm
parents: 33174
diff changeset
   341
  @{index_ML_functor Proof_Data} \\
a08e6c1cbc04 updated functor Theory_Data, Proof_Data, Generic_Data;
wenzelm
parents: 33174
diff changeset
   342
  @{index_ML_functor Generic_Data} \\
20450
wenzelm
parents: 20449
diff changeset
   343
  \end{mldecls}
wenzelm
parents: 20449
diff changeset
   344
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   345
  \<^descr> @{ML_functor Theory_Data}\<open>(spec)\<close> declares data for type @{ML_type theory}
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   346
  according to the specification provided as argument structure. The resulting
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   347
  structure provides data init and access operations as described above.
20450
wenzelm
parents: 20449
diff changeset
   348
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   349
  \<^descr> @{ML_functor Proof_Data}\<open>(spec)\<close> is analogous to @{ML_functor Theory_Data}
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   350
  for type @{ML_type Proof.context}.
20450
wenzelm
parents: 20449
diff changeset
   351
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   352
  \<^descr> @{ML_functor Generic_Data}\<open>(spec)\<close> is analogous to @{ML_functor
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   353
  Theory_Data} for type @{ML_type Context.generic}. \<close>
20450
wenzelm
parents: 20449
diff changeset
   354
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   355
text %mlex \<open>
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   356
  The following artificial example demonstrates theory data: we maintain a set
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   357
  of terms that are supposed to be wellformed wrt.\ the enclosing theory. The
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   358
  public interface is as follows:
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   359
\<close>
34928
c4cd36411983 moved examples to proper place;
wenzelm
parents: 34927
diff changeset
   360
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   361
ML \<open>
34928
c4cd36411983 moved examples to proper place;
wenzelm
parents: 34927
diff changeset
   362
  signature WELLFORMED_TERMS =
c4cd36411983 moved examples to proper place;
wenzelm
parents: 34927
diff changeset
   363
  sig
c4cd36411983 moved examples to proper place;
wenzelm
parents: 34927
diff changeset
   364
    val get: theory -> term list
c4cd36411983 moved examples to proper place;
wenzelm
parents: 34927
diff changeset
   365
    val add: term -> theory -> theory
c4cd36411983 moved examples to proper place;
wenzelm
parents: 34927
diff changeset
   366
  end;
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   367
\<close>
34928
c4cd36411983 moved examples to proper place;
wenzelm
parents: 34927
diff changeset
   368
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   369
text \<open>
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   370
  The implementation uses private theory data internally, and only exposes an
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   371
  operation that involves explicit argument checking wrt.\ the given theory.
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   372
\<close>
34928
c4cd36411983 moved examples to proper place;
wenzelm
parents: 34927
diff changeset
   373
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   374
ML \<open>
34928
c4cd36411983 moved examples to proper place;
wenzelm
parents: 34927
diff changeset
   375
  structure Wellformed_Terms: WELLFORMED_TERMS =
c4cd36411983 moved examples to proper place;
wenzelm
parents: 34927
diff changeset
   376
  struct
c4cd36411983 moved examples to proper place;
wenzelm
parents: 34927
diff changeset
   377
c4cd36411983 moved examples to proper place;
wenzelm
parents: 34927
diff changeset
   378
  structure Terms = Theory_Data
c4cd36411983 moved examples to proper place;
wenzelm
parents: 34927
diff changeset
   379
  (
39687
4e9b6ada3a21 modernized structure Ord_List;
wenzelm
parents: 37533
diff changeset
   380
    type T = term Ord_List.T;
34928
c4cd36411983 moved examples to proper place;
wenzelm
parents: 34927
diff changeset
   381
    val empty = [];
c4cd36411983 moved examples to proper place;
wenzelm
parents: 34927
diff changeset
   382
    val extend = I;
c4cd36411983 moved examples to proper place;
wenzelm
parents: 34927
diff changeset
   383
    fun merge (ts1, ts2) =
39687
4e9b6ada3a21 modernized structure Ord_List;
wenzelm
parents: 37533
diff changeset
   384
      Ord_List.union Term_Ord.fast_term_ord ts1 ts2;
39861
b8d89db3e238 use continental paragraph style, which works better with mixture of (in)formal text;
wenzelm
parents: 39857
diff changeset
   385
  );
34928
c4cd36411983 moved examples to proper place;
wenzelm
parents: 34927
diff changeset
   386
c4cd36411983 moved examples to proper place;
wenzelm
parents: 34927
diff changeset
   387
  val get = Terms.get;
c4cd36411983 moved examples to proper place;
wenzelm
parents: 34927
diff changeset
   388
c4cd36411983 moved examples to proper place;
wenzelm
parents: 34927
diff changeset
   389
  fun add raw_t thy =
39821
bf164c153d10 minor tuning and updating;
wenzelm
parents: 39687
diff changeset
   390
    let
bf164c153d10 minor tuning and updating;
wenzelm
parents: 39687
diff changeset
   391
      val t = Sign.cert_term thy raw_t;
bf164c153d10 minor tuning and updating;
wenzelm
parents: 39687
diff changeset
   392
    in
bf164c153d10 minor tuning and updating;
wenzelm
parents: 39687
diff changeset
   393
      Terms.map (Ord_List.insert Term_Ord.fast_term_ord t) thy
bf164c153d10 minor tuning and updating;
wenzelm
parents: 39687
diff changeset
   394
    end;
34928
c4cd36411983 moved examples to proper place;
wenzelm
parents: 34927
diff changeset
   395
c4cd36411983 moved examples to proper place;
wenzelm
parents: 34927
diff changeset
   396
  end;
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   397
\<close>
34928
c4cd36411983 moved examples to proper place;
wenzelm
parents: 34927
diff changeset
   398
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   399
text \<open>
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   400
  Type @{ML_type "term Ord_List.T"} is used for reasonably efficient
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   401
  representation of a set of terms: all operations are linear in the number of
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   402
  stored elements. Here we assume that users of this module do not care about
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   403
  the declaration order, since that data structure forces its own arrangement
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   404
  of elements.
34928
c4cd36411983 moved examples to proper place;
wenzelm
parents: 34927
diff changeset
   405
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   406
  Observe how the @{ML_text merge} operation joins the data slots of the two
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   407
  constituents: @{ML Ord_List.union} prevents duplication of common data from
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   408
  different branches, thus avoiding the danger of exponential blowup. Plain
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   409
  list append etc.\ must never be used for theory data merges!
34928
c4cd36411983 moved examples to proper place;
wenzelm
parents: 34927
diff changeset
   410
61416
b9a3324e4e62 more symbols;
wenzelm
parents: 61046
diff changeset
   411
  \<^medskip>
b9a3324e4e62 more symbols;
wenzelm
parents: 61046
diff changeset
   412
  Our intended invariant is achieved as follows:
34928
c4cd36411983 moved examples to proper place;
wenzelm
parents: 34927
diff changeset
   413
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   414
    \<^enum> @{ML Wellformed_Terms.add} only admits terms that have passed the @{ML
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   415
    Sign.cert_term} check of the given theory at that point.
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   416
  
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   417
    \<^enum> Wellformedness in the sense of @{ML Sign.cert_term} is monotonic wrt.\
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   418
    the sub-theory relation. So our data can move upwards in the hierarchy
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   419
    (via extension or merges), and maintain wellformedness without further
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   420
    checks.
34928
c4cd36411983 moved examples to proper place;
wenzelm
parents: 34927
diff changeset
   421
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   422
  Note that all basic operations of the inference kernel (which includes @{ML
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   423
  Sign.cert_term}) observe this monotonicity principle, but other user-space
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   424
  tools don't. For example, fully-featured type-inference via @{ML
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   425
  Syntax.check_term} (cf.\ \secref{sec:term-check}) is not necessarily
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   426
  monotonic wrt.\ the background theory, since constraints of term constants
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   427
  can be modified by later declarations, for example.
34928
c4cd36411983 moved examples to proper place;
wenzelm
parents: 34927
diff changeset
   428
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   429
  In most cases, user-space context data does not have to take such invariants
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   430
  too seriously. The situation is different in the implementation of the
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   431
  inference kernel itself, which uses the very same data mechanisms for types,
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   432
  constants, axioms etc.
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   433
\<close>
34928
c4cd36411983 moved examples to proper place;
wenzelm
parents: 34927
diff changeset
   434
20447
5b75f1c4d7d6 more on contexts;
wenzelm
parents: 20437
diff changeset
   435
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   436
subsection \<open>Configuration options \label{sec:config-options}\<close>
39865
a724b90f951e more on "Configuration options";
wenzelm
parents: 39864
diff changeset
   437
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   438
text \<open>
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   439
  A \<^emph>\<open>configuration option\<close> is a named optional value of some basic type
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   440
  (Boolean, integer, string) that is stored in the context. It is a simple
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   441
  application of general context data (\secref{sec:context-data}) that is
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   442
  sufficiently common to justify customized setup, which includes some
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   443
  concrete declarations for end-users using existing notation for attributes
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   444
  (cf.\ \secref{sec:attributes}).
39865
a724b90f951e more on "Configuration options";
wenzelm
parents: 39864
diff changeset
   445
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   446
  For example, the predefined configuration option @{attribute show_types}
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   447
  controls output of explicit type constraints for variables in printed terms
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   448
  (cf.\ \secref{sec:read-print}). Its value can be modified within Isar text
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   449
  like this:
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   450
\<close>
39865
a724b90f951e more on "Configuration options";
wenzelm
parents: 39864
diff changeset
   451
59902
6afbe5a99139 misc tuning -- keep name space more clean;
wenzelm
parents: 59859
diff changeset
   452
experiment
6afbe5a99139 misc tuning -- keep name space more clean;
wenzelm
parents: 59859
diff changeset
   453
begin
6afbe5a99139 misc tuning -- keep name space more clean;
wenzelm
parents: 59859
diff changeset
   454
39865
a724b90f951e more on "Configuration options";
wenzelm
parents: 39864
diff changeset
   455
declare [[show_types = false]]
61580
c49a8ebd30cc isabelle update_cartouches -c;
wenzelm
parents: 61506
diff changeset
   456
  \<comment> \<open>declaration within (local) theory context\<close>
39865
a724b90f951e more on "Configuration options";
wenzelm
parents: 39864
diff changeset
   457
40964
482a8334ee9e prefer 'notepad' over 'example_proof';
wenzelm
parents: 40628
diff changeset
   458
notepad
482a8334ee9e prefer 'notepad' over 'example_proof';
wenzelm
parents: 40628
diff changeset
   459
begin
39865
a724b90f951e more on "Configuration options";
wenzelm
parents: 39864
diff changeset
   460
  note [[show_types = true]]
61580
c49a8ebd30cc isabelle update_cartouches -c;
wenzelm
parents: 61506
diff changeset
   461
    \<comment> \<open>declaration within proof (forward mode)\<close>
39865
a724b90f951e more on "Configuration options";
wenzelm
parents: 39864
diff changeset
   462
  term x
a724b90f951e more on "Configuration options";
wenzelm
parents: 39864
diff changeset
   463
a724b90f951e more on "Configuration options";
wenzelm
parents: 39864
diff changeset
   464
  have "x = x"
a724b90f951e more on "Configuration options";
wenzelm
parents: 39864
diff changeset
   465
    using [[show_types = false]]
61580
c49a8ebd30cc isabelle update_cartouches -c;
wenzelm
parents: 61506
diff changeset
   466
      \<comment> \<open>declaration within proof (backward mode)\<close>
39865
a724b90f951e more on "Configuration options";
wenzelm
parents: 39864
diff changeset
   467
    ..
40964
482a8334ee9e prefer 'notepad' over 'example_proof';
wenzelm
parents: 40628
diff changeset
   468
end
39865
a724b90f951e more on "Configuration options";
wenzelm
parents: 39864
diff changeset
   469
59902
6afbe5a99139 misc tuning -- keep name space more clean;
wenzelm
parents: 59859
diff changeset
   470
end
6afbe5a99139 misc tuning -- keep name space more clean;
wenzelm
parents: 59859
diff changeset
   471
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   472
text \<open>
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   473
  Configuration options that are not set explicitly hold a default value that
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   474
  can depend on the application context. This allows to retrieve the value
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   475
  from another slot within the context, or fall back on a global preference
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   476
  mechanism, for example.
39865
a724b90f951e more on "Configuration options";
wenzelm
parents: 39864
diff changeset
   477
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   478
  The operations to declare configuration options and get/map their values are
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   479
  modeled as direct replacements for historic global references, only that the
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   480
  context is made explicit. This allows easy configuration of tools, without
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   481
  relying on the execution order as required for old-style mutable
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   482
  references.
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   483
\<close>
39865
a724b90f951e more on "Configuration options";
wenzelm
parents: 39864
diff changeset
   484
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   485
text %mlref \<open>
39865
a724b90f951e more on "Configuration options";
wenzelm
parents: 39864
diff changeset
   486
  \begin{mldecls}
a724b90f951e more on "Configuration options";
wenzelm
parents: 39864
diff changeset
   487
  @{index_ML Config.get: "Proof.context -> 'a Config.T -> 'a"} \\
a724b90f951e more on "Configuration options";
wenzelm
parents: 39864
diff changeset
   488
  @{index_ML Config.map: "'a Config.T -> ('a -> 'a) -> Proof.context -> Proof.context"} \\
42616
92715b528e78 added Attrib.setup_config_XXX conveniences, with implicit setup of the background theory;
wenzelm
parents: 42510
diff changeset
   489
  @{index_ML Attrib.setup_config_bool: "binding -> (Context.generic -> bool) ->
92715b528e78 added Attrib.setup_config_XXX conveniences, with implicit setup of the background theory;
wenzelm
parents: 42510
diff changeset
   490
  bool Config.T"} \\
92715b528e78 added Attrib.setup_config_XXX conveniences, with implicit setup of the background theory;
wenzelm
parents: 42510
diff changeset
   491
  @{index_ML Attrib.setup_config_int: "binding -> (Context.generic -> int) ->
92715b528e78 added Attrib.setup_config_XXX conveniences, with implicit setup of the background theory;
wenzelm
parents: 42510
diff changeset
   492
  int Config.T"} \\
92715b528e78 added Attrib.setup_config_XXX conveniences, with implicit setup of the background theory;
wenzelm
parents: 42510
diff changeset
   493
  @{index_ML Attrib.setup_config_real: "binding -> (Context.generic -> real) ->
92715b528e78 added Attrib.setup_config_XXX conveniences, with implicit setup of the background theory;
wenzelm
parents: 42510
diff changeset
   494
  real Config.T"} \\
92715b528e78 added Attrib.setup_config_XXX conveniences, with implicit setup of the background theory;
wenzelm
parents: 42510
diff changeset
   495
  @{index_ML Attrib.setup_config_string: "binding -> (Context.generic -> string) ->
92715b528e78 added Attrib.setup_config_XXX conveniences, with implicit setup of the background theory;
wenzelm
parents: 42510
diff changeset
   496
  string Config.T"} \\
39865
a724b90f951e more on "Configuration options";
wenzelm
parents: 39864
diff changeset
   497
  \end{mldecls}
a724b90f951e more on "Configuration options";
wenzelm
parents: 39864
diff changeset
   498
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   499
  \<^descr> @{ML Config.get}~\<open>ctxt config\<close> gets the value of \<open>config\<close> in the given
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   500
  context.
39865
a724b90f951e more on "Configuration options";
wenzelm
parents: 39864
diff changeset
   501
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   502
  \<^descr> @{ML Config.map}~\<open>config f ctxt\<close> updates the context by updating the value
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   503
  of \<open>config\<close>.
39865
a724b90f951e more on "Configuration options";
wenzelm
parents: 39864
diff changeset
   504
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   505
  \<^descr> \<open>config =\<close>~@{ML Attrib.setup_config_bool}~\<open>name default\<close> creates a named
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   506
  configuration option of type @{ML_type bool}, with the given \<open>default\<close>
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   507
  depending on the application context. The resulting \<open>config\<close> can be used to
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   508
  get/map its value in a given context. There is an implicit update of the
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   509
  background theory that registers the option as attribute with some concrete
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   510
  syntax.
39865
a724b90f951e more on "Configuration options";
wenzelm
parents: 39864
diff changeset
   511
61439
2bf52eec4e8a more symbols;
wenzelm
parents: 61416
diff changeset
   512
  \<^descr> @{ML Attrib.config_int}, @{ML Attrib.config_real}, and @{ML
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   513
  Attrib.config_string} work like @{ML Attrib.config_bool}, but for types
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   514
  @{ML_type int} and @{ML_type string}, respectively.
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   515
\<close>
39865
a724b90f951e more on "Configuration options";
wenzelm
parents: 39864
diff changeset
   516
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   517
text %mlex \<open>
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   518
  The following example shows how to declare and use a Boolean configuration
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   519
  option called \<open>my_flag\<close> with constant default value @{ML false}.
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   520
\<close>
39865
a724b90f951e more on "Configuration options";
wenzelm
parents: 39864
diff changeset
   521
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   522
ML \<open>
42616
92715b528e78 added Attrib.setup_config_XXX conveniences, with implicit setup of the background theory;
wenzelm
parents: 42510
diff changeset
   523
  val my_flag =
92715b528e78 added Attrib.setup_config_XXX conveniences, with implicit setup of the background theory;
wenzelm
parents: 42510
diff changeset
   524
    Attrib.setup_config_bool @{binding my_flag} (K false)
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   525
\<close>
39865
a724b90f951e more on "Configuration options";
wenzelm
parents: 39864
diff changeset
   526
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   527
text \<open>
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   528
  Now the user can refer to @{attribute my_flag} in declarations, while ML
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   529
  tools can retrieve the current value from the context via @{ML Config.get}.
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   530
\<close>
39865
a724b90f951e more on "Configuration options";
wenzelm
parents: 39864
diff changeset
   531
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   532
ML_val \<open>@{assert} (Config.get @{context} my_flag = false)\<close>
39865
a724b90f951e more on "Configuration options";
wenzelm
parents: 39864
diff changeset
   533
a724b90f951e more on "Configuration options";
wenzelm
parents: 39864
diff changeset
   534
declare [[my_flag = true]]
a724b90f951e more on "Configuration options";
wenzelm
parents: 39864
diff changeset
   535
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   536
ML_val \<open>@{assert} (Config.get @{context} my_flag = true)\<close>
39865
a724b90f951e more on "Configuration options";
wenzelm
parents: 39864
diff changeset
   537
40964
482a8334ee9e prefer 'notepad' over 'example_proof';
wenzelm
parents: 40628
diff changeset
   538
notepad
482a8334ee9e prefer 'notepad' over 'example_proof';
wenzelm
parents: 40628
diff changeset
   539
begin
39866
5ec01d5acd0c more robust examples: explicit @{assert} instead of unchecked output;
wenzelm
parents: 39865
diff changeset
   540
  {
5ec01d5acd0c more robust examples: explicit @{assert} instead of unchecked output;
wenzelm
parents: 39865
diff changeset
   541
    note [[my_flag = false]]
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   542
    ML_val \<open>@{assert} (Config.get @{context} my_flag = false)\<close>
39866
5ec01d5acd0c more robust examples: explicit @{assert} instead of unchecked output;
wenzelm
parents: 39865
diff changeset
   543
  }
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   544
  ML_val \<open>@{assert} (Config.get @{context} my_flag = true)\<close>
40964
482a8334ee9e prefer 'notepad' over 'example_proof';
wenzelm
parents: 40628
diff changeset
   545
end
39865
a724b90f951e more on "Configuration options";
wenzelm
parents: 39864
diff changeset
   546
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   547
text \<open>
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   548
  Here is another example involving ML type @{ML_type real} (floating-point
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   549
  numbers).
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   550
\<close>
40291
012ed4426fda support for real valued configuration options;
wenzelm
parents: 40241
diff changeset
   551
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   552
ML \<open>
42616
92715b528e78 added Attrib.setup_config_XXX conveniences, with implicit setup of the background theory;
wenzelm
parents: 42510
diff changeset
   553
  val airspeed_velocity =
92715b528e78 added Attrib.setup_config_XXX conveniences, with implicit setup of the background theory;
wenzelm
parents: 42510
diff changeset
   554
    Attrib.setup_config_real @{binding airspeed_velocity} (K 0.0)
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   555
\<close>
40291
012ed4426fda support for real valued configuration options;
wenzelm
parents: 40241
diff changeset
   556
40296
ac4d75f86d97 syntax category "real" subsumes plain "int";
wenzelm
parents: 40291
diff changeset
   557
declare [[airspeed_velocity = 10]]
40291
012ed4426fda support for real valued configuration options;
wenzelm
parents: 40241
diff changeset
   558
declare [[airspeed_velocity = 9.9]]
012ed4426fda support for real valued configuration options;
wenzelm
parents: 40241
diff changeset
   559
39865
a724b90f951e more on "Configuration options";
wenzelm
parents: 39864
diff changeset
   560
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   561
section \<open>Names \label{sec:names}\<close>
20451
27ea2ba48fa3 misc cleanup;
wenzelm
parents: 20450
diff changeset
   562
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   563
text \<open>
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   564
  In principle, a name is just a string, but there are various conventions for
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   565
  representing additional structure. For example, ``\<open>Foo.bar.baz\<close>'' is
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   566
  considered as a long name consisting of qualifier \<open>Foo.bar\<close> and base name
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   567
  \<open>baz\<close>. The individual constituents of a name may have further substructure,
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   568
  e.g.\ the string ``\<^verbatim>\<open>\<alpha>\<close>'' encodes as a single symbol (\secref{sec:symbols}).
34927
c4c02ac736a6 more details on long names, binding/naming, name space;
wenzelm
parents: 34926
diff changeset
   569
61416
b9a3324e4e62 more symbols;
wenzelm
parents: 61046
diff changeset
   570
  \<^medskip>
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   571
  Subsequently, we shall introduce specific categories of names. Roughly
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   572
  speaking these correspond to logical entities as follows:
34927
c4c02ac736a6 more details on long names, binding/naming, name space;
wenzelm
parents: 34926
diff changeset
   573
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   574
  \<^item> Basic names (\secref{sec:basic-name}): free and bound variables.
34927
c4c02ac736a6 more details on long names, binding/naming, name space;
wenzelm
parents: 34926
diff changeset
   575
61416
b9a3324e4e62 more symbols;
wenzelm
parents: 61046
diff changeset
   576
  \<^item> Indexed names (\secref{sec:indexname}): schematic variables.
34927
c4c02ac736a6 more details on long names, binding/naming, name space;
wenzelm
parents: 34926
diff changeset
   577
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   578
  \<^item> Long names (\secref{sec:long-name}): constants of any kind (type
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   579
  constructors, term constants, other concepts defined in user space). Such
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   580
  entities are typically managed via name spaces (\secref{sec:name-space}).
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   581
\<close>
20437
wenzelm
parents: 20430
diff changeset
   582
wenzelm
parents: 20430
diff changeset
   583
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   584
subsection \<open>Basic names \label{sec:basic-name}\<close>
20476
6d3f144cc1bd more on names;
wenzelm
parents: 20475
diff changeset
   585
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   586
text \<open>
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   587
  A \<^emph>\<open>basic name\<close> essentially consists of a single Isabelle identifier. There
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   588
  are conventions to mark separate classes of basic names, by attaching a
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   589
  suffix of underscores: one underscore means \<^emph>\<open>internal name\<close>, two
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   590
  underscores means \<^emph>\<open>Skolem name\<close>, three underscores means \<^emph>\<open>internal Skolem
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   591
  name\<close>.
20476
6d3f144cc1bd more on names;
wenzelm
parents: 20475
diff changeset
   592
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   593
  For example, the basic name \<open>foo\<close> has the internal version \<open>foo_\<close>, with
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   594
  Skolem versions \<open>foo__\<close> and \<open>foo___\<close>, respectively.
20476
6d3f144cc1bd more on names;
wenzelm
parents: 20475
diff changeset
   595
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   596
  These special versions provide copies of the basic name space, apart from
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   597
  anything that normally appears in the user text. For example, system
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   598
  generated variables in Isar proof contexts are usually marked as internal,
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   599
  which prevents mysterious names like \<open>xaa\<close> to appear in human-readable text.
20476
6d3f144cc1bd more on names;
wenzelm
parents: 20475
diff changeset
   600
61416
b9a3324e4e62 more symbols;
wenzelm
parents: 61046
diff changeset
   601
  \<^medskip>
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   602
  Manipulating binding scopes often requires on-the-fly renamings. A \<^emph>\<open>name
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   603
  context\<close> contains a collection of already used names. The \<open>declare\<close>
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   604
  operation adds names to the context.
20476
6d3f144cc1bd more on names;
wenzelm
parents: 20475
diff changeset
   605
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   606
  The \<open>invents\<close> operation derives a number of fresh names from a given
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   607
  starting point. For example, the first three names derived from \<open>a\<close> are \<open>a\<close>,
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   608
  \<open>b\<close>, \<open>c\<close>.
20476
6d3f144cc1bd more on names;
wenzelm
parents: 20475
diff changeset
   609
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   610
  The \<open>variants\<close> operation produces fresh names by incrementing tentative
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   611
  names as base-26 numbers (with digits \<open>a..z\<close>) until all clashes are
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   612
  resolved. For example, name \<open>foo\<close> results in variants \<open>fooa\<close>, \<open>foob\<close>,
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   613
  \<open>fooc\<close>, \dots, \<open>fooaa\<close>, \<open>fooab\<close> etc.; each renaming step picks the next
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   614
  unused variant from this sequence.
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   615
\<close>
20476
6d3f144cc1bd more on names;
wenzelm
parents: 20475
diff changeset
   616
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   617
text %mlref \<open>
20476
6d3f144cc1bd more on names;
wenzelm
parents: 20475
diff changeset
   618
  \begin{mldecls}
6d3f144cc1bd more on names;
wenzelm
parents: 20475
diff changeset
   619
  @{index_ML Name.internal: "string -> string"} \\
20547
wenzelm
parents: 20530
diff changeset
   620
  @{index_ML Name.skolem: "string -> string"} \\
wenzelm
parents: 20530
diff changeset
   621
  \end{mldecls}
wenzelm
parents: 20530
diff changeset
   622
  \begin{mldecls}
20476
6d3f144cc1bd more on names;
wenzelm
parents: 20475
diff changeset
   623
  @{index_ML_type Name.context} \\
6d3f144cc1bd more on names;
wenzelm
parents: 20475
diff changeset
   624
  @{index_ML Name.context: Name.context} \\
6d3f144cc1bd more on names;
wenzelm
parents: 20475
diff changeset
   625
  @{index_ML Name.declare: "string -> Name.context -> Name.context"} \\
43329
84472e198515 tuned signature: Name.invent and Name.invent_names;
wenzelm
parents: 43326
diff changeset
   626
  @{index_ML Name.invent: "Name.context -> string -> int -> string list"} \\
43326
47cf4bc789aa simplified Name.variant -- discontinued builtin fold_map;
wenzelm
parents: 42616
diff changeset
   627
  @{index_ML Name.variant: "string -> Name.context -> string * Name.context"} \\
20476
6d3f144cc1bd more on names;
wenzelm
parents: 20475
diff changeset
   628
  \end{mldecls}
34926
19294b07e445 Variable.names_of;
wenzelm
parents: 34925
diff changeset
   629
  \begin{mldecls}
19294b07e445 Variable.names_of;
wenzelm
parents: 34925
diff changeset
   630
  @{index_ML Variable.names_of: "Proof.context -> Name.context"} \\
19294b07e445 Variable.names_of;
wenzelm
parents: 34925
diff changeset
   631
  \end{mldecls}
20476
6d3f144cc1bd more on names;
wenzelm
parents: 20475
diff changeset
   632
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   633
  \<^descr> @{ML Name.internal}~\<open>name\<close> produces an internal name by adding one
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   634
  underscore.
20476
6d3f144cc1bd more on names;
wenzelm
parents: 20475
diff changeset
   635
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   636
  \<^descr> @{ML Name.skolem}~\<open>name\<close> produces a Skolem name by adding two underscores.
20476
6d3f144cc1bd more on names;
wenzelm
parents: 20475
diff changeset
   637
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   638
  \<^descr> Type @{ML_type Name.context} represents the context of already used names;
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   639
  the initial value is @{ML "Name.context"}.
20476
6d3f144cc1bd more on names;
wenzelm
parents: 20475
diff changeset
   640
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   641
  \<^descr> @{ML Name.declare}~\<open>name\<close> enters a used name into the context.
20437
wenzelm
parents: 20430
diff changeset
   642
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   643
  \<^descr> @{ML Name.invent}~\<open>context name n\<close> produces \<open>n\<close> fresh names derived from
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   644
  \<open>name\<close>.
20488
wenzelm
parents: 20479
diff changeset
   645
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   646
  \<^descr> @{ML Name.variant}~\<open>name context\<close> produces a fresh variant of \<open>name\<close>; the
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   647
  result is declared to the context.
20476
6d3f144cc1bd more on names;
wenzelm
parents: 20475
diff changeset
   648
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   649
  \<^descr> @{ML Variable.names_of}~\<open>ctxt\<close> retrieves the context of declared type and
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   650
  term variable names. Projecting a proof context down to a primitive name
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   651
  context is occasionally useful when invoking lower-level operations. Regular
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   652
  management of ``fresh variables'' is done by suitable operations of
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   653
  structure @{ML_structure Variable}, which is also able to provide an
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   654
  official status of ``locally fixed variable'' within the logical environment
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   655
  (cf.\ \secref{sec:variables}).
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   656
\<close>
20476
6d3f144cc1bd more on names;
wenzelm
parents: 20475
diff changeset
   657
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   658
text %mlex \<open>
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   659
  The following simple examples demonstrate how to produce fresh names from
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   660
  the initial @{ML Name.context}.
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   661
\<close>
39857
ea93e088398d more examples;
wenzelm
parents: 39846
diff changeset
   662
59902
6afbe5a99139 misc tuning -- keep name space more clean;
wenzelm
parents: 59859
diff changeset
   663
ML_val \<open>
43329
84472e198515 tuned signature: Name.invent and Name.invent_names;
wenzelm
parents: 43326
diff changeset
   664
  val list1 = Name.invent Name.context "a" 5;
39866
5ec01d5acd0c more robust examples: explicit @{assert} instead of unchecked output;
wenzelm
parents: 39865
diff changeset
   665
  @{assert} (list1 = ["a", "b", "c", "d", "e"]);
5ec01d5acd0c more robust examples: explicit @{assert} instead of unchecked output;
wenzelm
parents: 39865
diff changeset
   666
5ec01d5acd0c more robust examples: explicit @{assert} instead of unchecked output;
wenzelm
parents: 39865
diff changeset
   667
  val list2 =
43326
47cf4bc789aa simplified Name.variant -- discontinued builtin fold_map;
wenzelm
parents: 42616
diff changeset
   668
    #1 (fold_map Name.variant ["x", "x", "a", "a", "'a", "'a"] Name.context);
39866
5ec01d5acd0c more robust examples: explicit @{assert} instead of unchecked output;
wenzelm
parents: 39865
diff changeset
   669
  @{assert} (list2 = ["x", "xa", "a", "aa", "'a", "'aa"]);
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   670
\<close>
39857
ea93e088398d more examples;
wenzelm
parents: 39846
diff changeset
   671
61416
b9a3324e4e62 more symbols;
wenzelm
parents: 61046
diff changeset
   672
text \<open>
b9a3324e4e62 more symbols;
wenzelm
parents: 61046
diff changeset
   673
  \<^medskip>
b9a3324e4e62 more symbols;
wenzelm
parents: 61046
diff changeset
   674
  The same works relatively to the formal context as follows.\<close>
39857
ea93e088398d more examples;
wenzelm
parents: 39846
diff changeset
   675
59902
6afbe5a99139 misc tuning -- keep name space more clean;
wenzelm
parents: 59859
diff changeset
   676
experiment fixes a b c :: 'a
39857
ea93e088398d more examples;
wenzelm
parents: 39846
diff changeset
   677
begin
ea93e088398d more examples;
wenzelm
parents: 39846
diff changeset
   678
59902
6afbe5a99139 misc tuning -- keep name space more clean;
wenzelm
parents: 59859
diff changeset
   679
ML_val \<open>
39857
ea93e088398d more examples;
wenzelm
parents: 39846
diff changeset
   680
  val names = Variable.names_of @{context};
39866
5ec01d5acd0c more robust examples: explicit @{assert} instead of unchecked output;
wenzelm
parents: 39865
diff changeset
   681
43329
84472e198515 tuned signature: Name.invent and Name.invent_names;
wenzelm
parents: 43326
diff changeset
   682
  val list1 = Name.invent names "a" 5;
39866
5ec01d5acd0c more robust examples: explicit @{assert} instead of unchecked output;
wenzelm
parents: 39865
diff changeset
   683
  @{assert} (list1 = ["d", "e", "f", "g", "h"]);
5ec01d5acd0c more robust examples: explicit @{assert} instead of unchecked output;
wenzelm
parents: 39865
diff changeset
   684
5ec01d5acd0c more robust examples: explicit @{assert} instead of unchecked output;
wenzelm
parents: 39865
diff changeset
   685
  val list2 =
43326
47cf4bc789aa simplified Name.variant -- discontinued builtin fold_map;
wenzelm
parents: 42616
diff changeset
   686
    #1 (fold_map Name.variant ["x", "x", "a", "a", "'a", "'a"] names);
39866
5ec01d5acd0c more robust examples: explicit @{assert} instead of unchecked output;
wenzelm
parents: 39865
diff changeset
   687
  @{assert} (list2 = ["x", "xa", "aa", "ab", "'aa", "'ab"]);
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   688
\<close>
39857
ea93e088398d more examples;
wenzelm
parents: 39846
diff changeset
   689
ea93e088398d more examples;
wenzelm
parents: 39846
diff changeset
   690
end
ea93e088398d more examples;
wenzelm
parents: 39846
diff changeset
   691
20476
6d3f144cc1bd more on names;
wenzelm
parents: 20475
diff changeset
   692
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   693
subsection \<open>Indexed names \label{sec:indexname}\<close>
20476
6d3f144cc1bd more on names;
wenzelm
parents: 20475
diff changeset
   694
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   695
text \<open>
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   696
  An \<^emph>\<open>indexed name\<close> (or \<open>indexname\<close>) is a pair of a basic name and a natural
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   697
  number. This representation allows efficient renaming by incrementing the
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   698
  second component only. The canonical way to rename two collections of
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   699
  indexnames apart from each other is this: determine the maximum index
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   700
  \<open>maxidx\<close> of the first collection, then increment all indexes of the second
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   701
  collection by \<open>maxidx + 1\<close>; the maximum index of an empty collection is
61493
0debd22f0c0e isabelle update_cartouches -t;
wenzelm
parents: 61477
diff changeset
   702
  \<open>-1\<close>.
20476
6d3f144cc1bd more on names;
wenzelm
parents: 20475
diff changeset
   703
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   704
  Occasionally, basic names are injected into the same pair type of indexed
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   705
  names: then \<open>(x, -1)\<close> is used to encode the basic name \<open>x\<close>.
20488
wenzelm
parents: 20479
diff changeset
   706
61416
b9a3324e4e62 more symbols;
wenzelm
parents: 61046
diff changeset
   707
  \<^medskip>
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   708
  Isabelle syntax observes the following rules for representing an indexname
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   709
  \<open>(x, i)\<close> as a packed string:
20476
6d3f144cc1bd more on names;
wenzelm
parents: 20475
diff changeset
   710
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   711
    \<^item> \<open>?x\<close> if \<open>x\<close> does not end with a digit and \<open>i = 0\<close>,
20476
6d3f144cc1bd more on names;
wenzelm
parents: 20475
diff changeset
   712
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   713
    \<^item> \<open>?xi\<close> if \<open>x\<close> does not end with a digit,
20476
6d3f144cc1bd more on names;
wenzelm
parents: 20475
diff changeset
   714
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   715
    \<^item> \<open>?x.i\<close> otherwise.
20470
c839b38a1f32 more on variables;
wenzelm
parents: 20452
diff changeset
   716
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   717
  Indexnames may acquire large index numbers after several maxidx shifts have
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   718
  been applied. Results are usually normalized towards \<open>0\<close> at certain
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   719
  checkpoints, notably at the end of a proof. This works by producing variants
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   720
  of the corresponding basic name components. For example, the collection
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   721
  \<open>?x1, ?x7, ?x42\<close> becomes \<open>?x, ?xa, ?xb\<close>.
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   722
\<close>
20476
6d3f144cc1bd more on names;
wenzelm
parents: 20475
diff changeset
   723
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   724
text %mlref \<open>
20476
6d3f144cc1bd more on names;
wenzelm
parents: 20475
diff changeset
   725
  \begin{mldecls}
39861
b8d89db3e238 use continental paragraph style, which works better with mixture of (in)formal text;
wenzelm
parents: 39857
diff changeset
   726
  @{index_ML_type indexname: "string * int"} \\
20476
6d3f144cc1bd more on names;
wenzelm
parents: 20475
diff changeset
   727
  \end{mldecls}
6d3f144cc1bd more on names;
wenzelm
parents: 20475
diff changeset
   728
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   729
  \<^descr> Type @{ML_type indexname} represents indexed names. This is an
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   730
  abbreviation for @{ML_type "string * int"}. The second component is usually
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   731
  non-negative, except for situations where \<open>(x, -1)\<close> is used to inject basic
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   732
  names into this type. Other negative indexes should not be used.
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   733
\<close>
20476
6d3f144cc1bd more on names;
wenzelm
parents: 20475
diff changeset
   734
6d3f144cc1bd more on names;
wenzelm
parents: 20475
diff changeset
   735
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   736
subsection \<open>Long names \label{sec:long-name}\<close>
20476
6d3f144cc1bd more on names;
wenzelm
parents: 20475
diff changeset
   737
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   738
text \<open>
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   739
  A \<^emph>\<open>long name\<close> consists of a sequence of non-empty name components. The
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   740
  packed representation uses a dot as separator, as in ``\<open>A.b.c\<close>''. The last
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   741
  component is called \<^emph>\<open>base name\<close>, the remaining prefix is called
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   742
  \<^emph>\<open>qualifier\<close> (which may be empty). The qualifier can be understood as the
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   743
  access path to the named entity while passing through some nested
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   744
  block-structure, although our free-form long names do not really enforce any
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   745
  strict discipline.
34927
c4c02ac736a6 more details on long names, binding/naming, name space;
wenzelm
parents: 34926
diff changeset
   746
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   747
  For example, an item named ``\<open>A.b.c\<close>'' may be understood as a local entity
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   748
  \<open>c\<close>, within a local structure \<open>b\<close>, within a global structure \<open>A\<close>. In
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   749
  practice, long names usually represent 1--3 levels of qualification. User ML
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   750
  code should not make any assumptions about the particular structure of long
34927
c4c02ac736a6 more details on long names, binding/naming, name space;
wenzelm
parents: 34926
diff changeset
   751
  names!
20437
wenzelm
parents: 20430
diff changeset
   752
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   753
  The empty name is commonly used as an indication of unnamed entities, or
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   754
  entities that are not entered into the corresponding name space, whenever
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   755
  this makes any sense. The basic operations on long names map empty names
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   756
  again to empty names.
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   757
\<close>
20437
wenzelm
parents: 20430
diff changeset
   758
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   759
text %mlref \<open>
20476
6d3f144cc1bd more on names;
wenzelm
parents: 20475
diff changeset
   760
  \begin{mldecls}
30365
790129514c2d adapted to structure Long_Name;
wenzelm
parents: 30281
diff changeset
   761
  @{index_ML Long_Name.base_name: "string -> string"} \\
790129514c2d adapted to structure Long_Name;
wenzelm
parents: 30281
diff changeset
   762
  @{index_ML Long_Name.qualifier: "string -> string"} \\
790129514c2d adapted to structure Long_Name;
wenzelm
parents: 30281
diff changeset
   763
  @{index_ML Long_Name.append: "string -> string -> string"} \\
790129514c2d adapted to structure Long_Name;
wenzelm
parents: 30281
diff changeset
   764
  @{index_ML Long_Name.implode: "string list -> string"} \\
790129514c2d adapted to structure Long_Name;
wenzelm
parents: 30281
diff changeset
   765
  @{index_ML Long_Name.explode: "string -> string list"} \\
20547
wenzelm
parents: 20530
diff changeset
   766
  \end{mldecls}
34927
c4c02ac736a6 more details on long names, binding/naming, name space;
wenzelm
parents: 34926
diff changeset
   767
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   768
  \<^descr> @{ML Long_Name.base_name}~\<open>name\<close> returns the base name of a long name.
34927
c4c02ac736a6 more details on long names, binding/naming, name space;
wenzelm
parents: 34926
diff changeset
   769
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   770
  \<^descr> @{ML Long_Name.qualifier}~\<open>name\<close> returns the qualifier of a long name.
34927
c4c02ac736a6 more details on long names, binding/naming, name space;
wenzelm
parents: 34926
diff changeset
   771
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   772
  \<^descr> @{ML Long_Name.append}~\<open>name\<^sub>1 name\<^sub>2\<close> appends two long names.
34927
c4c02ac736a6 more details on long names, binding/naming, name space;
wenzelm
parents: 34926
diff changeset
   773
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   774
  \<^descr> @{ML Long_Name.implode}~\<open>names\<close> and @{ML Long_Name.explode}~\<open>name\<close> convert
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   775
  between the packed string representation and the explicit list form of long
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   776
  names.
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   777
\<close>
34927
c4c02ac736a6 more details on long names, binding/naming, name space;
wenzelm
parents: 34926
diff changeset
   778
c4c02ac736a6 more details on long names, binding/naming, name space;
wenzelm
parents: 34926
diff changeset
   779
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   780
subsection \<open>Name spaces \label{sec:name-space}\<close>
34927
c4c02ac736a6 more details on long names, binding/naming, name space;
wenzelm
parents: 34926
diff changeset
   781
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   782
text \<open>
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   783
  A \<open>name space\<close> manages a collection of long names, together with a mapping
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   784
  between partially qualified external names and fully qualified internal
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   785
  names (in both directions). Note that the corresponding \<open>intern\<close> and
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   786
  \<open>extern\<close> operations are mostly used for parsing and printing only! The
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   787
  \<open>declare\<close> operation augments a name space according to the accesses
34927
c4c02ac736a6 more details on long names, binding/naming, name space;
wenzelm
parents: 34926
diff changeset
   788
  determined by a given binding, and a naming policy from the context.
c4c02ac736a6 more details on long names, binding/naming, name space;
wenzelm
parents: 34926
diff changeset
   789
61416
b9a3324e4e62 more symbols;
wenzelm
parents: 61046
diff changeset
   790
  \<^medskip>
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   791
  A \<open>binding\<close> specifies details about the prospective long name of a newly
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   792
  introduced formal entity. It consists of a base name, prefixes for
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   793
  qualification (separate ones for system infrastructure and user-space
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   794
  mechanisms), a slot for the original source position, and some additional
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   795
  flags.
34927
c4c02ac736a6 more details on long names, binding/naming, name space;
wenzelm
parents: 34926
diff changeset
   796
61416
b9a3324e4e62 more symbols;
wenzelm
parents: 61046
diff changeset
   797
  \<^medskip>
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   798
  A \<open>naming\<close> provides some additional details for producing a long name from a
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   799
  binding. Normally, the naming is implicit in the theory or proof context.
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   800
  The \<open>full\<close> operation (and its variants for different context types) produces
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   801
  a fully qualified internal name to be entered into a name space. The main
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   802
  equation of this ``chemical reaction'' when binding new entities in a
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   803
  context is as follows:
34927
c4c02ac736a6 more details on long names, binding/naming, name space;
wenzelm
parents: 34926
diff changeset
   804
61416
b9a3324e4e62 more symbols;
wenzelm
parents: 61046
diff changeset
   805
  \<^medskip>
34927
c4c02ac736a6 more details on long names, binding/naming, name space;
wenzelm
parents: 34926
diff changeset
   806
  \begin{tabular}{l}
61493
0debd22f0c0e isabelle update_cartouches -t;
wenzelm
parents: 61477
diff changeset
   807
  \<open>binding + naming \<longrightarrow> long name + name space accesses\<close>
34927
c4c02ac736a6 more details on long names, binding/naming, name space;
wenzelm
parents: 34926
diff changeset
   808
  \end{tabular}
c4c02ac736a6 more details on long names, binding/naming, name space;
wenzelm
parents: 34926
diff changeset
   809
61416
b9a3324e4e62 more symbols;
wenzelm
parents: 61046
diff changeset
   810
  \<^bigskip>
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   811
  As a general principle, there is a separate name space for each kind of
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   812
  formal entity, e.g.\ fact, logical constant, type constructor, type class.
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   813
  It is usually clear from the occurrence in concrete syntax (or from the
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   814
  scope) which kind of entity a name refers to. For example, the very same
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   815
  name \<open>c\<close> may be used uniformly for a constant, type constructor, and type
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   816
  class.
34927
c4c02ac736a6 more details on long names, binding/naming, name space;
wenzelm
parents: 34926
diff changeset
   817
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   818
  There are common schemes to name derived entities systematically according
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   819
  to the name of the main logical entity involved, e.g.\ fact \<open>c.intro\<close> for a
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   820
  canonical introduction rule related to constant \<open>c\<close>. This technique of
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   821
  mapping names from one space into another requires some care in order to
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   822
  avoid conflicts. In particular, theorem names derived from a type
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   823
  constructor or type class should get an additional suffix in addition to the
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   824
  usual qualification. This leads to the following conventions for derived
39839
08f59175e541 misc tuning;
wenzelm
parents: 39837
diff changeset
   825
  names:
08f59175e541 misc tuning;
wenzelm
parents: 39837
diff changeset
   826
61416
b9a3324e4e62 more symbols;
wenzelm
parents: 61046
diff changeset
   827
  \<^medskip>
39839
08f59175e541 misc tuning;
wenzelm
parents: 39837
diff changeset
   828
  \begin{tabular}{ll}
08f59175e541 misc tuning;
wenzelm
parents: 39837
diff changeset
   829
  logical entity & fact name \\\hline
61493
0debd22f0c0e isabelle update_cartouches -t;
wenzelm
parents: 61477
diff changeset
   830
  constant \<open>c\<close> & \<open>c.intro\<close> \\
0debd22f0c0e isabelle update_cartouches -t;
wenzelm
parents: 61477
diff changeset
   831
  type \<open>c\<close> & \<open>c_type.intro\<close> \\
0debd22f0c0e isabelle update_cartouches -t;
wenzelm
parents: 61477
diff changeset
   832
  class \<open>c\<close> & \<open>c_class.intro\<close> \\
39839
08f59175e541 misc tuning;
wenzelm
parents: 39837
diff changeset
   833
  \end{tabular}
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   834
\<close>
34927
c4c02ac736a6 more details on long names, binding/naming, name space;
wenzelm
parents: 34926
diff changeset
   835
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   836
text %mlref \<open>
34927
c4c02ac736a6 more details on long names, binding/naming, name space;
wenzelm
parents: 34926
diff changeset
   837
  \begin{mldecls}
c4c02ac736a6 more details on long names, binding/naming, name space;
wenzelm
parents: 34926
diff changeset
   838
  @{index_ML_type binding} \\
c4c02ac736a6 more details on long names, binding/naming, name space;
wenzelm
parents: 34926
diff changeset
   839
  @{index_ML Binding.empty: binding} \\
c4c02ac736a6 more details on long names, binding/naming, name space;
wenzelm
parents: 34926
diff changeset
   840
  @{index_ML Binding.name: "string -> binding"} \\
c4c02ac736a6 more details on long names, binding/naming, name space;
wenzelm
parents: 34926
diff changeset
   841
  @{index_ML Binding.qualify: "bool -> string -> binding -> binding"} \\
c4c02ac736a6 more details on long names, binding/naming, name space;
wenzelm
parents: 34926
diff changeset
   842
  @{index_ML Binding.prefix: "bool -> string -> binding -> binding"} \\
59859
f9d1442c70f3 tuned signature;
wenzelm
parents: 58742
diff changeset
   843
  @{index_ML Binding.concealed: "binding -> binding"} \\
43547
f3a8476285c6 clarified Binding.pretty/print: no quotes, only markup -- Binding.str_of is rendered obsolete;
wenzelm
parents: 43329
diff changeset
   844
  @{index_ML Binding.print: "binding -> string"} \\
34927
c4c02ac736a6 more details on long names, binding/naming, name space;
wenzelm
parents: 34926
diff changeset
   845
  \end{mldecls}
20547
wenzelm
parents: 20530
diff changeset
   846
  \begin{mldecls}
33174
1f2051f41335 adjusted to changes in corresponding ML code
haftmann
parents: 30365
diff changeset
   847
  @{index_ML_type Name_Space.naming} \\
58668
1891f17c6124 tuned signature;
wenzelm
parents: 58618
diff changeset
   848
  @{index_ML Name_Space.global_naming: Name_Space.naming} \\
33174
1f2051f41335 adjusted to changes in corresponding ML code
haftmann
parents: 30365
diff changeset
   849
  @{index_ML Name_Space.add_path: "string -> Name_Space.naming -> Name_Space.naming"} \\
1f2051f41335 adjusted to changes in corresponding ML code
haftmann
parents: 30365
diff changeset
   850
  @{index_ML Name_Space.full_name: "Name_Space.naming -> binding -> string"} \\
20547
wenzelm
parents: 20530
diff changeset
   851
  \end{mldecls}
wenzelm
parents: 20530
diff changeset
   852
  \begin{mldecls}
33174
1f2051f41335 adjusted to changes in corresponding ML code
haftmann
parents: 30365
diff changeset
   853
  @{index_ML_type Name_Space.T} \\
1f2051f41335 adjusted to changes in corresponding ML code
haftmann
parents: 30365
diff changeset
   854
  @{index_ML Name_Space.empty: "string -> Name_Space.T"} \\
1f2051f41335 adjusted to changes in corresponding ML code
haftmann
parents: 30365
diff changeset
   855
  @{index_ML Name_Space.merge: "Name_Space.T * Name_Space.T -> Name_Space.T"} \\
47174
b9b2e183e94d updated Sign.add_type, Name_Space.declare;
wenzelm
parents: 46484
diff changeset
   856
  @{index_ML Name_Space.declare: "Context.generic -> bool ->
b9b2e183e94d updated Sign.add_type, Name_Space.declare;
wenzelm
parents: 46484
diff changeset
   857
  binding -> Name_Space.T -> string * Name_Space.T"} \\
33174
1f2051f41335 adjusted to changes in corresponding ML code
haftmann
parents: 30365
diff changeset
   858
  @{index_ML Name_Space.intern: "Name_Space.T -> string -> string"} \\
42358
b47d41d9f4b5 Name_Space: proper configuration options long_names, short_names, unique_names instead of former unsynchronized references;
wenzelm
parents: 40964
diff changeset
   859
  @{index_ML Name_Space.extern: "Proof.context -> Name_Space.T -> string -> string"} \\
34927
c4c02ac736a6 more details on long names, binding/naming, name space;
wenzelm
parents: 34926
diff changeset
   860
  @{index_ML Name_Space.is_concealed: "Name_Space.T -> string -> bool"}
20476
6d3f144cc1bd more on names;
wenzelm
parents: 20475
diff changeset
   861
  \end{mldecls}
20437
wenzelm
parents: 20430
diff changeset
   862
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   863
  \<^descr> Type @{ML_type binding} represents the abstract concept of name bindings.
34927
c4c02ac736a6 more details on long names, binding/naming, name space;
wenzelm
parents: 34926
diff changeset
   864
61439
2bf52eec4e8a more symbols;
wenzelm
parents: 61416
diff changeset
   865
  \<^descr> @{ML Binding.empty} is the empty binding.
20476
6d3f144cc1bd more on names;
wenzelm
parents: 20475
diff changeset
   866
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   867
  \<^descr> @{ML Binding.name}~\<open>name\<close> produces a binding with base name \<open>name\<close>. Note
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   868
  that this lacks proper source position information; see also the ML
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   869
  antiquotation @{ML_antiquotation binding}.
34927
c4c02ac736a6 more details on long names, binding/naming, name space;
wenzelm
parents: 34926
diff changeset
   870
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   871
  \<^descr> @{ML Binding.qualify}~\<open>mandatory name binding\<close> prefixes qualifier \<open>name\<close>
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   872
  to \<open>binding\<close>. The \<open>mandatory\<close> flag tells if this name component always needs
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   873
  to be given in name space accesses --- this is mostly \<open>false\<close> in practice.
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   874
  Note that this part of qualification is typically used in derived
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   875
  specification mechanisms.
20437
wenzelm
parents: 20430
diff changeset
   876
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   877
  \<^descr> @{ML Binding.prefix} is similar to @{ML Binding.qualify}, but affects the
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   878
  system prefix. This part of extra qualification is typically used in the
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   879
  infrastructure for modular specifications, notably ``local theory targets''
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   880
  (see also \chref{ch:local-theory}).
20437
wenzelm
parents: 20430
diff changeset
   881
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   882
  \<^descr> @{ML Binding.concealed}~\<open>binding\<close> indicates that the binding shall refer
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   883
  to an entity that serves foundational purposes only. This flag helps to mark
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   884
  implementation details of specification mechanism etc. Other tools should
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   885
  not depend on the particulars of concealed entities (cf.\ @{ML
34927
c4c02ac736a6 more details on long names, binding/naming, name space;
wenzelm
parents: 34926
diff changeset
   886
  Name_Space.is_concealed}).
c4c02ac736a6 more details on long names, binding/naming, name space;
wenzelm
parents: 34926
diff changeset
   887
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   888
  \<^descr> @{ML Binding.print}~\<open>binding\<close> produces a string representation for
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   889
  human-readable output, together with some formal markup that might get used
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   890
  in GUI front-ends, for example.
20476
6d3f144cc1bd more on names;
wenzelm
parents: 20475
diff changeset
   891
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   892
  \<^descr> Type @{ML_type Name_Space.naming} represents the abstract concept of a
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   893
  naming policy.
20437
wenzelm
parents: 20430
diff changeset
   894
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   895
  \<^descr> @{ML Name_Space.global_naming} is the default naming policy: it is global
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   896
  and lacks any path prefix. In a regular theory context this is augmented by
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   897
  a path prefix consisting of the theory name.
20476
6d3f144cc1bd more on names;
wenzelm
parents: 20475
diff changeset
   898
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   899
  \<^descr> @{ML Name_Space.add_path}~\<open>path naming\<close> augments the naming policy by
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   900
  extending its path component.
20437
wenzelm
parents: 20430
diff changeset
   901
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   902
  \<^descr> @{ML Name_Space.full_name}~\<open>naming binding\<close> turns a name binding (usually
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   903
  a basic name) into the fully qualified internal name, according to the given
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   904
  naming policy.
20476
6d3f144cc1bd more on names;
wenzelm
parents: 20475
diff changeset
   905
61439
2bf52eec4e8a more symbols;
wenzelm
parents: 61416
diff changeset
   906
  \<^descr> Type @{ML_type Name_Space.T} represents name spaces.
20476
6d3f144cc1bd more on names;
wenzelm
parents: 20475
diff changeset
   907
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   908
  \<^descr> @{ML Name_Space.empty}~\<open>kind\<close> and @{ML Name_Space.merge}~\<open>(space\<^sub>1,
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   909
  space\<^sub>2)\<close> are the canonical operations for maintaining name spaces according
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   910
  to theory data management (\secref{sec:context-data}); \<open>kind\<close> is a formal
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   911
  comment to characterize the purpose of a name space.
20437
wenzelm
parents: 20430
diff changeset
   912
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   913
  \<^descr> @{ML Name_Space.declare}~\<open>context strict binding space\<close> enters a name
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   914
  binding as fully qualified internal name into the name space, using the
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   915
  naming of the context.
20476
6d3f144cc1bd more on names;
wenzelm
parents: 20475
diff changeset
   916
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   917
  \<^descr> @{ML Name_Space.intern}~\<open>space name\<close> internalizes a (partially qualified)
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   918
  external name.
20437
wenzelm
parents: 20430
diff changeset
   919
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   920
  This operation is mostly for parsing! Note that fully qualified names
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   921
  stemming from declarations are produced via @{ML "Name_Space.full_name"} and
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   922
  @{ML "Name_Space.declare"} (or their derivatives for @{ML_type theory} and
20488
wenzelm
parents: 20479
diff changeset
   923
  @{ML_type Proof.context}).
20437
wenzelm
parents: 20430
diff changeset
   924
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   925
  \<^descr> @{ML Name_Space.extern}~\<open>ctxt space name\<close> externalizes a (fully qualified)
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   926
  internal name.
20476
6d3f144cc1bd more on names;
wenzelm
parents: 20475
diff changeset
   927
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   928
  This operation is mostly for printing! User code should not rely on the
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   929
  precise result too much.
20476
6d3f144cc1bd more on names;
wenzelm
parents: 20475
diff changeset
   930
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   931
  \<^descr> @{ML Name_Space.is_concealed}~\<open>space name\<close> indicates whether \<open>name\<close> refers
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   932
  to a strictly private entity that other tools are supposed to ignore!
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   933
\<close>
30272
2d612824e642 regenerated document;
wenzelm
parents: 30270
diff changeset
   934
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   935
text %mlantiq \<open>
39832
1080dee73a53 various concrete ML antiquotations;
wenzelm
parents: 39825
diff changeset
   936
  \begin{matharray}{rcl}
61493
0debd22f0c0e isabelle update_cartouches -t;
wenzelm
parents: 61477
diff changeset
   937
  @{ML_antiquotation_def "binding"} & : & \<open>ML_antiquotation\<close> \\
39832
1080dee73a53 various concrete ML antiquotations;
wenzelm
parents: 39825
diff changeset
   938
  \end{matharray}
1080dee73a53 various concrete ML antiquotations;
wenzelm
parents: 39825
diff changeset
   939
55112
b1a5d603fd12 prefer rail cartouche -- avoid back-slashed quotes;
wenzelm
parents: 53015
diff changeset
   940
  @{rail \<open>
67146
909dcdec2122 more embedded cartouche arguments;
wenzelm
parents: 62969
diff changeset
   941
  @@{ML_antiquotation binding} embedded
55112
b1a5d603fd12 prefer rail cartouche -- avoid back-slashed quotes;
wenzelm
parents: 53015
diff changeset
   942
  \<close>}
39832
1080dee73a53 various concrete ML antiquotations;
wenzelm
parents: 39825
diff changeset
   943
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   944
  \<^descr> \<open>@{binding name}\<close> produces a binding with base name \<open>name\<close> and the source
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   945
  position taken from the concrete syntax of this antiquotation. In many
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   946
  situations this is more appropriate than the more basic @{ML Binding.name}
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   947
  function.
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   948
\<close>
39832
1080dee73a53 various concrete ML antiquotations;
wenzelm
parents: 39825
diff changeset
   949
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   950
text %mlex \<open>
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   951
  The following example yields the source position of some concrete binding
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   952
  inlined into the text:
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   953
\<close>
39833
6d54a48c859d more examples;
wenzelm
parents: 39832
diff changeset
   954
59902
6afbe5a99139 misc tuning -- keep name space more clean;
wenzelm
parents: 59859
diff changeset
   955
ML_val \<open>Binding.pos_of @{binding here}\<close>
39833
6d54a48c859d more examples;
wenzelm
parents: 39832
diff changeset
   956
61416
b9a3324e4e62 more symbols;
wenzelm
parents: 61046
diff changeset
   957
text \<open>
b9a3324e4e62 more symbols;
wenzelm
parents: 61046
diff changeset
   958
  \<^medskip>
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   959
  That position can be also printed in a message as follows:
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   960
\<close>
39833
6d54a48c859d more examples;
wenzelm
parents: 39832
diff changeset
   961
58742
bb55a3530709 tuned spacing;
wenzelm
parents: 58723
diff changeset
   962
ML_command
bb55a3530709 tuned spacing;
wenzelm
parents: 58723
diff changeset
   963
  \<open>writeln
bb55a3530709 tuned spacing;
wenzelm
parents: 58723
diff changeset
   964
    ("Look here" ^ Position.here (Binding.pos_of @{binding here}))\<close>
39833
6d54a48c859d more examples;
wenzelm
parents: 39832
diff changeset
   965
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   966
text \<open>
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   967
  This illustrates a key virtue of formalized bindings as opposed to raw
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   968
  specifications of base names: the system can use this additional information
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   969
  for feedback given to the user (error messages etc.).
56071
2ffdedb0c044 added ML antiquotation @{here};
wenzelm
parents: 55837
diff changeset
   970
61416
b9a3324e4e62 more symbols;
wenzelm
parents: 61046
diff changeset
   971
  \<^medskip>
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   972
  The following example refers to its source position directly, which is
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   973
  occasionally useful for experimentation and diagnostic purposes:
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   974
\<close>
56071
2ffdedb0c044 added ML antiquotation @{here};
wenzelm
parents: 55837
diff changeset
   975
58742
bb55a3530709 tuned spacing;
wenzelm
parents: 58723
diff changeset
   976
ML_command \<open>warning ("Look here" ^ Position.here @{here})\<close>
39833
6d54a48c859d more examples;
wenzelm
parents: 39832
diff changeset
   977
18537
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   978
end