doc-src/IsarImplementation/Thy/document/Proof.tex
author haftmann
Wed, 06 Oct 2010 13:48:12 +0200
changeset 39929 a62e01e9b22c
parent 35001 31f8d9eaceff
child 39885 6a3f7941c3a0
permissions -rw-r--r--
tuned header
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
30296
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
     1
%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
     2
\begin{isabellebody}%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
     3
\def\isabellecontext{Proof}%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
     4
%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
     5
\isadelimtheory
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
     6
%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
     7
\endisadelimtheory
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
     8
%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
     9
\isatagtheory
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    10
\isacommand{theory}\isamarkupfalse%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    11
\ Proof\isanewline
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    12
\isakeyword{imports}\ Base\isanewline
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    13
\isakeyword{begin}%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    14
\endisatagtheory
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    15
{\isafoldtheory}%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    16
%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    17
\isadelimtheory
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    18
%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    19
\endisadelimtheory
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    20
%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    21
\isamarkupchapter{Structured proofs%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    22
}
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    23
\isamarkuptrue%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    24
%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    25
\isamarkupsection{Variables \label{sec:variables}%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    26
}
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    27
\isamarkuptrue%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    28
%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    29
\begin{isamarkuptext}%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    30
Any variable that is not explicitly bound by \isa{{\isasymlambda}}-abstraction
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    31
  is considered as ``free''.  Logically, free variables act like
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    32
  outermost universal quantification at the sequent level: \isa{A\isactrlisub {\isadigit{1}}{\isacharparenleft}x{\isacharparenright}{\isacharcomma}\ {\isasymdots}{\isacharcomma}\ A\isactrlisub n{\isacharparenleft}x{\isacharparenright}\ {\isasymturnstile}\ B{\isacharparenleft}x{\isacharparenright}} means that the result
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    33
  holds \emph{for all} values of \isa{x}.  Free variables for
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    34
  terms (not types) can be fully internalized into the logic: \isa{{\isasymturnstile}\ B{\isacharparenleft}x{\isacharparenright}} and \isa{{\isasymturnstile}\ {\isasymAnd}x{\isachardot}\ B{\isacharparenleft}x{\isacharparenright}} are interchangeable, provided
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    35
  that \isa{x} does not occur elsewhere in the context.
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    36
  Inspecting \isa{{\isasymturnstile}\ {\isasymAnd}x{\isachardot}\ B{\isacharparenleft}x{\isacharparenright}} more closely, we see that inside the
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    37
  quantifier, \isa{x} is essentially ``arbitrary, but fixed'',
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    38
  while from outside it appears as a place-holder for instantiation
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    39
  (thanks to \isa{{\isasymAnd}} elimination).
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    40
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    41
  The Pure logic represents the idea of variables being either inside
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    42
  or outside the current scope by providing separate syntactic
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    43
  categories for \emph{fixed variables} (e.g.\ \isa{x}) vs.\
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    44
  \emph{schematic variables} (e.g.\ \isa{{\isacharquery}x}).  Incidently, a
35001
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
    45
  universal result \isa{{\isasymturnstile}\ {\isasymAnd}x{\isachardot}\ B{\isacharparenleft}x{\isacharparenright}} has the HHF normal form \isa{{\isasymturnstile}\ B{\isacharparenleft}{\isacharquery}x{\isacharparenright}}, which represents its generality without requiring an
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
    46
  explicit quantifier.  The same principle works for type variables:
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
    47
  \isa{{\isasymturnstile}\ B{\isacharparenleft}{\isacharquery}{\isasymalpha}{\isacharparenright}} represents the idea of ``\isa{{\isasymturnstile}\ {\isasymforall}{\isasymalpha}{\isachardot}\ B{\isacharparenleft}{\isasymalpha}{\isacharparenright}}''
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
    48
  without demanding a truly polymorphic framework.
