src/Doc/Implementation/Proof.thy
author wenzelm
Wed, 16 Dec 2015 17:28:49 +0100
changeset 61854 38b049cd3aad
parent 61656 cfabbc083977
child 66663 49318345c332
permissions -rw-r--r--
tuned whitespace;
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: 28541
diff changeset
     3
theory Proof
d66b34e46bdf observe usual theory naming conventions;
wenzelm
parents: 28541
diff changeset
     4
imports Base
d66b34e46bdf observe usual theory naming conventions;
wenzelm
parents: 28541
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>Structured proofs\<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>Variables \label{sec:variables}\<close>
20026
3469df62fe21 Local variables;
wenzelm
parents: 18537
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
  Any variable that is not explicitly bound by \<open>\<lambda>\<close>-abstraction is considered
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    13
  as ``free''. Logically, free variables act like outermost universal
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    14
  quantification at the sequent level: \<open>A\<^sub>1(x), \<dots>, A\<^sub>n(x) \<turnstile> B(x)\<close> means that
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    15
  the result holds \<^emph>\<open>for all\<close> values of \<open>x\<close>. Free variables for terms (not
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    16
  types) can be fully internalized into the logic: \<open>\<turnstile> B(x)\<close> and \<open>\<turnstile> \<And>x. B(x)\<close>
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    17
  are interchangeable, provided that \<open>x\<close> does not occur elsewhere in the
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    18
  context. Inspecting \<open>\<turnstile> \<And>x. B(x)\<close> more closely, we see that inside the
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    19
  quantifier, \<open>x\<close> is essentially ``arbitrary, but fixed'', while from outside
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    20
  it appears as a place-holder for instantiation (thanks to \<open>\<And>\<close> elimination).
20470
c839b38a1f32 more on variables;
wenzelm
parents: 20460
diff changeset
    21
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    22
  The Pure logic represents the idea of variables being either inside or
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    23
  outside the current scope by providing separate syntactic categories for
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    24
  \<^emph>\<open>fixed variables\<close> (e.g.\ \<open>x\<close>) vs.\ \<^emph>\<open>schematic variables\<close> (e.g.\ \<open>?x\<close>).
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    25
  Incidently, a universal result \<open>\<turnstile> \<And>x. B(x)\<close> has the HHF normal form \<open>\<turnstile>
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    26
  B(?x)\<close>, which represents its generality without requiring an explicit
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    27
  quantifier. The same principle works for type variables: \<open>\<turnstile> B(?\<alpha>)\<close>
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    28
  represents the idea of ``\<open>\<turnstile> \<forall>\<alpha>. B(\<alpha>)\<close>'' without demanding a truly
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    29
  polymorphic framework.
20470
c839b38a1f32 more on variables;
wenzelm
parents: 20460
diff changeset
    30
61416
b9a3324e4e62 more symbols;
wenzelm
parents: 60754
diff changeset
    31
  \<^medskip>
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    32
  Additional care is required to treat type variables in a way that
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    33
  facilitates type-inference. In principle, term variables depend on type
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    34
  variables, which means that type variables would have to be declared first.
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    35
  For example, a raw type-theoretic framework would demand the context to be
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    36
  constructed in stages as follows: \<open>\<Gamma> = \<alpha>: type, x: \<alpha>, a: A(x\<^sub>\<alpha>)\<close>.
20470
c839b38a1f32 more on variables;
wenzelm
parents: 20460
diff changeset
    37
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    38
  We allow a slightly less formalistic mode of operation: term variables \<open>x\<close>
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    39
  are fixed without specifying a type yet (essentially \<^emph>\<open>all\<close> potential
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    40
  occurrences of some instance \<open>x\<^sub>\<tau>\<close> are fixed); the first occurrence of \<open>x\<close>
20474
wenzelm
parents: 20472
diff changeset
    41
  within a specific term assigns its most general type, which is then
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    42
  maintained consistently in the context. The above example becomes \<open>\<Gamma> = x:
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    43
  term, \<alpha>: type, A(x\<^sub>\<alpha>)\<close>, where type \<open>\<alpha>\<close> is fixed \<^emph>\<open>after\<close> term \<open>x\<close>, and the
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    44
  constraint \<open>x :: \<alpha>\<close> is an implicit consequence of the occurrence of \<open>x\<^sub>\<alpha>\<close> in
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    45
  the subsequent proposition.
20470
c839b38a1f32 more on variables;
wenzelm
parents: 20460
diff changeset
    46
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    47
  This twist of dependencies is also accommodated by the reverse operation of
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    48
  exporting results from a context: a type variable \<open>\<alpha>\<close> is considered fixed as
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    49
  long as it occurs in some fixed term variable of the context. For example,
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    50
  exporting \<open>x: term, \<alpha>: type \<turnstile> x\<^sub>\<alpha> \<equiv> x\<^sub>\<alpha>\<close> produces in the first step \<open>x: term
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    51
  \<turnstile> x\<^sub>\<alpha> \<equiv> x\<^sub>\<alpha>\<close> for fixed \<open>\<alpha>\<close>, and only in the second step \<open>\<turnstile> ?x\<^sub>?\<^sub>\<alpha> \<equiv> ?x\<^sub>?\<^sub>\<alpha>\<close>
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    52
  for schematic \<open>?x\<close> and \<open>?\<alpha>\<close>. The following Isar source text illustrates this
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    53
  scenario.
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
    54
\<close>
20470
c839b38a1f32 more on variables;
wenzelm
parents: 20460
diff changeset
    55
40964
482a8334ee9e prefer 'notepad' over 'example_proof';
wenzelm
parents: 40153
diff changeset
    56
notepad
482a8334ee9e prefer 'notepad' over 'example_proof';
wenzelm
parents: 40153
diff changeset
    57
