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