30296
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    49
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    50
  \medskip Additional care is required to treat type variables in a
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    51
  way that facilitates type-inference.  In principle, term variables
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    52
  depend on type variables, which means that type variables would have
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    53
  to be declared first.  For example, a raw type-theoretic framework
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    54
  would demand the context to be constructed in stages as follows:
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    55
  \isa{{\isasymGamma}\ {\isacharequal}\ {\isasymalpha}{\isacharcolon}\ type{\isacharcomma}\ x{\isacharcolon}\ {\isasymalpha}{\isacharcomma}\ a{\isacharcolon}\ A{\isacharparenleft}x\isactrlisub {\isasymalpha}{\isacharparenright}}.
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    56
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    57
  We allow a slightly less formalistic mode of operation: term
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    58
  variables \isa{x} are fixed without specifying a type yet
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    59
  (essentially \emph{all} potential occurrences of some instance
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    60
  \isa{x\isactrlisub {\isasymtau}} are fixed); the first occurrence of \isa{x}
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    61
  within a specific term assigns its most general type, which is then
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    62
  maintained consistently in the context.  The above example becomes
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    63
  \isa{{\isasymGamma}\ {\isacharequal}\ x{\isacharcolon}\ term{\isacharcomma}\ {\isasymalpha}{\isacharcolon}\ type{\isacharcomma}\ A{\isacharparenleft}x\isactrlisub {\isasymalpha}{\isacharparenright}}, where type \isa{{\isasymalpha}} is fixed \emph{after} term \isa{x}, and the constraint
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    64
  \isa{x\ {\isacharcolon}{\isacharcolon}\ {\isasymalpha}} is an implicit consequence of the occurrence of
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    65
  \isa{x\isactrlisub {\isasymalpha}} in the subsequent proposition.
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    66
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    67
  This twist of dependencies is also accommodated by the reverse
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    68
  operation of exporting results from a context: a type variable
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    69
  \isa{{\isasymalpha}} is considered fixed as long as it occurs in some fixed
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    70
  term variable of the context.  For example, exporting \isa{x{\isacharcolon}\ term{\isacharcomma}\ {\isasymalpha}{\isacharcolon}\ type\ {\isasymturnstile}\ x\isactrlisub {\isasymalpha}\ {\isacharequal}\ x\isactrlisub {\isasymalpha}} produces in the first step
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    71
  \isa{x{\isacharcolon}\ term\ {\isasymturnstile}\ x\isactrlisub {\isasymalpha}\ {\isacharequal}\ x\isactrlisub {\isasymalpha}} for fixed \isa{{\isasymalpha}},
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    72
  and only in the second step \isa{{\isasymturnstile}\ {\isacharquery}x\isactrlisub {\isacharquery}\isactrlisub {\isasymalpha}\ {\isacharequal}\ {\isacharquery}x\isactrlisub {\isacharquery}\isactrlisub {\isasymalpha}} for schematic \isa{{\isacharquery}x} and \isa{{\isacharquery}{\isasymalpha}}.
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    73
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    74
  \medskip The Isabelle/Isar proof context manages the gory details of
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    75
  term vs.\ type variables, with high-level principles for moving the
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    76
  frontier between fixed and schematic variables.
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    77
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    78
  The \isa{add{\isacharunderscore}fixes} operation explictly declares fixed
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    79
  variables; the \isa{declare{\isacharunderscore}term} operation absorbs a term into
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    80
  a context by fixing new type variables and adding syntactic
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    81
  constraints.
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    82
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    83
  The \isa{export} operation is able to perform the main work of
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    84
  generalizing term and type variables as sketched above, assuming
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    85
  that fixing variables and terms have been declared properly.
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    86
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    87
  There \isa{import} operation makes a generalized fact a genuine
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    88
  part of the context, by inventing fixed variables for the schematic
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    89
  ones.  The effect can be reversed by using \isa{export} later,
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    90
  potentially with an extended context; the result is equivalent to
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    91
  the original modulo renaming of schematic variables.
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    92
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    93
  The \isa{focus} operation provides a variant of \isa{import}
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    94
  for nested propositions (with explicit quantification): \isa{{\isasymAnd}x\isactrlisub {\isadigit{1}}\ {\isasymdots}\ x\isactrlisub n{\isachardot}\ B{\isacharparenleft}x\isactrlisub {\isadigit{1}}{\isacharcomma}\ {\isasymdots}{\isacharcomma}\ x\isactrlisub n{\isacharparenright}} is
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    95
  decomposed by inventing fixed variables \isa{x\isactrlisub {\isadigit{1}}{\isacharcomma}\ {\isasymdots}{\isacharcomma}\ x\isactrlisub n} for the body.%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    96
\end{isamarkuptext}%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    97
\isamarkuptrue%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    98
%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
    99
\isadelimmlref
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   100
%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   101
\endisadelimmlref
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   102
%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   103
\isatagmlref
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   104
%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   105
\begin{isamarkuptext}%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   106
\begin{mldecls}
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   107
  \indexdef{}{ML}{Variable.add\_fixes}\verb|Variable.add_fixes: |\isasep\isanewline%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   108
\verb|  string list -> Proof.context -> string list * Proof.context| \\
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   109
  \indexdef{}{ML}{Variable.variant\_fixes}\verb|Variable.variant_fixes: |\isasep\isanewline%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   110
\verb|  string list -> Proof.context -> string list * Proof.context| \\
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   111
  \indexdef{}{ML}{Variable.declare\_term}\verb|Variable.declare_term: term -> Proof.context -> Proof.context| \\
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   112
  \indexdef{}{ML}{Variable.declare\_constraints}\verb|Variable.declare_constraints: term -> Proof.context -> Proof.context| \\
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   113
  \indexdef{}{ML}{Variable.export}\verb|Variable.export: Proof.context -> Proof.context -> thm list -> thm list| \\
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   114
  \indexdef{}{ML}{Variable.polymorphic}\verb|Variable.polymorphic: Proof.context -> term list -> term list| \\
31794
71af1fd6a5e4 renamed Variable.import_thms to Variable.import (back again cf. ed7aa5a350ef -- Alice is no longer supported);
wenzelm
parents: 30296
diff changeset
   115
  \indexdef{}{ML}{Variable.import}\verb|Variable.import: bool -> thm list -> Proof.context ->|\isasep\isanewline%
32302
aa48c2b8f8e0 updated Variable.import;
wenzelm
parents: 32201
diff changeset
   116
\verb|  (((ctyp * ctyp) list * (cterm * cterm) list) * thm list) * Proof.context| \\
35001
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   117
  \indexdef{}{ML}{Variable.focus}\verb|Variable.focus: cterm -> Proof.context ->|\isasep\isanewline%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   118