begin
39841
c7f3efe59e4e more examples;
wenzelm
parents: 39821
diff changeset
    58
  {
61580
c49a8ebd30cc isabelle update_cartouches -c;
wenzelm
parents: 61493
diff changeset
    59
    fix x  \<comment> \<open>all potential occurrences of some \<open>x::\<tau>\<close> are fixed\<close>
39841
c7f3efe59e4e more examples;
wenzelm
parents: 39821
diff changeset
    60
    {
61580
c49a8ebd30cc isabelle update_cartouches -c;
wenzelm
parents: 61493
diff changeset
    61
      have "x::'a \<equiv> x"  \<comment> \<open>implicit type assignment by concrete occurrence\<close>
39841
c7f3efe59e4e more examples;
wenzelm
parents: 39821
diff changeset
    62
        by (rule reflexive)
c7f3efe59e4e more examples;
wenzelm
parents: 39821
diff changeset
    63
    }
61580
c49a8ebd30cc isabelle update_cartouches -c;
wenzelm
parents: 61493
diff changeset
    64
    thm this  \<comment> \<open>result still with fixed type \<open>'a\<close>\<close>
39841
c7f3efe59e4e more examples;
wenzelm
parents: 39821
diff changeset
    65
  }
61580
c49a8ebd30cc isabelle update_cartouches -c;
wenzelm
parents: 61493
diff changeset
    66
  thm this  \<comment> \<open>fully general result for arbitrary \<open>?x::?'a\<close>\<close>
40964
482a8334ee9e prefer 'notepad' over 'example_proof';
wenzelm
parents: 40153
diff changeset
    67
end
39841
c7f3efe59e4e more examples;
wenzelm
parents: 39821
diff changeset
    68
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    69
text \<open>
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    70
  The Isabelle/Isar proof context manages the details of term vs.\ type
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    71
  variables, with high-level principles for moving the frontier between fixed
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    72
  and schematic variables.
20474
wenzelm
parents: 20472
diff changeset
    73
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    74
  The \<open>add_fixes\<close> operation explicitly declares fixed variables; the
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    75
  \<open>declare_term\<close> operation absorbs a term into a context by fixing new type
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    76
  variables and adding syntactic constraints.
20470
c839b38a1f32 more on variables;
wenzelm
parents: 20460
diff changeset
    77
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    78
  The \<open>export\<close> operation is able to perform the main work of generalizing term
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    79
  and type variables as sketched above, assuming that fixing variables and
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    80
  terms have been declared properly.
20474
wenzelm
parents: 20472
diff changeset
    81
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    82
  There \<open>import\<close> operation makes a generalized fact a genuine part of the
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    83
  context, by inventing fixed variables for the schematic ones. The effect can
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    84
  be reversed by using \<open>export\<close> later, potentially with an extended context;
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    85
  the result is equivalent to the original modulo renaming of schematic
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    86
  variables.
20470
c839b38a1f32 more on variables;
wenzelm
parents: 20460
diff changeset
    87
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    88
  The \<open>focus\<close> operation provides a variant of \<open>import\<close> for nested propositions
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    89
  (with explicit quantification): \<open>\<And>x\<^sub>1 \<dots> x\<^sub>n. B(x\<^sub>1, \<dots>, x\<^sub>n)\<close> is decomposed
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
    90
  by inventing fixed variables \<open>x\<^sub>1, \<dots>, x\<^sub>n\<close> for the body.
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
    91
\<close>
20064
wenzelm
parents: 20041
diff changeset
    92
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
    93
text %mlref \<open>
20026
3469df62fe21 Local variables;
wenzelm
parents: 18537
diff changeset
    94
  \begin{mldecls}