\verb|  ((string * cterm) list * cterm) * Proof.context| \\
30296
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   119
  \end{mldecls}
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   120
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   121
  \begin{description}
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   122
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   123
  \item \verb|Variable.add_fixes|~\isa{xs\ ctxt} fixes term
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   124
  variables \isa{xs}, returning the resulting internal names.  By
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   125
  default, the internal representation coincides with the external
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   126
  one, which also means that the given variables must not be fixed
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   127
  already.  There is a different policy within a local proof body: the
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   128
  given names are just hints for newly invented Skolem variables.
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   129
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   130
  \item \verb|Variable.variant_fixes| is similar to \verb|Variable.add_fixes|, but always produces fresh variants of the given
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   131
  names.
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   132
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   133
  \item \verb|Variable.declare_term|~\isa{t\ ctxt} declares term
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   134
  \isa{t} to belong to the context.  This automatically fixes new
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   135
  type variables, but not term variables.  Syntactic constraints for
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   136
  type and term variables are declared uniformly, though.
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   137
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   138
  \item \verb|Variable.declare_constraints|~\isa{t\ ctxt} declares
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   139
  syntactic constraints from term \isa{t}, without making it part
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   140
  of the context yet.
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   141
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   142
  \item \verb|Variable.export|~\isa{inner\ outer\ thms} generalizes
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   143
  fixed type and term variables in \isa{thms} according to the
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   144
  difference of the \isa{inner} and \isa{outer} context,
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   145
  following the principles sketched above.
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   146
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   147
  \item \verb|Variable.polymorphic|~\isa{ctxt\ ts} generalizes type
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   148
  variables in \isa{ts} as far as possible, even those occurring
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   149
  in fixed term variables.  The default policy of type-inference is to
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   150
  fix newly introduced type variables, which is essentially reversed
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   151
  with \verb|Variable.polymorphic|: here the given terms are detached
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   152
  from the context as far as possible.
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   153
31794
71af1fd6a5e4 renamed Variable.import_thms to Variable.import (back again cf. ed7aa5a350ef -- Alice is no longer supported);
wenzelm
parents: 30296
diff changeset
   154
  \item \verb|Variable.import|~\isa{open\ thms\ ctxt} invents fixed
30296
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   155
  type and term variables for the schematic ones occurring in \isa{thms}.  The \isa{open} flag indicates whether the fixed names
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   156
  should be accessible to the user, otherwise newly introduced names
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   157
  are marked as ``internal'' (\secref{sec:names}).
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   158
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   159
  \item \verb|Variable.focus|~\isa{B} decomposes the outermost \isa{{\isasymAnd}} prefix of proposition \isa{B}.
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   160
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   161
  \end{description}%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   162
\end{isamarkuptext}%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   163
\isamarkuptrue%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   164
%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   165
\endisatagmlref
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   166
{\isafoldmlref}%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   167
%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   168
\isadelimmlref
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   169
%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   170
\endisadelimmlref
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   171
%
35001
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   172
\isadelimmlex
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   173
%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   174
\endisadelimmlex
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   175
%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   176
\isatagmlex
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   177
%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   178
\begin{isamarkuptext}%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   179
The following example (in theory \hyperlink{theory.Pure}{\mbox{\isa{Pure}}}) shows
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   180
  how to work with fixed term and type parameters work with
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   181
  type-inference.%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   182
\end{isamarkuptext}%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   183
\isamarkuptrue%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   184
%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   185
\endisatagmlex
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   186
{\isafoldmlex}%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   187
%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   188
\isadelimmlex
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   189
%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   190
\endisadelimmlex
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   191
\isacommand{typedecl}\isamarkupfalse%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   192
\ foo\ \ %
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   193
\isamarkupcmt{some basic type for testing purposes%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   194
}
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   195
\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   196
%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   197
\isadelimML
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   198
\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   199
%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   200
\endisadelimML
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   201
%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   202
\isatagML
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   203
\isacommand{ML}\isamarkupfalse%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   204
\ {\isacharverbatimopen}\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   205
\ \ {\isacharparenleft}{\isacharasterisk}static\ compile{\isacharminus}time\ context\ {\isacharminus}{\isacharminus}\ for\ testing\ only{\isacharasterisk}{\isacharparenright}\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   206
\ \ val\ ctxt{\isadigit{0}}\ {\isacharequal}\ %
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   207
\isaantiq
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   208
context%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   209
\endisaantiq
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   210
{\isacharsemicolon}\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   211
\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   212
\ \ {\isacharparenleft}{\isacharasterisk}locally\ fixed\ parameters\ {\isacharminus}{\isacharminus}\ no\ type\ assignment\ yet{\isacharasterisk}{\isacharparenright}\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   213
\ \ val\ {\isacharparenleft}{\isacharbrackleft}x{\isacharcomma}\ y{\isacharbrackright}{\isacharcomma}\ ctxt{\isadigit{1}}{\isacharparenright}\ {\isacharequal}\ ctxt{\isadigit{0}}\ {\isacharbar}{\isachargreater}\ Variable{\isachardot}add{\isacharunderscore}fixes\ {\isacharbrackleft}{\isachardoublequote}x{\isachardoublequote}{\isacharcomma}\ {\isachardoublequote}y{\isachardoublequote}{\isacharbrackright}{\isacharsemicolon}\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   214
\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   215
\ \ {\isacharparenleft}{\isacharasterisk}t{\isadigit{1}}{\isacharcolon}\ most\ general\ fixed\ type{\isacharsemicolon}\ t{\isadigit{1}}{\isacharprime}{\isacharcolon}\ most\ general\ arbitrary\ type{\isacharasterisk}{\isacharparenright}\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   216
\ \ val\ t{\isadigit{1}}\ {\isacharequal}\ Syntax{\isachardot}read{\isacharunderscore}term\ ctxt{\isadigit{1}}\ {\isachardoublequote}x{\isachardoublequote}{\isacharsemicolon}\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   217
\ \ val\ t{\isadigit{1}}{\isacharprime}\ {\isacharequal}\ singleton\ {\isacharparenleft}Variable{\isachardot}polymorphic\ ctxt{\isadigit{1}}{\isacharparenright}\ t{\isadigit{1}}{\isacharsemicolon}\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   218
\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   219
\ \ {\isacharparenleft}{\isacharasterisk}term\ u\ enforces\ specific\ type\ assignment{\isacharasterisk}{\isacharparenright}\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   220
\ \ val\ u\ {\isacharequal}\ Syntax{\isachardot}read{\isacharunderscore}term\ ctxt{\isadigit{1}}\ {\isachardoublequote}{\isacharparenleft}x{\isacharcolon}{\isacharcolon}foo{\isacharparenright}\ {\isasymequiv}\ y{\isachardoublequote}{\isacharsemicolon}\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   221
\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   222
\ \ {\isacharparenleft}{\isacharasterisk}official\ declaration\ of\ u\ {\isacharminus}{\isacharminus}\ propagates\ constraints\ etc{\isachardot}{\isacharasterisk}{\isacharparenright}\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   223
\ \ val\ ctxt{\isadigit{2}}\ {\isacharequal}\ ctxt{\isadigit{1}}\ {\isacharbar}{\isachargreater}\ Variable{\isachardot}declare{\isacharunderscore}term\ u{\isacharsemicolon}\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   224
\ \ val\ t{\isadigit{2}}\ {\isacharequal}\ Syntax{\isachardot}read{\isacharunderscore}term\ ctxt{\isadigit{2}}\ {\isachardoublequote}x{\isachardoublequote}{\isacharsemicolon}\ \ {\isacharparenleft}{\isacharasterisk}x{\isacharcolon}{\isacharcolon}foo\ is\ enforced{\isacharasterisk}{\isacharparenright}\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   225
{\isacharverbatimclose}%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   226
\endisatagML
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   227
{\isafoldML}%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   228
%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   229
\isadelimML
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   230
%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   231
\endisadelimML
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   232
%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   233
\begin{isamarkuptext}%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   234
In the above example, the starting context had been derived
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   235
  from the toplevel theory, which means that fixed variables are
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   236
  internalized literally: \verb|x| is mapped again to
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   237
  \verb|x|, and attempting to fix it again in the subsequent
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   238
  context is an error.  Alternatively, fixed parameters can be renamed
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   239
  explicitly as follows:%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   240
\end{isamarkuptext}%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   241
\isamarkuptrue%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   242
%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   243
\isadelimML
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   244
%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   245
\endisadelimML
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   246
%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   247
\isatagML
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   248
\isacommand{ML}\isamarkupfalse%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   249
\ {\isacharverbatimopen}\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   250
\ \ val\ ctxt{\isadigit{0}}\ {\isacharequal}\ %
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   251
\isaantiq
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   252
context%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   253
\endisaantiq
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   254
{\isacharsemicolon}\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   255
\ \ val\ {\isacharparenleft}{\isacharbrackleft}x{\isadigit{1}}{\isacharcomma}\ x{\isadigit{2}}{\isacharcomma}\ x{\isadigit{3}}{\isacharbrackright}{\isacharcomma}\ ctxt{\isadigit{1}}{\isacharparenright}\ {\isacharequal}\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   256
\ \ \ \ ctxt{\isadigit{0}}\ {\isacharbar}{\isachargreater}\ Variable{\isachardot}variant{\isacharunderscore}fixes\ {\isacharbrackleft}{\isachardoublequote}x{\isachardoublequote}{\isacharcomma}\ {\isachardoublequote}x{\isachardoublequote}{\isacharcomma}\ {\isachardoublequote}x{\isachardoublequote}{\isacharbrackright}{\isacharsemicolon}\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   257
{\isacharverbatimclose}%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   258
\endisatagML
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   259
{\isafoldML}%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   260
%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   261
\isadelimML
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   262
%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   263
\endisadelimML
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   264
%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   265
\begin{isamarkuptext}%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   266
\noindent Subsequent ML code can now work with the invented
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   267
  names of \verb|x1|, \verb|x2|, \verb|x3|, without
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   268
  depending on the details on the system policy for introducing these
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   269
  variants.  Recall that within a proof body the system always invents
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   270
  fresh ``skolem constants'', e.g.\ as follows:%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   271