20474
wenzelm
parents: 20472
diff changeset
    95
  @{index_ML Variable.add_fixes: "
wenzelm
parents: 20472
diff changeset
    96
  string list -> Proof.context -> string list * Proof.context"} \\
20797
c1f0bc7e7d80 renamed Variable.invent_fixes to Variable.variant_fixes;
wenzelm
parents: 20547
diff changeset
    97
  @{index_ML Variable.variant_fixes: "
20474
wenzelm
parents: 20472
diff changeset
    98
  string list -> Proof.context -> string list * Proof.context"} \\
20026
3469df62fe21 Local variables;
wenzelm
parents: 18537
diff changeset
    99
  @{index_ML Variable.declare_term: "term -> Proof.context -> Proof.context"} \\
20470
c839b38a1f32 more on variables;
wenzelm
parents: 20460
diff changeset
   100
  @{index_ML Variable.declare_constraints: "term -> Proof.context -> Proof.context"} \\
c839b38a1f32 more on variables;
wenzelm
parents: 20460
diff changeset
   101
  @{index_ML Variable.export: "Proof.context -> Proof.context -> thm list -> thm list"} \\
c839b38a1f32 more on variables;
wenzelm
parents: 20460
diff changeset
   102
  @{index_ML 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: 30272
diff changeset
   103
  @{index_ML Variable.import: "bool -> thm list -> Proof.context ->
60642
48dd1cefb4ae simplified Thm.instantiate and derivatives: the LHS refers to non-certified variables -- this merely serves as index into already certified structures (or is ignored);
wenzelm
parents: 59902
diff changeset
   104
  ((((indexname * sort) * ctyp) list * ((indexname * typ) * cterm) list) * thm list) * Proof.context"} \\
60695
757549b4bbe6 Variable.focus etc.: optional bindings provided by user;
wenzelm
parents: 60642
diff changeset
   105
  @{index_ML Variable.focus: "binding list option -> term -> Proof.context ->
42509
9d107a52b634 updated Variable.focus;
wenzelm
parents: 42361
diff changeset
   106
  ((string * (string * typ)) list * term) * Proof.context"} \\
20026
3469df62fe21 Local variables;
wenzelm
parents: 18537
diff changeset
   107
  \end{mldecls}
3469df62fe21 Local variables;
wenzelm
parents: 18537
diff changeset
   108
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   109
  \<^descr> @{ML Variable.add_fixes}~\<open>xs ctxt\<close> fixes term variables \<open>xs\<close>, returning
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   110
  the resulting internal names. By default, the internal representation
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   111
  coincides with the external one, which also means that the given variables
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   112
  must not be fixed already. There is a different policy within a local proof
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   113
  body: the given names are just hints for newly invented Skolem variables.
20064
wenzelm
parents: 20041
diff changeset
   114
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   115
  \<^descr> @{ML Variable.variant_fixes} is similar to @{ML Variable.add_fixes}, but
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   116
  always produces fresh variants of the given names.
20470
c839b38a1f32 more on variables;
wenzelm
parents: 20460
diff changeset
   117
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   118
  \<^descr> @{ML Variable.declare_term}~\<open>t ctxt\<close> declares term \<open>t\<close> to belong to the
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   119
  context. This automatically fixes new type variables, but not term
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   120
  variables. Syntactic constraints for type and term variables are declared
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   121
  uniformly, though.
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   122
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   123
  \<^descr> @{ML Variable.declare_constraints}~\<open>t ctxt\<close> declares syntactic constraints
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   124
  from term \<open>t\<close>, without making it part of the context yet.
20470
c839b38a1f32 more on variables;
wenzelm
parents: 20460
diff changeset
   125
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   126
  \<^descr> @{ML Variable.export}~\<open>inner outer thms\<close> generalizes fixed type and term
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   127
  variables in \<open>thms\<close> according to the difference of the \<open>inner\<close> and \<open>outer\<close>
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   128
  context, following the principles sketched above.
20470
c839b38a1f32 more on variables;
wenzelm
parents: 20460
diff changeset
   129
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   130
  \<^descr> @{ML Variable.polymorphic}~\<open>ctxt ts\<close> generalizes type variables in \<open>ts\<close> as
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   131
  far as possible, even those occurring in fixed term variables. The default
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   132
  policy of type-inference is to fix newly introduced type variables, which is
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   133
  essentially reversed with @{ML Variable.polymorphic}: here the given terms
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   134
  are detached from the context as far as possible.
20470
c839b38a1f32 more on variables;
wenzelm
parents: 20460
diff changeset
   135
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   136
  \<^descr> @{ML Variable.import}~\<open>open thms ctxt\<close> invents fixed type and term
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   137
  variables for the schematic ones occurring in \<open>thms\<close>. The \<open>open\<close> flag
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   138
  indicates whether the fixed names should be accessible to the user,
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   139
  otherwise newly introduced names are marked as ``internal''
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   140
  (\secref{sec:names}).
20026
3469df62fe21 Local variables;
wenzelm
parents: 18537
diff changeset
   141
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   142
  \<^descr> @{ML Variable.focus}~\<open>bindings B\<close> decomposes the outermost \<open>\<And>\<close> prefix of
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   143
  proposition \<open>B\<close>, using the given name bindings.
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   144
\<close>
20026
3469df62fe21 Local variables;
wenzelm
parents: 18537
diff changeset
   145
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   146
text %mlex \<open>
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   147
  The following example shows how to work with fixed term and type parameters
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   148
  and with type-inference.
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   149
\<close>
34932
28e231e4144b some examples for basic context operations;
wenzelm
parents: 34930
diff changeset
   150
59902
6afbe5a99139 misc tuning -- keep name space more clean;
wenzelm
parents: 59567
diff changeset
   151
ML_val \<open>
34932
28e231e4144b some examples for basic context operations;
wenzelm
parents: 34930
diff changeset
   152
  (*static compile-time context -- for testing only*)
28e231e4144b some examples for basic context operations;
wenzelm
parents: 34930
diff changeset
   153
  val ctxt0 = @{context};
28e231e4144b some examples for basic context operations;
wenzelm
parents: 34930
diff changeset
   154
28e231e4144b some examples for basic context operations;
wenzelm
parents: 34930
diff changeset
   155
  (*locally fixed parameters -- no type assignment yet*)
28e231e4144b some examples for basic context operations;
wenzelm
parents: 34930
diff changeset
   156
  val ([x, y], ctxt1) = ctxt0 |> Variable.add_fixes ["x", "y"];
28e231e4144b some examples for basic context operations;
wenzelm
parents: 34930
diff changeset
   157
28e231e4144b some examples for basic context operations;
wenzelm
parents: 34930
diff changeset
   158
  (*t1: most general fixed type; t1': most general arbitrary type*)
28e231e4144b some examples for basic context operations;
wenzelm
parents: 34930
diff changeset
   159
  val t1 = Syntax.read_term ctxt1 "x";
28e231e4144b some examples for basic context operations;
wenzelm
parents: 34930
diff changeset
   160
  val t1' = singleton (Variable.polymorphic ctxt1) t1;
28e231e4144b some examples for basic context operations;
wenzelm
parents: 34930
diff changeset
   161
28e231e4144b some examples for basic context operations;
wenzelm
parents: 34930
diff changeset
   162
  (*term u enforces specific type assignment*)
39846
cb6634eb8926 examples in Isabelle/HOL;
wenzelm
parents: 39841
diff changeset
   163
  val u = Syntax.read_term ctxt1 "(x::nat) \<equiv> y";
34932
28e231e4144b some examples for basic context operations;
wenzelm
parents: 34930
diff changeset
   164
28e231e4144b some examples for basic context operations;
wenzelm
parents: 34930
diff changeset
   165
  (*official declaration of u -- propagates constraints etc.*)
28e231e4144b some examples for basic context operations;
wenzelm
parents: 34930
diff changeset
   166
  val ctxt2 = ctxt1 |> Variable.declare_term u;
39846
cb6634eb8926 examples in Isabelle/HOL;
wenzelm
parents: 39841
diff changeset
   167
  val t2 = Syntax.read_term ctxt2 "x";  (*x::nat is enforced*)
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   168
\<close>
34932
28e231e4144b some examples for basic context operations;
wenzelm
parents: 34930
diff changeset
   169
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   170
text \<open>
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   171
  In the above example, the starting context is derived from the toplevel
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   172
  theory, which means that fixed variables are internalized literally: \<open>x\<close> is
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   173
  mapped again to \<open>x\<close>, and attempting to fix it again in the subsequent
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   174
  context is an error. Alternatively, fixed parameters can be renamed
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   175
  explicitly as follows:
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   176
\<close>
34932
28e231e4144b some examples for basic context operations;
wenzelm
parents: 34930
diff changeset
   177
59902
6afbe5a99139 misc tuning -- keep name space more clean;
wenzelm
parents: 59567
diff changeset
   178
ML_val \<open>
34932
28e231e4144b some examples for basic context operations;
wenzelm
parents: 34930
diff changeset
   179
  val ctxt0 = @{context};
28e231e4144b some examples for basic context operations;
wenzelm
parents: 34930
diff changeset
   180
  val ([x1, x2, x3], ctxt1) =
28e231e4144b some examples for basic context operations;
wenzelm
parents: 34930
diff changeset
   181
    ctxt0 |> Variable.variant_fixes ["x", "x", "x"];
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   182
\<close>
34932
28e231e4144b some examples for basic context operations;
wenzelm
parents: 34930
diff changeset
   183
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   184
text \<open>
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   185
  The following ML code can now work with the invented names of \<open>x1\<close>, \<open>x2\<close>,
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   186
  \<open>x3\<close>, without depending on the details on the system policy for introducing
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   187
  these variants. Recall that within a proof body the system always invents
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   188
  fresh ``Skolem constants'', e.g.\ as follows:
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   189
\<close>
34932
28e231e4144b some examples for basic context operations;
wenzelm
parents: 34930
diff changeset
   190
40964
482a8334ee9e prefer 'notepad' over 'example_proof';
wenzelm
parents: 40153
diff changeset
   191
notepad
482a8334ee9e prefer 'notepad' over 'example_proof';
wenzelm
parents: 40153
diff changeset
   192
begin
58728
42398b610f86 tuned spacing;
wenzelm
parents: 58618
diff changeset
   193
  ML_prf %"ML"
42398b610f86 tuned spacing;
wenzelm
parents: 58618
diff changeset
   194
   \<open>val ctxt0 = @{context};
34932
28e231e4144b some examples for basic context operations;
wenzelm
parents: 34930
diff changeset
   195
28e231e4144b some examples for basic context operations;
wenzelm
parents: 34930
diff changeset
   196
    val ([x1], ctxt1) = ctxt0 |> Variable.add_fixes ["x"];
28e231e4144b some examples for basic context operations;
wenzelm
parents: 34930
diff changeset
   197
    val ([x2], ctxt2) = ctxt1 |> Variable.add_fixes ["x"];
28e231e4144b some examples for basic context operations;
wenzelm
parents: 34930
diff changeset
   198
    val ([x3], ctxt3) = ctxt2 |> Variable.add_fixes ["x"];
28e231e4144b some examples for basic context operations;
wenzelm
parents: 34930
diff changeset
   199
28e231e4144b some examples for basic context operations;
wenzelm
parents: 34930
diff changeset
   200
    val ([y1, y2], ctxt4) =
58728
42398b610f86 tuned spacing;
wenzelm
parents: 58618
diff changeset
   201
      ctxt3 |> Variable.variant_fixes ["y", "y"];\<close>
40964
482a8334ee9e prefer 'notepad' over 'example_proof';
wenzelm
parents: 40153
diff changeset
   202
end
34932
28e231e4144b some examples for basic context operations;
wenzelm
parents: 34930
diff changeset
   203
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   204
text \<open>
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   205
  In this situation @{ML Variable.add_fixes} and @{ML Variable.variant_fixes}
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   206
  are very similar, but identical name proposals given in a row are only
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   207
  accepted by the second version.
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   208
\<close>
34932
28e231e4144b some examples for basic context operations;
wenzelm
parents: 34930
diff changeset
   209
18537
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   210
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   211
section \<open>Assumptions \label{sec:assumptions}\<close>
20451
27ea2ba48fa3 misc cleanup;
wenzelm
parents: 20218
diff changeset
   212
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   213
text \<open>
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   214
  An \<^emph>\<open>assumption\<close> is a proposition that it is postulated in the current
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   215
  context. Local conclusions may use assumptions as additional facts, but this
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   216
  imposes implicit hypotheses that weaken the overall statement.
20458
ab1d60e1ee31 explain assumptions;
wenzelm
parents: 20452
diff changeset
   217
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   218
  Assumptions are restricted to fixed non-schematic statements, i.e.\ all
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   219
  generality needs to be expressed by explicit quantifiers. Nevertheless, the
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   220
  result will be in HHF normal form with outermost quantifiers stripped. For
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   221
  example, by assuming \<open>\<And>x :: \<alpha>. P x\<close> we get \<open>\<And>x :: \<alpha>. P x \<turnstile> P ?x\<close> for
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   222
  schematic \<open>?x\<close> of fixed type \<open>\<alpha>\<close>. Local derivations accumulate more and more
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   223
  explicit references to hypotheses: \<open>A\<^sub>1, \<dots>, A\<^sub>n \<turnstile> B\<close> where \<open>A\<^sub>1, \<dots>, A\<^sub>n\<close>
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   224
  needs to be covered by the assumptions of the current context.
20458
ab1d60e1ee31 explain assumptions;
wenzelm
parents: 20452
diff changeset
   225
61416
b9a3324e4e62 more symbols;
wenzelm
parents: 60754
diff changeset
   226
  \<^medskip>
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   227
  The \<open>add_assms\<close> operation augments the context by local assumptions, which
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   228
  are parameterized by an arbitrary \<open>export\<close> rule (see below).
20458
ab1d60e1ee31 explain assumptions;
wenzelm
parents: 20452
diff changeset
   229
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   230
  The \<open>export\<close> operation moves facts from a (larger) inner context into a
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   231
  (smaller) outer context, by discharging the difference of the assumptions as
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   232
  specified by the associated export rules. Note that the discharged portion
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   233
  is determined by the difference of contexts, not the facts being exported!
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   234
  There is a separate flag to indicate a goal context, where the result is
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   235
  meant to refine an enclosing sub-goal of a structured proof state.
20458
ab1d60e1ee31 explain assumptions;
wenzelm
parents: 20452
diff changeset
   236
61416
b9a3324e4e62 more symbols;
wenzelm
parents: 60754
diff changeset
   237
  \<^medskip>
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   238
  The most basic export rule discharges assumptions directly by means of the
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   239
  \<open>\<Longrightarrow>\<close> introduction rule:
20458
ab1d60e1ee31 explain assumptions;
wenzelm
parents: 20452
diff changeset
   240
  \[
61493
0debd22f0c0e isabelle update_cartouches -t;
wenzelm
parents: 61477
diff changeset
   241
  \infer[(\<open>\<Longrightarrow>\<hyphen>intro\<close>)]{\<open>\<Gamma> - A \<turnstile> A \<Longrightarrow> B\<close>}{\<open>\<Gamma> \<turnstile> B\<close>}
20458
ab1d60e1ee31 explain assumptions;
wenzelm
parents: 20452
diff changeset
   242
  \]
ab1d60e1ee31 explain assumptions;
wenzelm
parents: 20452
diff changeset
   243
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   244
  The variant for goal refinements marks the newly introduced premises, which
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   245
  causes the canonical Isar goal refinement scheme to enforce unification with
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   246
  local premises within the goal:
20458
ab1d60e1ee31 explain assumptions;
wenzelm
parents: 20452
diff changeset
   247
  \[
61493
0debd22f0c0e isabelle update_cartouches -t;
wenzelm
parents: 61477
diff changeset
   248
  \infer[(\<open>#\<Longrightarrow>\<hyphen>intro\<close>)]{\<open>\<Gamma> - A \<turnstile> #A \<Longrightarrow> B\<close>}{\<open>\<Gamma> \<turnstile> B\<close>}
20458
ab1d60e1ee31 explain assumptions;
wenzelm
parents: 20452
diff changeset
   249
  \]
ab1d60e1ee31 explain assumptions;
wenzelm
parents: 20452
diff changeset
   250
61416
b9a3324e4e62 more symbols;
wenzelm
parents: 60754
diff changeset
   251
  \<^medskip>
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   252
  Alternative versions of assumptions may perform arbitrary transformations on
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   253
  export, as long as the corresponding portion of hypotheses is removed from
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   254
  the given facts. For example, a local definition works by fixing \<open>x\<close> and
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   255
  assuming \<open>x \<equiv> t\<close>, with the following export rule to reverse the effect:
20458
ab1d60e1ee31 explain assumptions;
wenzelm
parents: 20452
diff changeset
   256
  \[
61493
0debd22f0c0e isabelle update_cartouches -t;
wenzelm
parents: 61477
diff changeset
   257
  \infer[(\<open>\<equiv>\<hyphen>expand\<close>)]{\<open>\<Gamma> - (x \<equiv> t) \<turnstile> B t\<close>}{\<open>\<Gamma> \<turnstile> B x\<close>}
20458
ab1d60e1ee31 explain assumptions;
wenzelm
parents: 20452
diff changeset
   258
  \]
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   259
  This works, because the assumption \<open>x \<equiv> t\<close> was introduced in a context with
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   260
  \<open>x\<close> being fresh, so \<open>x\<close> does not occur in \<open>\<Gamma>\<close> here.
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   261
\<close>
20458
ab1d60e1ee31 explain assumptions;
wenzelm
parents: 20452
diff changeset
   262
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   263
text %mlref \<open>
20458
ab1d60e1ee31 explain assumptions;
wenzelm
parents: 20452
diff changeset
   264
  \begin{mldecls}
ab1d60e1ee31 explain assumptions;
wenzelm
parents: 20452
diff changeset
   265
  @{index_ML_type Assumption.export} \\
54883
dd04a8b654fc proper context for norm_hhf and derived operations;
wenzelm
parents: 53015
diff changeset
   266
  @{index_ML Assumption.assume: "Proof.context -> cterm -> thm"} \\
20458
ab1d60e1ee31 explain assumptions;
wenzelm
parents: 20452
diff changeset
   267
  @{index_ML Assumption.add_assms:
20459
wenzelm
parents: 20458
diff changeset
   268
    "Assumption.export ->
wenzelm
parents: 20458
diff changeset
   269
  cterm list -> Proof.context -> thm list * Proof.context"} \\
wenzelm
parents: 20458
diff changeset
   270
  @{index_ML Assumption.add_assumes: "
wenzelm
parents: 20458
diff changeset
   271
  cterm list -> Proof.context -> thm list * Proof.context"} \\
20458
ab1d60e1ee31 explain assumptions;
wenzelm
parents: 20452
diff changeset
   272
  @{index_ML Assumption.export: "bool -> Proof.context -> Proof.context -> thm -> thm"} \\
ab1d60e1ee31 explain assumptions;
wenzelm
parents: 20452
diff changeset
   273
  \end{mldecls}
ab1d60e1ee31 explain assumptions;
wenzelm
parents: 20452
diff changeset
   274
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   275
  \<^descr> Type @{ML_type Assumption.export} represents arbitrary export rules, which
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   276
  is any function of type @{ML_type "bool -> cterm list -> thm -> thm"}, where
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   277
  the @{ML_type "bool"} indicates goal mode, and the @{ML_type "cterm list"}
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   278
  the collection of assumptions to be discharged simultaneously.
20458
ab1d60e1ee31 explain assumptions;
wenzelm
parents: 20452
diff changeset
   279
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   280
  \<^descr> @{ML Assumption.assume}~\<open>ctxt A\<close> turns proposition \<open>A\<close> into a primitive
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   281
  assumption \<open>A \<turnstile> A'\<close>, where the conclusion \<open>A'\<close> is in HHF normal form.
20458
ab1d60e1ee31 explain assumptions;
wenzelm
parents: 20452
diff changeset
   282
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   283
  \<^descr> @{ML Assumption.add_assms}~\<open>r As\<close> augments the context by assumptions \<open>As\<close>
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   284
  with export rule \<open>r\<close>. The resulting facts are hypothetical theorems as
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   285
  produced by the raw @{ML Assumption.assume}.
20459
wenzelm
parents: 20458
diff changeset
   286
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   287
  \<^descr> @{ML Assumption.add_assumes}~\<open>As\<close> is a special case of @{ML
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   288
  Assumption.add_assms} where the export rule performs \<open>\<Longrightarrow>\<hyphen>intro\<close> or
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   289
  \<open>#\<Longrightarrow>\<hyphen>intro\<close>, depending on goal mode.
20458
ab1d60e1ee31 explain assumptions;
wenzelm
parents: 20452
diff changeset
   290
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   291
  \<^descr> @{ML Assumption.export}~\<open>is_goal inner outer thm\<close> exports result \<open>thm\<close>
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   292
  from the the \<open>inner\<close> context back into the \<open>outer\<close> one; \<open>is_goal = true\<close>
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   293
  means this is a goal context. The result is in HHF normal form. Note that
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   294
  @{ML "Proof_Context.export"} combines @{ML "Variable.export"} and @{ML
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   295
  "Assumption.export"} in the canonical way.
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   296
\<close>
20451
27ea2ba48fa3 misc cleanup;
wenzelm
parents: 20218
diff changeset
   297
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   298
text %mlex \<open>
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   299
  The following example demonstrates how rules can be derived by building up a
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   300
  context of assumptions first, and exporting some local fact afterwards. We
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   301
  refer to @{theory Pure} equality here for testing purposes.
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   302
\<close>
34932
28e231e4144b some examples for basic context operations;
wenzelm
parents: 34930
diff changeset
   303
59902
6afbe5a99139 misc tuning -- keep name space more clean;
wenzelm
parents: 59567
diff changeset
   304
ML_val \<open>
34932
28e231e4144b some examples for basic context operations;
wenzelm
parents: 34930
diff changeset
   305
  (*static compile-time context -- for testing only*)
28e231e4144b some examples for basic context operations;
wenzelm
parents: 34930
diff changeset
   306
  val ctxt0 = @{context};
28e231e4144b some examples for basic context operations;
wenzelm
parents: 34930
diff changeset
   307
28e231e4144b some examples for basic context operations;
wenzelm
parents: 34930
diff changeset
   308
  val ([eq], ctxt1) =
28e231e4144b some examples for basic context operations;
wenzelm
parents: 34930
diff changeset
   309
    ctxt0 |> Assumption.add_assumes [@{cprop "x \<equiv> y"}];
28e231e4144b some examples for basic context operations;
wenzelm
parents: 34930
diff changeset
   310
  val eq' = Thm.symmetric eq;
28e231e4144b some examples for basic context operations;
wenzelm
parents: 34930
diff changeset
   311
28e231e4144b some examples for basic context operations;
wenzelm
parents: 34930
diff changeset
   312
  (*back to original context -- discharges assumption*)
28e231e4144b some examples for basic context operations;
wenzelm
parents: 34930
diff changeset
   313
  val r = Assumption.export false ctxt1 ctxt0 eq';
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   314
\<close>
34932
28e231e4144b some examples for basic context operations;
wenzelm
parents: 34930
diff changeset
   315
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   316
text \<open>
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   317
  Note that the variables of the resulting rule are not generalized. This
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   318
  would have required to fix them properly in the context beforehand, and
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   319
  export wrt.\ variables afterwards (cf.\ @{ML Variable.export} or the
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   320
  combined @{ML "Proof_Context.export"}).
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   321
\<close>
34932
28e231e4144b some examples for basic context operations;
wenzelm
parents: 34930
diff changeset
   322
20451
27ea2ba48fa3 misc cleanup;
wenzelm
parents: 20218
diff changeset
   323
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   324
section \<open>Structured goals and results \label{sec:struct-goals}\<close>
20451
27ea2ba48fa3 misc cleanup;
wenzelm
parents: 20218
diff changeset
   325
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   326
text \<open>
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   327
  Local results are established by monotonic reasoning from facts within a
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   328
  context. This allows common combinations of theorems, e.g.\ via \<open>\<And>/\<Longrightarrow>\<close>
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   329
  elimination, resolution rules, or equational reasoning, see
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   330
  \secref{sec:thms}. Unaccounted context manipulations should be avoided,
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   331
  notably raw \<open>\<And>/\<Longrightarrow>\<close> introduction or ad-hoc references to free variables or
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   332
  assumptions not present in the proof context.
18537
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   333
61416
b9a3324e4e62 more symbols;
wenzelm
parents: 60754
diff changeset
   334
  \<^medskip>
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   335
  The \<open>SUBPROOF\<close> combinator allows to structure a tactical proof recursively
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   336
  by decomposing a selected sub-goal: \<open>(\<And>x. A(x) \<Longrightarrow> B(x)) \<Longrightarrow> \<dots>\<close> is turned into
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   337
  \<open>B(x) \<Longrightarrow> \<dots>\<close> after fixing \<open>x\<close> and assuming \<open>A(x)\<close>. This means the tactic needs
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   338
  to solve the conclusion, but may use the premise as a local fact, for
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   339
  locally fixed variables.
18537
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   340
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   341
  The family of \<open>FOCUS\<close> combinators is similar to \<open>SUBPROOF\<close>, but allows to
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   342
  retain schematic variables and pending subgoals in the resulting goal state.
34930
f3bce1cc513c added Subgoal.FOCUS;
wenzelm
parents: 32302
diff changeset
   343
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   344
  The \<open>prove\<close> operation provides an interface for structured backwards
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   345
  reasoning under program control, with some explicit sanity checks of the
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   346
  result. The goal context can be augmented by additional fixed variables
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   347
  (cf.\ \secref{sec:variables}) and assumptions (cf.\
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   348
  \secref{sec:assumptions}), which will be available as local facts during the
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   349
  proof and discharged into implications in the result. Type and term
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   350
  variables are generalized as usual, according to the context.
18537
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   351
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   352
  The \<open>obtain\<close> operation produces results by eliminating existing facts by
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   353
  means of a given tactic. This acts like a dual conclusion: the proof
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   354
  demonstrates that the context may be augmented by parameters and
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   355
  assumptions, without affecting any conclusions that do not mention these
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   356
  parameters. See also @{cite "isabelle-isar-ref"} for the user-level
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   357
  @{command obtain} and @{command guess} elements. Final results, which may
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   358
  not refer to the parameters in the conclusion, need to exported explicitly
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   359
  into the original context.\<close>
18537
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   360
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   361
text %mlref \<open>
20472
wenzelm
parents: 20470
diff changeset
   362
  \begin{mldecls}
39821
bf164c153d10 minor tuning and updating;
wenzelm
parents: 34932
diff changeset
   363
  @{index_ML SUBPROOF: "(Subgoal.focus -> tactic) ->
bf164c153d10 minor tuning and updating;
wenzelm
parents: 34932
diff changeset
   364
  Proof.context -> int -> tactic"} \\
bf164c153d10 minor tuning and updating;
wenzelm
parents: 34932
diff changeset
   365
  @{index_ML Subgoal.FOCUS: "(Subgoal.focus -> tactic) ->
bf164c153d10 minor tuning and updating;
wenzelm
parents: 34932
diff changeset
   366
  Proof.context -> int -> tactic"} \\
bf164c153d10 minor tuning and updating;
wenzelm
parents: 34932
diff changeset
   367
  @{index_ML Subgoal.FOCUS_PREMS: "(Subgoal.focus -> tactic) ->
bf164c153d10 minor tuning and updating;
wenzelm
parents: 34932
diff changeset
   368
  Proof.context -> int -> tactic"} \\
bf164c153d10 minor tuning and updating;
wenzelm
parents: 34932
diff changeset
   369
  @{index_ML Subgoal.FOCUS_PARAMS: "(Subgoal.focus -> tactic) ->
bf164c153d10 minor tuning and updating;
wenzelm
parents: 34932
diff changeset
   370
  Proof.context -> int -> tactic"} \\
60695
757549b4bbe6 Variable.focus etc.: optional bindings provided by user;
wenzelm
parents: 60642
diff changeset
   371
  @{index_ML Subgoal.focus: "Proof.context -> int -> binding list option ->
757549b4bbe6 Variable.focus etc.: optional bindings provided by user;
wenzelm
parents: 60642
diff changeset
   372
  thm -> Subgoal.focus * thm"} \\
757549b4bbe6 Variable.focus etc.: optional bindings provided by user;
wenzelm
parents: 60642
diff changeset
   373
  @{index_ML Subgoal.focus_prems: "Proof.context -> int -> binding list option ->
757549b4bbe6 Variable.focus etc.: optional bindings provided by user;
wenzelm
parents: 60642
diff changeset
   374
  thm -> Subgoal.focus * thm"} \\
757549b4bbe6 Variable.focus etc.: optional bindings provided by user;
wenzelm
parents: 60642
diff changeset
   375
  @{index_ML Subgoal.focus_params: "Proof.context -> int -> binding list option ->
757549b4bbe6 Variable.focus etc.: optional bindings provided by user;
wenzelm
parents: 60642
diff changeset
   376
  thm -> Subgoal.focus * thm"} \\
20547
wenzelm
parents: 20542
diff changeset
   377
  \end{mldecls}
34930
f3bce1cc513c added Subgoal.FOCUS;
wenzelm
parents: 32302
diff changeset
   378
20547
wenzelm
parents: 20542
diff changeset
   379
  \begin{mldecls}
20472
wenzelm
parents: 20470
diff changeset
   380
  @{index_ML Goal.prove: "Proof.context -> string list -> term list -> term ->
wenzelm
parents: 20470
diff changeset
   381
  ({prems: thm list, context: Proof.context} -> tactic) -> thm"} \\
59564
fdc03c8daacc Goal.prove_multi is superseded by the fully general Goal.prove_common;
wenzelm
parents: 58801
diff changeset
   382
  @{index_ML Goal.prove_common: "Proof.context -> int option ->
fdc03c8daacc Goal.prove_multi is superseded by the fully general Goal.prove_common;
wenzelm
parents: 58801
diff changeset
   383
  string list -> term list -> term list ->
20472
wenzelm
parents: 20470
diff changeset
   384
  ({prems: thm list, context: Proof.context} -> tactic) -> thm list"} \\
20547
wenzelm
parents: 20542
diff changeset
   385
  \end{mldecls}
wenzelm
parents: 20542
diff changeset
   386
  \begin{mldecls}
39821
bf164c153d10 minor tuning and updating;
wenzelm
parents: 34932
diff changeset
   387
  @{index_ML Obtain.result: "(Proof.context -> tactic) -> thm list ->
bf164c153d10 minor tuning and updating;
wenzelm
parents: 34932
diff changeset
   388
  Proof.context -> ((string * cterm) list * thm list) * Proof.context"} \\
20472
wenzelm
parents: 20470
diff changeset
   389
  \end{mldecls}
18537
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   390
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   391
  \<^descr> @{ML SUBPROOF}~\<open>tac ctxt i\<close> decomposes the structure of the specified
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   392
  sub-goal, producing an extended context and a reduced goal, which needs to
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   393
  be solved by the given tactic. All schematic parameters of the goal are
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   394
  imported into the context as fixed ones, which may not be instantiated in
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   395
  the sub-proof.
20491
wenzelm
parents: 20474
diff changeset
   396
61439
2bf52eec4e8a more symbols;
wenzelm
parents: 61416
diff changeset
   397
  \<^descr> @{ML Subgoal.FOCUS}, @{ML Subgoal.FOCUS_PREMS}, and @{ML
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   398
  Subgoal.FOCUS_PARAMS} are similar to @{ML SUBPROOF}, but are slightly more
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   399
  flexible: only the specified parts of the subgoal are imported into the
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   400
  context, and the body tactic may introduce new subgoals and schematic
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   401
  variables.
34930
f3bce1cc513c added Subgoal.FOCUS;
wenzelm
parents: 32302
diff changeset
   402
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   403
  \<^descr> @{ML Subgoal.focus}, @{ML Subgoal.focus_prems}, @{ML Subgoal.focus_params}
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   404
  extract the focus information from a goal state in the same way as the
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   405
  corresponding tacticals above. This is occasionally useful to experiment
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   406
  without writing actual tactics yet.
39853
a5a731dec31c more examples;
wenzelm
parents: 39851
diff changeset
   407
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   408
  \<^descr> @{ML Goal.prove}~\<open>ctxt xs As C tac\<close> states goal \<open>C\<close> in the context
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   409
  augmented by fixed variables \<open>xs\<close> and assumptions \<open>As\<close>, and applies tactic
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   410
  \<open>tac\<close> to solve it. The latter may depend on the local assumptions being
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   411
  presented as facts. The result is in HHF normal form.
18537
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   412
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   413
  \<^descr> @{ML Goal.prove_common}~\<open>ctxt fork_pri\<close> is the common form to state and
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   414
  prove a simultaneous goal statement, where @{ML Goal.prove} is a convenient
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   415
  shorthand that is most frequently used in applications.
59564
fdc03c8daacc Goal.prove_multi is superseded by the fully general Goal.prove_common;
wenzelm
parents: 58801
diff changeset
   416
fdc03c8daacc Goal.prove_multi is superseded by the fully general Goal.prove_common;
wenzelm
parents: 58801
diff changeset
   417
  The given list of simultaneous conclusions is encoded in the goal state by
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   418
  means of Pure conjunction: @{ML Goal.conjunction_tac} will turn this into a
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   419
  collection of individual subgoals, but note that the original multi-goal
59564
fdc03c8daacc Goal.prove_multi is superseded by the fully general Goal.prove_common;
wenzelm
parents: 58801
diff changeset
   420
  state is usually required for advanced induction.
fdc03c8daacc Goal.prove_multi is superseded by the fully general Goal.prove_common;
wenzelm
parents: 58801
diff changeset
   421
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   422
  It is possible to provide an optional priority for a forked proof, typically
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   423
  @{ML "SOME ~1"}, while @{ML NONE} means the proof is immediate (sequential)
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   424
  as for @{ML Goal.prove}. Note that a forked proof does not exhibit any
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   425
  failures in the usual way via exceptions in ML, but accumulates error
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   426
  situations under the execution id of the running transaction. Thus the
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   427
  system is able to expose error messages ultimately to the end-user, even
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   428
  though the subsequent ML code misses them.
20472
wenzelm
parents: 20470
diff changeset
   429
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   430
  \<^descr> @{ML Obtain.result}~\<open>tac thms ctxt\<close> eliminates the given facts using a
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   431
  tactic, which results in additional fixed variables and assumptions in the
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   432
  context. Final results need to be exported explicitly.
58618
782f0b662cae more cartouches;
wenzelm
parents: 58555
diff changeset
   433
\<close>
30272
2d612824e642 regenerated document;
wenzelm
parents: 30270
diff changeset
   434
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   435
text %mlex \<open>
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   436
  The following minimal example illustrates how to access the focus
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   437
  information of a structured goal state.
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   438
\<close>
39853
a5a731dec31c more examples;
wenzelm
parents: 39851
diff changeset
   439
40964
482a8334ee9e prefer 'notepad' over 'example_proof';
wenzelm
parents: 40153
diff changeset
   440
notepad
482a8334ee9e prefer 'notepad' over 'example_proof';
wenzelm
parents: 40153
diff changeset
   441
begin
39853
a5a731dec31c more examples;
wenzelm
parents: 39851
diff changeset
   442
  fix A B C :: "'a \<Rightarrow> bool"
a5a731dec31c more examples;
wenzelm
parents: 39851
diff changeset
   443
a5a731dec31c more examples;
wenzelm
parents: 39851
diff changeset
   444
  have "\<And>x. A x \<Longrightarrow> B x \<Longrightarrow> C x"
a5a731dec31c more examples;
wenzelm
parents: 39851
diff changeset
   445
    ML_val
58728
42398b610f86 tuned spacing;
wenzelm
parents: 58618
diff changeset
   446
     \<open>val {goal, context = goal_ctxt, ...} = @{Isar.goal};
39853
a5a731dec31c more examples;
wenzelm
parents: 39851
diff changeset
   447
      val (focus as {params, asms, concl, ...}, goal') =
60695
757549b4bbe6 Variable.focus etc.: optional bindings provided by user;
wenzelm
parents: 60642
diff changeset
   448
        Subgoal.focus goal_ctxt 1 (SOME [@{binding x}]) goal;
39853
a5a731dec31c more examples;
wenzelm
parents: 39851
diff changeset
   449
      val [A, B] = #prems focus;
58728
42398b610f86 tuned spacing;
wenzelm
parents: 58618
diff changeset
   450
      val [(_, x)] = #params focus;\<close>
58801
f420225a22d6 'notepad' requires proper nesting of begin/end;
wenzelm
parents: 58728
diff changeset
   451
    sorry
f420225a22d6 'notepad' requires proper nesting of begin/end;
wenzelm
parents: 58728
diff changeset
   452
end
39853
a5a731dec31c more examples;
wenzelm
parents: 39851
diff changeset
   453
61416
b9a3324e4e62 more symbols;
wenzelm
parents: 60754
diff changeset
   454
text \<open>
b9a3324e4e62 more symbols;
wenzelm
parents: 60754
diff changeset
   455
  \<^medskip>
61854
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   456
  The next example demonstrates forward-elimination in a local context, using
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   457
  @{ML Obtain.result}.
38b049cd3aad tuned whitespace;
wenzelm
parents: 61656
diff changeset
   458
\<close>
39851
7219a771ab63 more examples;
wenzelm
parents: 39846
diff changeset
   459
40964
482a8334ee9e prefer 'notepad' over 'example_proof';
wenzelm
parents: 40153
diff changeset
   460
notepad
482a8334ee9e prefer 'notepad' over 'example_proof';
wenzelm
parents: 40153
diff changeset
   461
begin
39851
7219a771ab63 more examples;
wenzelm
parents: 39846
diff changeset
   462
  assume ex: "\<exists>x. B x"
7219a771ab63 more examples;
wenzelm
parents: 39846
diff changeset
   463
58728
42398b610f86 tuned spacing;
wenzelm
parents: 58618
diff changeset
   464
  ML_prf %"ML"
42398b610f86 tuned spacing;
wenzelm
parents: 58618
diff changeset
   465
   \<open>val ctxt0 = @{context};
39851
7219a771ab63 more examples;
wenzelm
parents: 39846
diff changeset
   466
    val (([(_, x)], [B]), ctxt1) = ctxt0
60754
02924903a6fd prefer tactics with explicit context;
wenzelm
parents: 60695
diff changeset
   467
      |> Obtain.result (fn _ => eresolve_tac ctxt0 @{thms exE} 1) [@{thm ex}];\<close>
58728
42398b610f86 tuned spacing;
wenzelm
parents: 58618
diff changeset
   468
  ML_prf %"ML"
42398b610f86 tuned spacing;
wenzelm
parents: 58618
diff changeset
   469
   \<open>singleton (Proof_Context.export ctxt1 ctxt0) @{thm refl};\<close>
42398b610f86 tuned spacing;
wenzelm
parents: 58618
diff changeset
   470
  ML_prf %"ML"
42398b610f86 tuned spacing;
wenzelm
parents: 58618
diff changeset
   471
   \<open>Proof_Context.export ctxt1 ctxt0 [Thm.reflexive x]
42398b610f86 tuned spacing;
wenzelm
parents: 58618
diff changeset
   472
      handle ERROR msg => (warning msg; []);\<close>
40964
482a8334ee9e prefer 'notepad' over 'example_proof';
wenzelm
parents: 40153
diff changeset
   473
end
39851
7219a771ab63 more examples;
wenzelm
parents: 39846
diff changeset
   474
18537
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   475
end