\end{isamarkuptext}%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   272
\isamarkuptrue%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   273
\isacommand{lemma}\isamarkupfalse%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   274
\ {\isachardoublequoteopen}PROP\ XXX{\isachardoublequoteclose}\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   275
%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   276
\isadelimproof
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   277
%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   278
\endisadelimproof
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   279
%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   280
\isatagproof
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   281
\isacommand{proof}\isamarkupfalse%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   282
\ {\isacharminus}%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   283
\endisatagproof
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   284
{\isafoldproof}%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   285
%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   286
\isadelimproof
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   287
\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   288
%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   289
\endisadelimproof
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   290
%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   291
\isadelimML
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   292
\ \ %
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   293
\endisadelimML
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   294
%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   295
\isatagML
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   296
\isacommand{ML{\isacharunderscore}prf}\isamarkupfalse%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   297
\ {\isacharverbatimopen}\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   298
\ \ \ \ val\ ctxt{\isadigit{0}}\ {\isacharequal}\ %
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   299
\isaantiq
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   300
context%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   301
\endisaantiq
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   302
{\isacharsemicolon}\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   303
\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   304
\ \ \ \ val\ {\isacharparenleft}{\isacharbrackleft}x{\isadigit{1}}{\isacharbrackright}{\isacharcomma}\ ctxt{\isadigit{1}}{\isacharparenright}\ {\isacharequal}\ ctxt{\isadigit{0}}\ {\isacharbar}{\isachargreater}\ Variable{\isachardot}add{\isacharunderscore}fixes\ {\isacharbrackleft}{\isachardoublequote}x{\isachardoublequote}{\isacharbrackright}{\isacharsemicolon}\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   305
\ \ \ \ val\ {\isacharparenleft}{\isacharbrackleft}x{\isadigit{2}}{\isacharbrackright}{\isacharcomma}\ ctxt{\isadigit{2}}{\isacharparenright}\ {\isacharequal}\ ctxt{\isadigit{1}}\ {\isacharbar}{\isachargreater}\ Variable{\isachardot}add{\isacharunderscore}fixes\ {\isacharbrackleft}{\isachardoublequote}x{\isachardoublequote}{\isacharbrackright}{\isacharsemicolon}\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   306
\ \ \ \ val\ {\isacharparenleft}{\isacharbrackleft}x{\isadigit{3}}{\isacharbrackright}{\isacharcomma}\ ctxt{\isadigit{3}}{\isacharparenright}\ {\isacharequal}\ ctxt{\isadigit{2}}\ {\isacharbar}{\isachargreater}\ Variable{\isachardot}add{\isacharunderscore}fixes\ {\isacharbrackleft}{\isachardoublequote}x{\isachardoublequote}{\isacharbrackright}{\isacharsemicolon}\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   307
\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   308
\ \ \ \ val\ {\isacharparenleft}{\isacharbrackleft}y{\isadigit{1}}{\isacharcomma}\ y{\isadigit{2}}{\isacharbrackright}{\isacharcomma}\ ctxt{\isadigit{4}}{\isacharparenright}\ {\isacharequal}\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   309
\ \ \ \ \ \ ctxt{\isadigit{3}}\ {\isacharbar}{\isachargreater}\ Variable{\isachardot}variant{\isacharunderscore}fixes\ {\isacharbrackleft}{\isachardoublequote}y{\isachardoublequote}{\isacharcomma}\ {\isachardoublequote}y{\isachardoublequote}{\isacharbrackright}{\isacharsemicolon}\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   310
\ \ {\isacharverbatimclose}\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   311
\ \ \isacommand{oops}\isamarkupfalse%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   312
%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   313
\endisatagML
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   314
{\isafoldML}%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   315
%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   316
\isadelimML
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   317
%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   318
\endisadelimML
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   319
%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   320
\begin{isamarkuptext}%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   321
\noindent In this situation \verb|Variable.add_fixes| and \verb|Variable.variant_fixes| are very similar, but identical name
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   322
  proposals given in a row are only accepted by the second version.%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   323
\end{isamarkuptext}%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   324
\isamarkuptrue%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   325
%
30296
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   326
\isamarkupsection{Assumptions \label{sec:assumptions}%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   327
}
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   328
\isamarkuptrue%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   329
%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   330
\begin{isamarkuptext}%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   331
An \emph{assumption} is a proposition that it is postulated in the
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   332
  current context.  Local conclusions may use assumptions as
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   333
  additional facts, but this imposes implicit hypotheses that weaken
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   334
  the overall statement.
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   335
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   336
  Assumptions are restricted to fixed non-schematic statements, i.e.\
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   337
  all generality needs to be expressed by explicit quantifiers.
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   338
  Nevertheless, the result will be in HHF normal form with outermost
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   339
  quantifiers stripped.  For example, by assuming \isa{{\isasymAnd}x\ {\isacharcolon}{\isacharcolon}\ {\isasymalpha}{\isachardot}\ P\ x} we get \isa{{\isasymAnd}x\ {\isacharcolon}{\isacharcolon}\ {\isasymalpha}{\isachardot}\ P\ x\ {\isasymturnstile}\ P\ {\isacharquery}x} for schematic \isa{{\isacharquery}x}
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   340
  of fixed type \isa{{\isasymalpha}}.  Local derivations accumulate more and
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   341
  more explicit references to hypotheses: \isa{A\isactrlisub {\isadigit{1}}{\isacharcomma}\ {\isasymdots}{\isacharcomma}\ A\isactrlisub n\ {\isasymturnstile}\ B} where \isa{A\isactrlisub {\isadigit{1}}{\isacharcomma}\ {\isasymdots}{\isacharcomma}\ A\isactrlisub n} needs to
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   342
  be covered by the assumptions of the current context.
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   343
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   344
  \medskip The \isa{add{\isacharunderscore}assms} operation augments the context by
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   345
  local assumptions, which are parameterized by an arbitrary \isa{export} rule (see below).
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   346
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   347
  The \isa{export} operation moves facts from a (larger) inner
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   348
  context into a (smaller) outer context, by discharging the
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   349
  difference of the assumptions as specified by the associated export
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   350
  rules.  Note that the discharged portion is determined by the
35001
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   351
  difference of contexts, not the facts being exported!  There is a
30296
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   352
  separate flag to indicate a goal context, where the result is meant
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   353
  to refine an enclosing sub-goal of a structured proof state.
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   354
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   355
  \medskip The most basic export rule discharges assumptions directly
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   356
  by means of the \isa{{\isasymLongrightarrow}} introduction rule:
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   357
  \[
35001
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   358
  \infer[(\isa{{\isasymLongrightarrow}{\isasymdash}intro})]{\isa{{\isasymGamma}\ {\isacharminus}\ A\ {\isasymturnstile}\ A\ {\isasymLongrightarrow}\ B}}{\isa{{\isasymGamma}\ {\isasymturnstile}\ B}}
30296
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   359
  \]
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   360
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   361
  The variant for goal refinements marks the newly introduced
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   362
  premises, which causes the canonical Isar goal refinement scheme to
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   363
  enforce unification with local premises within the goal:
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   364
  \[
35001
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   365
  \infer[(\isa{{\isacharhash}{\isasymLongrightarrow}{\isasymdash}intro})]{\isa{{\isasymGamma}\ {\isacharminus}\ A\ {\isasymturnstile}\ {\isacharhash}A\ {\isasymLongrightarrow}\ B}}{\isa{{\isasymGamma}\ {\isasymturnstile}\ B}}
30296
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   366
  \]
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   367
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   368
  \medskip Alternative versions of assumptions may perform arbitrary
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   369
  transformations on export, as long as the corresponding portion of
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   370
  hypotheses is removed from the given facts.  For example, a local
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   371
  definition works by fixing \isa{x} and assuming \isa{x\ {\isasymequiv}\ t},
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   372
  with the following export rule to reverse the effect:
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   373
  \[
35001
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   374
  \infer[(\isa{{\isasymequiv}{\isasymdash}expand})]{\isa{{\isasymGamma}\ {\isacharminus}\ {\isacharparenleft}x\ {\isasymequiv}\ t{\isacharparenright}\ {\isasymturnstile}\ B\ t}}{\isa{{\isasymGamma}\ {\isasymturnstile}\ B\ x}}
30296
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   375
  \]
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   376
  This works, because the assumption \isa{x\ {\isasymequiv}\ t} was introduced in
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   377
  a context with \isa{x} being fresh, so \isa{x} does not
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   378
  occur in \isa{{\isasymGamma}} here.%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   379
\end{isamarkuptext}%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   380
\isamarkuptrue%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   381
%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   382
\isadelimmlref
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   383
%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   384
\endisadelimmlref
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   385
%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   386
\isatagmlref
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   387
%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   388
\begin{isamarkuptext}%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   389
\begin{mldecls}
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   390
  \indexdef{}{ML type}{Assumption.export}\verb|type Assumption.export| \\
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   391
  \indexdef{}{ML}{Assumption.assume}\verb|Assumption.assume: cterm -> thm| \\
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   392
  \indexdef{}{ML}{Assumption.add\_assms}\verb|Assumption.add_assms: Assumption.export ->|\isasep\isanewline%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   393
\verb|  cterm list -> Proof.context -> thm list * Proof.context| \\
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   394
  \indexdef{}{ML}{Assumption.add\_assumes}\verb|Assumption.add_assumes: |\isasep\isanewline%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   395
\verb|  cterm list -> Proof.context -> thm list * Proof.context| \\
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   396
  \indexdef{}{ML}{Assumption.export}\verb|Assumption.export: bool -> Proof.context -> Proof.context -> thm -> thm| \\
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   397
  \end{mldecls}
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   398
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   399
  \begin{description}
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   400
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   401
  \item \verb|Assumption.export| represents arbitrary export
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   402
  rules, which is any function of type \verb|bool -> cterm list -> thm -> thm|,
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   403
  where the \verb|bool| indicates goal mode, and the \verb|cterm list| the collection of assumptions to be discharged
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   404
  simultaneously.
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   405
35001
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   406
  \item \verb|Assumption.assume|~\isa{A} turns proposition \isa{A} into a primitive assumption \isa{A\ {\isasymturnstile}\ A{\isacharprime}}, where the
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   407
  conclusion \isa{A{\isacharprime}} is in HHF normal form.
30296
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   408
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   409
  \item \verb|Assumption.add_assms|~\isa{r\ As} augments the context
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   410
  by assumptions \isa{As} with export rule \isa{r}.  The
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   411
  resulting facts are hypothetical theorems as produced by the raw
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   412
  \verb|Assumption.assume|.
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   413
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   414
  \item \verb|Assumption.add_assumes|~\isa{As} is a special case of
35001
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   415
  \verb|Assumption.add_assms| where the export rule performs \isa{{\isasymLongrightarrow}{\isasymdash}intro} or \isa{{\isacharhash}{\isasymLongrightarrow}{\isasymdash}intro}, depending on goal
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   416
  mode.
30296
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   417
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   418
  \item \verb|Assumption.export|~\isa{is{\isacharunderscore}goal\ inner\ outer\ thm}
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   419
  exports result \isa{thm} from the the \isa{inner} context
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   420
  back into the \isa{outer} one; \isa{is{\isacharunderscore}goal\ {\isacharequal}\ true} means
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   421
  this is a goal context.  The result is in HHF normal form.  Note
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   422
  that \verb|ProofContext.export| combines \verb|Variable.export|
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   423
  and \verb|Assumption.export| in the canonical way.
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   424
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   425
  \end{description}%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   426
\end{isamarkuptext}%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   427
\isamarkuptrue%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   428
%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   429
\endisatagmlref
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   430
{\isafoldmlref}%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   431
%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   432
\isadelimmlref
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   433
%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   434
\endisadelimmlref
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   435
%
35001
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   436
\isadelimmlex
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   437
%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   438
\endisadelimmlex
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   439
%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   440
\isatagmlex
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   441
%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   442
\begin{isamarkuptext}%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   443
The following example demonstrates how rules can be
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   444
  derived by building up a context of assumptions first, and exporting
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   445
  some local fact afterwards.  We refer to \hyperlink{theory.Pure}{\mbox{\isa{Pure}}} equality
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   446
  here for testing purposes.%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   447
\end{isamarkuptext}%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   448
\isamarkuptrue%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   449
%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   450
\endisatagmlex
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   451
{\isafoldmlex}%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   452
%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   453
\isadelimmlex
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   454
%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   455
\endisadelimmlex
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   456
%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   457
\isadelimML
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   458
%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   459
\endisadelimML
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   460
%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   461
\isatagML
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   462
\isacommand{ML}\isamarkupfalse%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   463
\ {\isacharverbatimopen}\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   464
\ \ {\isacharparenleft}{\isacharasterisk}static\ compile{\isacharminus}time\ context\ {\isacharminus}{\isacharminus}\ for\ testing\ only{\isacharasterisk}{\isacharparenright}\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   465
\ \ val\ ctxt{\isadigit{0}}\ {\isacharequal}\ %
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   466
\isaantiq
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   467
context%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   468
\endisaantiq
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   469
{\isacharsemicolon}\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   470
\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   471
\ \ val\ {\isacharparenleft}{\isacharbrackleft}eq{\isacharbrackright}{\isacharcomma}\ ctxt{\isadigit{1}}{\isacharparenright}\ {\isacharequal}\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   472
\ \ \ \ ctxt{\isadigit{0}}\ {\isacharbar}{\isachargreater}\ Assumption{\isachardot}add{\isacharunderscore}assumes\ {\isacharbrackleft}%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   473
\isaantiq
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   474
cprop\ {\isachardoublequote}x\ {\isasymequiv}\ y{\isachardoublequote}%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   475
\endisaantiq
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   476
{\isacharbrackright}{\isacharsemicolon}\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   477
\ \ val\ eq{\isacharprime}\ {\isacharequal}\ Thm{\isachardot}symmetric\ eq{\isacharsemicolon}\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   478
\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   479
\ \ {\isacharparenleft}{\isacharasterisk}back\ to\ original\ context\ {\isacharminus}{\isacharminus}\ discharges\ assumption{\isacharasterisk}{\isacharparenright}\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   480
\ \ val\ r\ {\isacharequal}\ Assumption{\isachardot}export\ false\ ctxt{\isadigit{1}}\ ctxt{\isadigit{0}}\ eq{\isacharprime}{\isacharsemicolon}\isanewline
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   481
{\isacharverbatimclose}%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   482
\endisatagML
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   483
{\isafoldML}%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   484
%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   485
\isadelimML
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   486
%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   487
\endisadelimML
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   488
%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   489
\begin{isamarkuptext}%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   490
\noindent Note that the variables of the resulting rule are
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   491
  not generalized.  This would have required to fix them properly in
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   492
  the context beforehand, and export wrt.\ variables afterwards (cf.\
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   493
  \verb|Variable.export| or the combined \verb|ProofContext.export|).%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   494
\end{isamarkuptext}%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   495
\isamarkuptrue%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   496
%
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   497
\isamarkupsection{Structured goals and results \label{sec:struct-goals}%
30296
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   498
}
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   499
\isamarkuptrue%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   500
%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   501
\begin{isamarkuptext}%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   502
Local results are established by monotonic reasoning from facts
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   503
  within a context.  This allows common combinations of theorems,
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   504
  e.g.\ via \isa{{\isasymAnd}{\isacharslash}{\isasymLongrightarrow}} elimination, resolution rules, or equational
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   505
  reasoning, see \secref{sec:thms}.  Unaccounted context manipulations
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   506
  should be avoided, notably raw \isa{{\isasymAnd}{\isacharslash}{\isasymLongrightarrow}} introduction or ad-hoc
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   507
  references to free variables or assumptions not present in the proof
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   508
  context.
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   509
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   510
  \medskip The \isa{SUBPROOF} combinator allows to structure a
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   511
  tactical proof recursively by decomposing a selected sub-goal:
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   512
  \isa{{\isacharparenleft}{\isasymAnd}x{\isachardot}\ A{\isacharparenleft}x{\isacharparenright}\ {\isasymLongrightarrow}\ B{\isacharparenleft}x{\isacharparenright}{\isacharparenright}\ {\isasymLongrightarrow}\ {\isasymdots}} is turned into \isa{B{\isacharparenleft}x{\isacharparenright}\ {\isasymLongrightarrow}\ {\isasymdots}}
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   513
  after fixing \isa{x} and assuming \isa{A{\isacharparenleft}x{\isacharparenright}}.  This means
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   514
  the tactic needs to solve the conclusion, but may use the premise as
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   515
  a local fact, for locally fixed variables.
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   516
35001
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   517
  The family of \isa{FOCUS} combinators is similar to \isa{SUBPROOF}, but allows to retain schematic variables and pending
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   518
  subgoals in the resulting goal state.
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   519
30296
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   520
  The \isa{prove} operation provides an interface for structured
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   521
  backwards reasoning under program control, with some explicit sanity
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   522
  checks of the result.  The goal context can be augmented by
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   523
  additional fixed variables (cf.\ \secref{sec:variables}) and
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   524
  assumptions (cf.\ \secref{sec:assumptions}), which will be available
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   525
  as local facts during the proof and discharged into implications in
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   526
  the result.  Type and term variables are generalized as usual,
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   527
  according to the context.
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   528
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   529
  The \isa{obtain} operation produces results by eliminating
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   530
  existing facts by means of a given tactic.  This acts like a dual
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   531
  conclusion: the proof demonstrates that the context may be augmented
35001
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   532
  by parameters and assumptions, without affecting any conclusions
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   533
  that do not mention these parameters.  See also
30296
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   534
  \cite{isabelle-isar-ref} for the user-level \isa{{\isasymOBTAIN}} and
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   535
  \isa{{\isasymGUESS}} elements.  Final results, which may not refer to
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   536
  the parameters in the conclusion, need to exported explicitly into
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   537
  the original context.%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   538
\end{isamarkuptext}%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   539
\isamarkuptrue%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   540
%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   541
\isadelimmlref
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   542
%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   543
\endisadelimmlref
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   544
%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   545
\isatagmlref
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   546
%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   547
\begin{isamarkuptext}%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   548
\begin{mldecls}
32201
3689b647356d updated Variable.focus, SUBPROOF, Obtain.result, Goal.finish;
wenzelm
parents: 31794
diff changeset
   549
  \indexdef{}{ML}{SUBPROOF}\verb|SUBPROOF: (Subgoal.focus -> tactic) -> Proof.context -> int -> tactic| \\
35001
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   550
  \indexdef{}{ML}{Subgoal.FOCUS}\verb|Subgoal.FOCUS: (Subgoal.focus -> tactic) -> Proof.context -> int -> tactic| \\
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   551
  \indexdef{}{ML}{Subgoal.FOCUS\_PREMS}\verb|Subgoal.FOCUS_PREMS: (Subgoal.focus -> tactic) -> Proof.context -> int -> tactic| \\
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   552
  \indexdef{}{ML}{Subgoal.FOCUS\_PARAMS}\verb|Subgoal.FOCUS_PARAMS: (Subgoal.focus -> tactic) -> Proof.context -> int -> tactic| \\
30296
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   553
  \end{mldecls}
35001
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   554
30296
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   555
  \begin{mldecls}
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   556
  \indexdef{}{ML}{Goal.prove}\verb|Goal.prove: Proof.context -> string list -> term list -> term ->|\isasep\isanewline%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   557
\verb|  ({prems: thm list, context: Proof.context} -> tactic) -> thm| \\
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   558
  \indexdef{}{ML}{Goal.prove\_multi}\verb|Goal.prove_multi: Proof.context -> string list -> term list -> term list ->|\isasep\isanewline%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   559
\verb|  ({prems: thm list, context: Proof.context} -> tactic) -> thm list| \\
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   560
  \end{mldecls}
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   561
  \begin{mldecls}
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   562
  \indexdef{}{ML}{Obtain.result}\verb|Obtain.result: (Proof.context -> tactic) ->|\isasep\isanewline%
32201
3689b647356d updated Variable.focus, SUBPROOF, Obtain.result, Goal.finish;
wenzelm
parents: 31794
diff changeset
   563
\verb|  thm list -> Proof.context -> ((string * cterm) list * thm list) * Proof.context| \\
30296
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   564
  \end{mldecls}
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   565
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   566
  \begin{description}
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   567
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   568
  \item \verb|SUBPROOF|~\isa{tac\ ctxt\ i} decomposes the structure
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   569
  of the specified sub-goal, producing an extended context and a
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   570
  reduced goal, which needs to be solved by the given tactic.  All
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   571
  schematic parameters of the goal are imported into the context as
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   572
  fixed ones, which may not be instantiated in the sub-proof.
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   573
35001
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   574
  \item \verb|Subgoal.FOCUS|, \verb|Subgoal.FOCUS_PREMS|, and \verb|Subgoal.FOCUS_PARAMS| are similar to \verb|SUBPROOF|, but are
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   575
  slightly more flexible: only the specified parts of the subgoal are
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   576
  imported into the context, and the body tactic may introduce new
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   577
  subgoals and schematic variables.
31f8d9eaceff updated generated files;
wenzelm
parents: 32302
diff changeset
   578
30296
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   579
  \item \verb|Goal.prove|~\isa{ctxt\ xs\ As\ C\ tac} states goal \isa{C} in the context augmented by fixed variables \isa{xs} and
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   580
  assumptions \isa{As}, and applies tactic \isa{tac} to solve
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   581
  it.  The latter may depend on the local assumptions being presented
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   582
  as facts.  The result is in HHF normal form.
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   583
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   584
  \item \verb|Goal.prove_multi| is simular to \verb|Goal.prove|, but
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   585
  states several conclusions simultaneously.  The goal is encoded by
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   586
  means of Pure conjunction; \verb|Goal.conjunction_tac| will turn this
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   587
  into a collection of individual subgoals.
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   588
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   589
  \item \verb|Obtain.result|~\isa{tac\ thms\ ctxt} eliminates the
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   590
  given facts using a tactic, which results in additional fixed
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   591
  variables and assumptions in the context.  Final results need to be
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   592
  exported explicitly.
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   593
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   594
  \end{description}%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   595
\end{isamarkuptext}%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   596
\isamarkuptrue%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   597
%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   598
\endisatagmlref
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   599
{\isafoldmlref}%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   600
%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   601
\isadelimmlref
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   602
%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   603
\endisadelimmlref
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   604
%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   605
\isadelimtheory
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   606
%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   607
\endisadelimtheory
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   608
%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   609
\isatagtheory
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   610
\isacommand{end}\isamarkupfalse%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   611
%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   612
\endisatagtheory
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   613
{\isafoldtheory}%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   614
%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   615
\isadelimtheory
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   616
%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   617
\endisadelimtheory
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   618
\isanewline
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   619
\end{isabellebody}%
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   620
%%% Local Variables:
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   621
%%% mode: latex
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   622
%%% TeX-master: "root"
25eb9a499966 recovered generated files;
wenzelm
parents:
diff changeset
   623
%%% End: