| author | blanchet | 
| Thu, 16 Jul 2015 18:36:16 +0200 | |
| changeset 60741 | 6349a28af772 | 
| parent 60298 | 7c278b692aae | 
| child 61417 | e39b85325b41 | 
| permissions | -rw-r--r-- | 
| 
60288
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
1  | 
(*:wrap=hard:maxLineLen=78:*)  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
2  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
3  | 
theory Manual  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
4  | 
imports Base "../Eisbach_Tools"  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
5  | 
begin  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
6  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
7  | 
chapter \<open>The method command\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
8  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
9  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
10  | 
  The @{command_def method} command provides the ability to write proof
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
11  | 
methods by combining existing ones with their usual syntax. Specifically it  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
12  | 
allows compound proof methods to be named, and to extend the name space of  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
13  | 
basic methods accordingly. Method definitions may abstract over parameters:  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
14  | 
terms, facts, or other methods.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
15  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
16  | 
\medskip The syntax diagram below refers to some syntactic categories that  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
17  | 
  are further defined in @{cite "isabelle-isar-ref"}.
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
18  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
19  | 
  @{rail \<open>
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
20  | 
    @@{command method} name args @'=' method
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
21  | 
;  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
22  | 
args: term_args? method_args? \<newline> fact_args? decl_args?  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
23  | 
;  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
24  | 
    term_args: @'for' @{syntax "fixes"}
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
25  | 
;  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
26  | 
method_args: @'methods' (name+)  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
27  | 
;  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
28  | 
fact_args: @'uses' (name+)  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
29  | 
;  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
30  | 
decl_args: @'declares' (name+)  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
31  | 
\<close>}  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
32  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
33  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
34  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
35  | 
section \<open>Basic method definitions\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
36  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
37  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
38  | 
Consider the following proof that makes use of usual Isar method  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
39  | 
combinators.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
40  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
41  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
42  | 
lemma "P \<and> Q \<longrightarrow> P"  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
43  | 
by ((rule impI, (erule conjE)?) | assumption)+  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
44  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
45  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
46  | 
It is clear that this compound method will be applicable in more cases than  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
47  | 
  this proof alone. With the @{command method} command we can define a proof
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
48  | 
method that makes the above functionality available generally.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
49  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
50  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
51  | 
method prop_solver\<^sub>1 =  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
52  | 
((rule impI, (erule conjE)?) | assumption)+  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
53  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
54  | 
lemma "P \<and> Q \<and> R \<longrightarrow> P"  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
55  | 
by prop_solver\<^sub>1  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
56  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
57  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
58  | 
  In this example, the facts @{text impI} and @{text conjE} are static. They
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
59  | 
are evaluated once when the method is defined and cannot be changed later.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
60  | 
  This makes the method stable in the sense of \emph{static scoping}: naming
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
61  | 
  another fact @{text impI} in a later context won't affect the behaviour of
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
62  | 
  @{text "prop_solver\<^sub>1"}.
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
63  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
64  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
65  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
66  | 
section \<open>Term abstraction\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
67  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
68  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
69  | 
  Methods can also abstract over terms using the @{keyword_def "for"} keyword,
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
70  | 
optionally providing type constraints. For instance, the following proof  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
71  | 
  method @{text intro_ex} takes a term @{term y} of any type, which it uses to
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
72  | 
  instantiate the @{term x}-variable of @{text exI} (existential introduction)
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
73  | 
before applying the result as a rule. The instantiation is performed here by  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
74  | 
  Isar's @{attribute_ref "where"} attribute. If the current subgoal is to find
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
75  | 
  a witness for the given predicate @{term Q}, then this has the effect of
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
76  | 
  committing to @{term y}.
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
77  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
78  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
79  | 
method intro_ex for Q :: "'a \<Rightarrow> bool" and y :: 'a =  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
80  | 
(rule exI ["where" P = Q and x = y])  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
81  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
82  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
83  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
84  | 
  The term parameters @{term y} and @{term Q} can be used arbitrarily inside
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
85  | 
the method body, as part of attribute applications or arguments to other  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
86  | 
methods. The expression is type-checked as far as possible when the method  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
87  | 
is defined, however dynamic type errors can still occur when it is invoked  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
88  | 
(e.g.\ when terms are instantiated in a parameterized fact). Actual term  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
89  | 
arguments are supplied positionally, in the same order as in the method  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
90  | 
definition.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
91  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
92  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
93  | 
lemma "P a \<Longrightarrow> \<exists>x. P x"  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
94  | 
by (intro_ex P a)  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
95  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
96  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
97  | 
section \<open>Fact abstraction\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
98  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
99  | 
subsection \<open>Named theorems\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
100  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
101  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
102  | 
  A @{text "named theorem"} is a fact whose contents are produced dynamically
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
103  | 
  within the current proof context. The Isar command @{command_ref
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
104  | 
"named_theorems"} provides simple access to this concept: it declares a  | 
| 
60298
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
105  | 
  dynamic fact with corresponding \emph{attribute} for managing
 | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
106  | 
this particular data slot in the context.  | 
| 
60288
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
107  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
108  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
109  | 
named_theorems intros  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
110  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
111  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
112  | 
  So far @{text "intros"} refers to the empty fact. Using the Isar command
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
113  | 
  @{command_ref "declare"} we may apply declaration attributes to the context.
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
114  | 
  Below we declare both @{text "conjI"} and @{text "impI"} as @{text
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
115  | 
"intros"}, adding them to the named theorem slot.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
116  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
117  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
118  | 
declare conjI [intros] and impI [intros]  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
119  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
120  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
121  | 
We can refer to named theorems as dynamic facts within a particular proof  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
122  | 
context, which are evaluated whenever the method is invoked. Instead of  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
123  | 
  having facts hard-coded into the method, as in @{text prop_solver\<^sub>1}, we can
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
124  | 
instead refer to these named theorems.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
125  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
126  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
127  | 
named_theorems elims  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
128  | 
declare conjE [elims]  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
129  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
130  | 
method prop_solver\<^sub>3 =  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
131  | 
((rule intros, (erule elims)?) | assumption)+  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
132  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
133  | 
lemma "P \<and> Q \<longrightarrow> P"  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
134  | 
by prop_solver\<^sub>3  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
135  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
136  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
137  | 
Often these named theorems need to be augmented on the spot, when a method  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
138  | 
  is invoked. The @{keyword_def "declares"} keyword in the signature of
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
139  | 
  @{command method} adds the common method syntax @{text "method decl: facts"}
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
140  | 
  for each named theorem @{text decl}.
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
141  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
142  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
143  | 
method prop_solver\<^sub>4 declares intros elims =  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
144  | 
((rule intros, (erule elims)?) | assumption)+  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
145  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
146  | 
lemma "P \<and> (P \<longrightarrow> Q) \<longrightarrow> Q \<and> P"  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
147  | 
by (prop_solver\<^sub>4 elims: impE intros: conjI)  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
148  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
149  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
150  | 
subsection \<open>Simple fact abstraction\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
151  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
152  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
153  | 
  The @{keyword "declares"} keyword requires that a corresponding dynamic fact
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
154  | 
  has been declared with @{command_ref named_theorems}. This is useful for
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
155  | 
managing collections of facts which are to be augmented with declarations,  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
156  | 
but is overkill if we simply want to pass a fact to a method.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
157  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
158  | 
  We may use the @{keyword_def "uses"} keyword in the method header to provide
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
159  | 
  a simple fact parameter. In contrast to @{keyword "declares"}, these facts
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
160  | 
are always implicitly empty unless augmented when the method is invoked.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
161  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
162  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
163  | 
method rule_twice uses my_rule =  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
164  | 
(rule my_rule, rule my_rule)  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
165  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
166  | 
lemma "P \<Longrightarrow> Q \<Longrightarrow> (P \<and> Q) \<and> Q"  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
167  | 
by (rule_twice my_rule: conjI)  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
168  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
169  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
170  | 
section \<open>Higher-order methods\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
171  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
172  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
173  | 
  The \emph{structured concatenation} combinator ``@{text "method\<^sub>1 ;
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
174  | 
method\<^sub>2"}'' was introduced in Isabelle2015, motivated by development of  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
175  | 
  Eisbach. It is similar to ``@{text "method\<^sub>1, method\<^sub>2"}'', but @{text
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
176  | 
  method\<^sub>2} is invoked on on \emph{all} subgoals that have newly emerged from
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
177  | 
  @{text method\<^sub>1}. This is useful to handle cases where the number of
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
178  | 
subgoals produced by a method is determined dynamically at run-time.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
179  | 
\<close>  | 
| 
60298
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
180  | 
text_raw\<open>\vbox{\<close>
 | 
| 
60288
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
181  | 
method conj_with uses rule =  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
182  | 
(intro conjI ; intro rule)  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
183  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
184  | 
lemma  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
185  | 
assumes A: "P"  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
186  | 
shows "P \<and> P \<and> P"  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
187  | 
by (conj_with rule: A)  | 
| 
60298
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
188  | 
text_raw\<open>}\<close>  | 
| 
60288
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
189  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
190  | 
Method definitions may take other methods as arguments, and thus implement  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
191  | 
method combinators with prefix syntax. For example, to more usefully exploit  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
192  | 
Isabelle's backtracking, the explicit requirement that a method solve all  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
193  | 
produced subgoals is frequently useful. This can easily be written as a  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
194  | 
  \emph{higher-order method} using ``@{text ";"}''. The @{keyword "methods"}
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
195  | 
keyword denotes method parameters that are other proof methods to be invoked  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
196  | 
by the method being defined.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
197  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
198  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
199  | 
method solve methods m = (m ; fail)  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
200  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
201  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
202  | 
  Given some method-argument @{text m}, @{text "solve \<open>m\<close>"} applies the
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
203  | 
  method @{text m} and then fails whenever @{text m} produces any new unsolved
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
204  | 
  subgoals --- i.e. when @{text m} fails to completely discharge the goal it
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
205  | 
was applied to.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
206  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
207  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
208  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
209  | 
section \<open>Example\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
210  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
211  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
212  | 
With these simple features we are ready to write our first non-trivial proof  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
213  | 
method. Returning to the first-order logic example, the following method  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
214  | 
definition applies various rules with their canonical methods.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
215  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
216  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
217  | 
named_theorems subst  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
218  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
219  | 
method prop_solver declares intros elims subst =  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
220  | 
(assumption |  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
221  | 
(rule intros) | erule elims |  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
222  | 
subst subst | subst (asm) subst |  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
223  | 
(erule notE ; solve \<open>prop_solver\<close>))+  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
224  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
225  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
226  | 
  The only non-trivial part above is the final alternative @{text "(erule notE
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
227  | 
; solve \<open>prop_solver\<close>)"}. Here, in the case that all other alternatives  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
228  | 
  fail, the method takes one of the assumptions @{term "\<not> P"} of the current
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
229  | 
  goal and eliminates it with the rule @{text notE}, causing the goal to be
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
230  | 
  proved to become @{term P}. The method then recursively invokes itself on
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
231  | 
the remaining goals. The job of the recursive call is to demonstrate that  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
232  | 
  there is a contradiction in the original assumptions (i.e.\ that @{term P}
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
233  | 
can be derived from them). Note this recursive invocation is applied with  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
234  | 
  the @{method solve} method combinator to ensure that a contradiction will
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
235  | 
indeed be shown. In the case where a contradiction cannot be found,  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
236  | 
  backtracking will occur and a different assumption @{term "\<not> Q"} will be
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
237  | 
chosen for elimination.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
238  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
239  | 
  Note that the recursive call to @{method prop_solver} does not have any
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
240  | 
  parameters passed to it. Recall that fact parameters, e.g.\ @{text
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
241  | 
  "intros"}, @{text "elims"}, and @{text "subst"}, are managed by declarations
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
242  | 
in the current proof context. They will therefore be passed to any recursive  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
243  | 
  call to @{method prop_solver} and, more generally, any invocation of a
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
244  | 
method which declares these named theorems.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
245  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
246  | 
  \medskip After declaring some standard rules to the context, the @{method
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
247  | 
prop_solver} becomes capable of solving non-trivial propositional  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
248  | 
tautologies.\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
249  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
250  | 
lemmas [intros] =  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
251  | 
      conjI  --  \<open>@{thm conjI}\<close>
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
252  | 
      impI  --  \<open>@{thm impI}\<close>
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
253  | 
      disjCI  --  \<open>@{thm disjCI}\<close>
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
254  | 
      iffI  --  \<open>@{thm iffI}\<close>
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
255  | 
      notI  --  \<open>@{thm notI}\<close>
 | 
| 
60298
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
256  | 
|
| 
60288
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
257  | 
lemmas [elims] =  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
258  | 
      impCE  --  \<open>@{thm impCE}\<close>
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
259  | 
      conjE  --  \<open>@{thm conjE}\<close>
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
260  | 
      disjE  --  \<open>@{thm disjE}\<close>
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
261  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
262  | 
lemma "(A \<or> B) \<and> (A \<longrightarrow> C) \<and> (B \<longrightarrow> C) \<longrightarrow> C"  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
263  | 
by prop_solver  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
264  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
265  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
266  | 
chapter \<open>The match method \label{s:matching}\<close>
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
267  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
268  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
269  | 
So far we have seen methods defined as simple combinations of other methods.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
270  | 
Some familiar programming language concepts have been introduced (i.e.\  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
271  | 
abstraction and recursion). The only control flow has been implicitly the  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
272  | 
result of backtracking. When designing more sophisticated proof methods this  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
273  | 
proves too restrictive and difficult to manage conceptually.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
274  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
275  | 
  To address this, we introduce the @{method_def "match"} method, which
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
276  | 
provides more direct access to the higher-order matching facility at the  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
277  | 
core of Isabelle. It is implemented as a separate proof method (in  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
278  | 
Isabelle/ML), and thus can be directly applied to proofs, however it is most  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
279  | 
useful when applied in the context of writing Eisbach method definitions.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
280  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
281  | 
\medskip The syntax diagram below refers to some syntactic categories that  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
282  | 
  are further defined in @{cite "isabelle-isar-ref"}.
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
283  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
284  | 
  @{rail \<open>
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
285  | 
    @@{method match} kind @'in' (pattern '\<Rightarrow>' cartouche + '\<bar>')
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
286  | 
;  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
287  | 
kind:  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
288  | 
      (@'conclusion' | @'premises' ('(' 'local' ')')? |
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
289  | 
       '(' term ')' | @{syntax thmrefs})
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
290  | 
;  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
291  | 
pattern: fact_name? term args? \<newline> (@'for' fixes)?  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
292  | 
;  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
293  | 
    fact_name: @{syntax name} @{syntax attributes}? ':'
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
294  | 
;  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
295  | 
    args: '(' (('multi' | 'cut' nat?) + ',') ')'
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
296  | 
\<close>}  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
297  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
298  | 
Matching allows methods to introspect the goal state, and to implement more  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
299  | 
  explicit control flow. In the basic case, a term or fact @{text ts} is given
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
300  | 
  to match against as a \emph{match target}, along with a collection of
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
301  | 
  pattern-method pairs @{text "(p, m)"}: roughly speaking, when the pattern
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
302  | 
  @{text p} matches any member of @{text ts}, the \emph{inner} method @{text
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
303  | 
m} will be executed.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
304  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
305  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
306  | 
lemma  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
307  | 
assumes X:  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
308  | 
"Q \<longrightarrow> P"  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
309  | 
"Q"  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
310  | 
shows P  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
311  | 
by (match X in I: "Q \<longrightarrow> P" and I': "Q" \<Rightarrow> \<open>insert mp [OF I I']\<close>)  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
312  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
313  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
314  | 
In this example we have a structured Isar proof, with the named  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
315  | 
  assumption @{text "X"} and a conclusion @{term "P"}. With the match method
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
316  | 
  we can find the local facts @{term "Q \<longrightarrow> P"} and @{term "Q"}, binding them to
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
317  | 
  separately as @{text "I"} and @{text "I'"}. We then specialize the
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
318  | 
  modus-ponens rule @{thm mp [of Q P]} to these facts to solve the goal.
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
319  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
320  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
321  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
322  | 
section \<open>Subgoal focus\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
323  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
324  | 
text\<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
325  | 
In the previous example we were able to match against an assumption out of  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
326  | 
the Isar proof state. In general, however, proof subgoals can be  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
327  | 
  \emph{unstructured}, with goal parameters and premises arising from rule
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
328  | 
  application. To address this, @{method match} uses \emph{subgoal focusing}
 | 
| 
60298
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
329  | 
to produce structured goals out of  | 
| 
60288
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
330  | 
unstructured ones. In place of fact or term, we may give the  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
331  | 
  keyword @{keyword_def "premises"} as the match target. This causes a subgoal
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
332  | 
focus on the first subgoal, lifting local goal parameters to fixed term  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
333  | 
variables and premises into hypothetical theorems. The match is performed  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
334  | 
against these theorems, naming them and binding them as appropriate.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
335  | 
  Similarly giving the keyword @{keyword_def "conclusion"} matches against the
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
336  | 
conclusion of the first subgoal.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
337  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
338  | 
An unstructured version of the previous example can then be similarly solved  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
339  | 
through focusing.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
340  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
341  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
342  | 
lemma "Q \<longrightarrow> P \<Longrightarrow> Q \<Longrightarrow> P"  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
343  | 
by (match premises in  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
344  | 
I: "Q \<longrightarrow> P" and I': "Q" \<Rightarrow> \<open>insert mp [OF I I']\<close>)  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
345  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
346  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
347  | 
  Match variables may be specified by giving a list of @{keyword_ref
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
348  | 
"for"}-fixes after the pattern description. This marks those terms as bound  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
349  | 
variables, which may be used in the method body.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
350  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
351  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
352  | 
lemma "Q \<longrightarrow> P \<Longrightarrow> Q \<Longrightarrow> P"  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
353  | 
by (match premises in I: "Q \<longrightarrow> A" and I': "Q" for A \<Rightarrow>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
354  | 
\<open>match conclusion in A \<Rightarrow> \<open>insert mp [OF I I']\<close>\<close>)  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
355  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
356  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
357  | 
  In this example @{term A} is a match variable which is bound to @{term P}
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
358  | 
  upon a successful match. The inner @{method match} then matches the
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
359  | 
  now-bound @{term A} (bound to @{term P}) against the conclusion (also @{term
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
360  | 
P}), finally applying the specialized rule to solve the goal.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
361  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
362  | 
  Schematic terms like @{text "?P"} may also be used to specify match
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
363  | 
variables, but the result of the match is not bound, and thus cannot be used  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
364  | 
in the inner method body.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
365  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
366  | 
\medskip In the following example we extract the predicate of an  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
367  | 
existentially quantified conclusion in the current subgoal and search the  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
368  | 
current premises for a matching fact. If both matches are successful, we  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
369  | 
then instantiate the existential introduction rule with both the witness and  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
370  | 
predicate, solving with the matched premise.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
371  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
372  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
373  | 
method solve_ex =  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
374  | 
(match conclusion in "\<exists>x. Q x" for Q \<Rightarrow>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
375  | 
\<open>match premises in U: "Q y" for y \<Rightarrow>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
376  | 
\<open>rule exI [where P = Q and x = y, OF U]\<close>\<close>)  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
377  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
378  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
379  | 
  The first @{method match} matches the pattern @{term "\<exists>x. Q x"} against the
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
380  | 
  current conclusion, binding the term @{term "Q"} in the inner match. Next
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
381  | 
  the pattern @{text "Q y"} is matched against all premises of the current
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
382  | 
  subgoal. In this case @{term "Q"} is fixed and @{term "y"} may be
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
383  | 
  instantiated. Once a match is found, the local fact @{text U} is bound to
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
384  | 
  the matching premise and the variable @{term "y"} is bound to the matching
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
385  | 
  witness. The existential introduction rule @{text "exI:"}~@{thm exI} is then
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
386  | 
  instantiated with @{term "y"} as the witness and @{term "Q"} as the
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
387  | 
predicate, with its proof obligation solved by the local fact U (using the  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
388  | 
  Isar attribute @{attribute OF}). The following example is a trivial use of
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
389  | 
this method.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
390  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
391  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
392  | 
lemma "halts p \<Longrightarrow> \<exists>x. halts x"  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
393  | 
by solve_ex  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
394  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
395  | 
|
| 
60298
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
396  | 
subsection \<open>Operating within a focus\<close>  | 
| 
60288
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
397  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
398  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
399  | 
Subgoal focusing provides a structured form of a subgoal, allowing for more  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
400  | 
expressive introspection of the goal state. This requires some consideration  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
401  | 
  in order to be used effectively. When the keyword @{keyword "premises"} is
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
402  | 
given as the match target, the premises of the subgoal are lifted into  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
403  | 
hypothetical theorems, which can be found and named via match patterns.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
404  | 
Additionally these premises are stripped from the subgoal, leaving only the  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
405  | 
conclusion. This renders them inaccessible to standard proof methods which  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
406  | 
  operate on the premises, such as @{method frule} or @{method erule}. Naive
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
407  | 
usage of these methods within a match will most likely not function as the  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
408  | 
method author intended.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
409  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
410  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
411  | 
method my_allE_bad for y :: 'a =  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
412  | 
(match premises in I: "\<forall>x :: 'a. ?Q x" \<Rightarrow>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
413  | 
\<open>erule allE [where x = y]\<close>)  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
414  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
415  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
416  | 
  Here we take a single parameter @{term y} and specialize the universal
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
417  | 
  elimination rule (@{thm allE}) to it, then attempt to apply this specialized
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
418  | 
  rule with @{method erule}. The method @{method erule} will attempt to unify
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
419  | 
  with a universal quantifier in the premises that matches the type of @{term
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
420  | 
  y}. Since @{keyword "premises"} causes a focus, however, there are no
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
421  | 
  subgoal premises to be found and thus @{method my_allE_bad} will always
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
422  | 
fail. If focusing instead left the premises in place, using methods  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
423  | 
  like @{method erule} would lead to unintended behaviour, specifically during
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
424  | 
  backtracking. In our example, @{method erule} could choose an alternate
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
425  | 
  premise while backtracking, while leaving @{text I} bound to the original
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
426  | 
  match. In the case of more complex inner methods, where either @{text I} or
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
427  | 
bound terms are used, this would almost certainly not be the intended  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
428  | 
behaviour.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
429  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
430  | 
An alternative implementation would be to specialize the elimination rule to  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
431  | 
the bound term and apply it directly.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
432  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
433  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
434  | 
method my_allE_almost for y :: 'a =  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
435  | 
(match premises in I: "\<forall>x :: 'a. ?Q x" \<Rightarrow>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
436  | 
\<open>rule allE [where x = y, OF I]\<close>)  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
437  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
438  | 
lemma "\<forall>x. P x \<Longrightarrow> P y"  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
439  | 
by (my_allE_almost y)  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
440  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
441  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
442  | 
This method will insert a specialized duplicate of a universally quantified  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
443  | 
premise. Although this will successfully apply in the presence of such a  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
444  | 
premise, it is not likely the intended behaviour. Repeated application of  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
445  | 
this method will produce an infinite stream of duplicate specialized  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
446  | 
premises, due to the original premise never being removed. To address this,  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
447  | 
  matched premises may be declared with the @{attribute "thin"} attribute.
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
448  | 
This will hide the premise from subsequent inner matches, and remove it from  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
449  | 
the list of premises when the inner method has finished and the subgoal is  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
450  | 
  unfocused. It can be considered analogous to the existing @{text thin_tac}.
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
451  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
452  | 
To complete our example, the correct implementation of the method  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
453  | 
  will @{attribute "thin"} the premise from the match and then apply it to the
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
454  | 
specialized elimination rule.\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
455  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
456  | 
method my_allE for y :: 'a =  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
457  | 
(match premises in I [thin]: "\<forall>x :: 'a. ?Q x" \<Rightarrow>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
458  | 
\<open>rule allE [where x = y, OF I]\<close>)  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
459  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
460  | 
lemma "\<forall>x. P x \<Longrightarrow> \<forall>x. Q x \<Longrightarrow> P y \<and> Q y"  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
461  | 
by (my_allE y)+ (rule conjI)  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
462  | 
|
| 
60298
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
463  | 
subsubsection \<open>Inner focusing\<close>  | 
| 
60288
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
464  | 
|
| 
60298
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
465  | 
text \<open>  | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
466  | 
  Premises are \emph{accumulated} for the purposes of subgoal focusing.
 | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
467  | 
  In contrast to using standard methods like @{method frule} within
 | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
468  | 
  focused match, another @{method match} will have access to all the premises
 | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
469  | 
of the outer focus.  | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
470  | 
\<close>  | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
471  | 
|
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
472  | 
lemma "A \<Longrightarrow> B \<Longrightarrow> A \<and> B"  | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
473  | 
by (match premises in H: A \<Rightarrow> \<open>intro conjI, rule H,  | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
474  | 
match premises in H': B \<Rightarrow> \<open>rule H'\<close>\<close>)  | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
475  | 
|
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
476  | 
text \<open>  | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
477  | 
  In this example, the inner @{method match} can find the focused premise
 | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
478  | 
  @{term B}. In contrast, the @{method assumption} method would fail here
 | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
479  | 
  due to @{term B} not being logically accessible.
 | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
480  | 
\<close>  | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
481  | 
|
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
482  | 
lemma  | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
483  | 
"A \<Longrightarrow> A \<and> (B \<longrightarrow> B)"  | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
484  | 
by (match premises in H: A \<Rightarrow> \<open>intro conjI, rule H, rule impI,  | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
485  | 
match premises (local) in A \<Rightarrow> \<open>fail\<close>  | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
486  | 
\<bar> H': B \<Rightarrow> \<open>rule H'\<close>\<close>)  | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
487  | 
|
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
488  | 
text \<open>  | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
489  | 
In this example, the only premise that exists in the first focus is  | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
490  | 
  @{term "A"}. Prior to the inner match, the rule @{text impI} changes
 | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
491  | 
  the goal @{term "B \<longrightarrow> B"} into @{term "B \<Longrightarrow> B"}. A standard premise
 | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
492  | 
  match would also include @{term A} as an original premise of the outer
 | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
493  | 
  match. The @{text local} argument limits the match to
 | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
494  | 
newly focused premises.  | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
495  | 
|
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
496  | 
\<close>  | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
497  | 
|
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
498  | 
section \<open>Attributes\<close>  | 
| 
60288
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
499  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
500  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
501  | 
Attributes may throw errors when applied to a given fact. For example, rule  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
502  | 
instantiation will fail of there is a type mismatch or if a given variable  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
503  | 
doesn't exist. Within a match or a method definition, it isn't generally  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
504  | 
possible to guarantee that applied attributes won't fail. For example, in  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
505  | 
the following method there is no guarantee that the two provided facts will  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
506  | 
necessarily compose.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
507  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
508  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
509  | 
method my_compose uses rule1 rule2 =  | 
| 
60298
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
510  | 
(rule rule1 [OF rule2])  | 
| 
60288
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
511  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
512  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
513  | 
  Some attributes (like @{attribute OF}) have been made partially
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
514  | 
Eisbach-aware. This means that they are able to form a closure despite not  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
515  | 
  necessarily always being applicable. In the case of @{attribute OF}, it is
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
516  | 
up to the proof author to guard attribute application with an appropriate  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
517  | 
  @{method match}, but there are still no static guarantees.
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
518  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
519  | 
  In contrast to @{attribute OF}, the @{attribute "where"} and @{attribute of}
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
520  | 
attributes attempt to provide static guarantees that they will apply  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
521  | 
whenever possible.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
522  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
523  | 
Within a match pattern for a fact, each outermost quantifier specifies the  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
524  | 
requirement that a matching fact must have a schematic variable at that  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
525  | 
point. This gives a corresponding name to this ``slot'' for the purposes of  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
526  | 
  forming a static closure, allowing the @{attribute "where"} attribute to
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
527  | 
perform an instantiation at run-time.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
528  | 
\<close>  | 
| 
60298
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
529  | 
text_raw\<open>\vbox{\<close>
 | 
| 
60288
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
530  | 
lemma  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
531  | 
assumes A: "Q \<Longrightarrow> False"  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
532  | 
shows "\<not> Q"  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
533  | 
by (match intros in X: "\<And>P. (P \<Longrightarrow> False) \<Longrightarrow> \<not> P" \<Rightarrow>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
534  | 
\<open>rule X [where P = Q, OF A]\<close>)  | 
| 
60298
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
535  | 
text_raw\<open>}\<close>  | 
| 
60288
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
536  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
537  | 
Subgoal focusing converts the outermost quantifiers of premises into  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
538  | 
schematics when lifting them to hypothetical facts. This allows us to  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
539  | 
  instantiate them with @{attribute "where"} when using an appropriate match
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
540  | 
pattern.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
541  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
542  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
543  | 
lemma "(\<And>x :: 'a. A x \<Longrightarrow> B x) \<Longrightarrow> A y \<Longrightarrow> B y"  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
544  | 
by (match premises in I: "\<And>x :: 'a. ?P x \<Longrightarrow> ?Q x" \<Rightarrow>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
545  | 
\<open>rule I [where x = y]\<close>)  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
546  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
547  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
548  | 
  The @{attribute of} attribute behaves similarly. It is worth noting,
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
549  | 
  however, that the positional instantiation of @{attribute of} occurs against
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
550  | 
  the position of the variables as they are declared \emph{in the match
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
551  | 
pattern}.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
552  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
553  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
554  | 
lemma  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
555  | 
fixes A B and x :: 'a and y :: 'b  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
556  | 
assumes asm: "(\<And>x y. A y x \<Longrightarrow> B x y )"  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
557  | 
shows "A y x \<Longrightarrow> B x y"  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
558  | 
by (match asm in I: "\<And>(x :: 'a) (y :: 'b). ?P x y \<Longrightarrow> ?Q x y" \<Rightarrow>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
559  | 
\<open>rule I [of x y]\<close>)  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
560  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
561  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
562  | 
  In this example, the order of schematics in @{text asm} is actually @{text
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
563  | 
"?y ?x"}, but we instantiate our matched rule in the opposite order. This is  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
564  | 
  because the effective rule @{term I} was bound from the match, which
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
565  | 
  declared the @{typ 'a} slot first and the @{typ 'b} slot second.
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
566  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
567  | 
  To get the dynamic behaviour of @{attribute of} we can choose to invoke it
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
568  | 
  \emph{unchecked}. This avoids trying to do any type inference for the
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
569  | 
provided parameters, instead storing them as their most general type and  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
570  | 
  doing type matching at run-time. This, like @{attribute OF}, will throw
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
571  | 
errors if the expected slots don't exist or there is a type mismatch.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
572  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
573  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
574  | 
lemma  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
575  | 
fixes A B and x :: 'a and y :: 'b  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
576  | 
assumes asm: "\<And>x y. A y x \<Longrightarrow> B x y"  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
577  | 
shows "A y x \<Longrightarrow> B x y"  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
578  | 
by (match asm in I: "PROP ?P" \<Rightarrow> \<open>rule I [of (unchecked) y x]\<close>)  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
579  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
580  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
581  | 
Attributes may be applied to matched facts directly as they are matched. Any  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
582  | 
declarations will therefore be applied in the context of the inner method,  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
583  | 
as well as any transformations to the rule.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
584  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
585  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
586  | 
lemma "(\<And>x :: 'a. A x \<Longrightarrow> B x) \<Longrightarrow> A y \<longrightarrow> B y"  | 
| 
60298
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
587  | 
by (match premises in I [of y, intros]: "\<And>x :: 'a. ?P x \<Longrightarrow> ?Q x" \<Rightarrow>  | 
| 
60288
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
588  | 
\<open>prop_solver\<close>)  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
589  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
590  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
591  | 
  In this example, the pattern @{text "\<And>x :: 'a. ?P x \<Longrightarrow> ?Q x"} matches against
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
592  | 
  the only premise, giving an appropriately typed slot for @{term y}. After
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
593  | 
  the match, the resulting rule is instantiated to @{term y} and then declared
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
594  | 
  as an @{attribute intros} rule. This is then picked up by @{method
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
595  | 
prop_solver} to solve the goal.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
596  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
597  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
598  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
599  | 
section \<open>Multi-match \label{sec:multi}\<close>
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
600  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
601  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
602  | 
  In all previous examples, @{method match} was only ever searching for a
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
603  | 
single rule or premise. Each local fact would therefore always have a length  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
604  | 
  of exactly one. We may, however, wish to find \emph{all} matching results.
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
605  | 
  To achieve this, we can simply mark a given pattern with the @{text
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
606  | 
"(multi)"} argument.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
607  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
608  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
609  | 
lemma  | 
| 
60298
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
610  | 
assumes asms: "A \<Longrightarrow> B" "A \<Longrightarrow> D"  | 
| 
60288
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
611  | 
shows "(A \<longrightarrow> B) \<and> (A \<longrightarrow> D)"  | 
| 
60298
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
612  | 
apply (match asms in I [intros]: "?P \<Longrightarrow> ?Q" \<Rightarrow> \<open>solves \<open>prop_solver\<close>\<close>)?  | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
613  | 
apply (match asms in I [intros]: "?P \<Longrightarrow> ?Q" (multi) \<Rightarrow> \<open>prop_solver\<close>)  | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
614  | 
done  | 
| 
60288
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
615  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
616  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
617  | 
  In the first @{method match}, without the @{text "(multi)"} argument, @{term
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
618  | 
  I} is only ever be bound to one of the members of @{text asms}. This
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
619  | 
backtracks over both possibilities (see next section), however neither  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
620  | 
assumption in isolation is sufficient to solve to goal. The use of the  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
621  | 
  @{method solves} combinator ensures that @{method prop_solver} has no effect
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
622  | 
on the goal when it doesn't solve it, and so the first match leaves the goal  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
623  | 
  unchanged. In the second @{method match}, @{text I} is bound to all of
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
624  | 
  @{text asms}, declaring both results as @{text intros}. With these rules
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
625  | 
  @{method prop_solver} is capable of solving the goal.
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
626  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
627  | 
Using for-fixed variables in patterns imposes additional constraints on the  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
628  | 
  results. In all previous examples, the choice of using @{text ?P} or a
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
629  | 
  for-fixed @{term P} only depended on whether or not @{term P} was mentioned
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
630  | 
in another pattern or the inner method. When using a multi-match, however,  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
631  | 
all for-fixed terms must agree in the results.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
632  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
633  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
634  | 
lemma  | 
| 
60298
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
635  | 
assumes asms: "A \<Longrightarrow> B" "A \<Longrightarrow> D" "D \<Longrightarrow> B"  | 
| 
60288
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
636  | 
shows "(A \<longrightarrow> B) \<and> (A \<longrightarrow> D)"  | 
| 
60298
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
637  | 
apply (match asms in I [intros]: "?P \<Longrightarrow> Q" (multi) for Q \<Rightarrow>  | 
| 
60288
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
638  | 
\<open>solves \<open>prop_solver\<close>\<close>)?  | 
| 
60298
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
639  | 
apply (match asms in I [intros]: "P \<Longrightarrow> ?Q" (multi) for P \<Rightarrow>  | 
| 
60288
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
640  | 
\<open>prop_solver\<close>)  | 
| 
60298
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
641  | 
done  | 
| 
60288
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
642  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
643  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
644  | 
  Here we have two seemingly-equivalent applications of @{method match},
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
645  | 
however only the second one is capable of solving the goal. The first  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
646  | 
  @{method match} selects the first and third members of @{text asms} (those
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
647  | 
that agree on their conclusion), which is not sufficient. The second  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
648  | 
  @{method match} selects the first and second members of @{text asms} (those
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
649  | 
  that agree on their assumption), which is enough for @{method prop_solver}
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
650  | 
to solve the goal.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
651  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
652  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
653  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
654  | 
section \<open>Dummy patterns\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
655  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
656  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
657  | 
Dummy patterns may be given as placeholders for unique schematics in  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
658  | 
patterns. They implicitly receive all currently bound variables as  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
659  | 
  arguments, and are coerced into the @{typ prop} type whenever possible. For
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
660  | 
  example, the trivial dummy pattern @{text "_"} will match any proposition.
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
661  | 
  In contrast, by default the pattern @{text "?P"} is considered to have type
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
662  | 
  @{typ bool}. It will not bind anything with meta-logical connectives (e.g.
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
663  | 
  @{text "_ \<Longrightarrow> _"} or @{text "_ &&& _"}).
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
664  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
665  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
666  | 
lemma  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
667  | 
assumes asms: "A &&& B \<Longrightarrow> D"  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
668  | 
shows "(A \<and> B \<longrightarrow> D)"  | 
| 
60298
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
669  | 
by (match asms in I: _ \<Rightarrow> \<open>prop_solver intros: I conjunctionI\<close>)  | 
| 
60288
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
670  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
671  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
672  | 
section \<open>Backtracking\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
673  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
674  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
675  | 
  Patterns are considered top-down, executing the inner method @{text m} of
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
676  | 
the first pattern which is satisfied by the current match target. By  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
677  | 
default, matching performs extensive backtracking by attempting all valid  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
678  | 
variable and fact bindings according to the given pattern. In particular,  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
679  | 
all unifiers for a given pattern will be explored, as well as each matching  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
680  | 
  fact. The inner method @{text m} will be re-executed for each different
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
681  | 
variable/fact binding during backtracking. A successful match is considered  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
682  | 
a cut-point for backtracking. Specifically, once a match is made no other  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
683  | 
pattern-method pairs will be considered.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
684  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
685  | 
  The method @{text foo} below fails for all goals that are conjunctions. Any
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
686  | 
such goal will match the first pattern, causing the second pattern (that  | 
| 
60298
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
687  | 
would otherwise match all goals) to never be considered.  | 
| 
60288
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
688  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
689  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
690  | 
method foo =  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
691  | 
(match conclusion in "?P \<and> ?Q" \<Rightarrow> \<open>fail\<close> \<bar> "?R" \<Rightarrow> \<open>prop_solver\<close>)  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
692  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
693  | 
text \<open>  | 
| 
60298
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
694  | 
The failure of an inner method that is executed after a successful match  | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
695  | 
will cause the entire match to fail. This distinction is important  | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
696  | 
due to the pervasive use of backtracking. When a method is used in a  | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
697  | 
combinator chain, its failure  | 
| 
60288
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
698  | 
becomes significant because it signals previously applied methods to move to  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
699  | 
  the next result. Therefore, it is necessary for @{method match} to not mask
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
700  | 
  such failure. One can always rewrite a match using the combinators ``@{text
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
701  | 
  "?"}'' and ``@{text "|"}'' to try subsequent patterns in the case of an
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
702  | 
inner-method failure. The following proof method, for example, always  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
703  | 
  invokes @{method prop_solver} for all goals because its first alternative
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
704  | 
either never matches or (if it does match) always fails.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
705  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
706  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
707  | 
method foo\<^sub>1 =  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
708  | 
(match conclusion in "?P \<and> ?Q" \<Rightarrow> \<open>fail\<close>) |  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
709  | 
(match conclusion in "?R" \<Rightarrow> \<open>prop_solver\<close>)  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
710  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
711  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
712  | 
subsection \<open>Cut\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
713  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
714  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
715  | 
Backtracking may be controlled more precisely by marking individual patterns  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
716  | 
  as \emph{cut}. This causes backtracking to not progress beyond this pattern:
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
717  | 
once a match is found no others will be considered.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
718  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
719  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
720  | 
method foo\<^sub>2 =  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
721  | 
(match premises in I: "P \<and> Q" (cut) and I': "P \<longrightarrow> ?U" for P Q \<Rightarrow>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
722  | 
\<open>rule mp [OF I' I [THEN conjunct1]]\<close>)  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
723  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
724  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
725  | 
  In this example, once a conjunction is found (@{term "P \<and> Q"}), all possible
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
726  | 
  implications of @{term "P"} in the premises are considered, evaluating the
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
727  | 
  inner @{method rule} with each consequent. No other conjunctions will be
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
728  | 
considered, with method failure occurring once all implications of the  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
729  | 
  form @{text "P \<longrightarrow> ?U"} have been explored. Here the left-right processing of
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
730  | 
individual patterns is important, as all patterns after of the cut will  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
731  | 
maintain their usual backtracking behaviour.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
732  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
733  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
734  | 
lemma "A \<and> B \<Longrightarrow> A \<longrightarrow> D \<Longrightarrow> A \<longrightarrow> C \<Longrightarrow> C"  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
735  | 
by foo\<^sub>2  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
736  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
737  | 
lemma "C \<and> D \<Longrightarrow> A \<and> B \<Longrightarrow> A \<longrightarrow> C \<Longrightarrow> C"  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
738  | 
by (foo\<^sub>2 | prop_solver)  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
739  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
740  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
741  | 
  In this example, the first lemma is solved by @{text foo\<^sub>2}, by first
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
742  | 
  picking @{term "A \<longrightarrow> D"} for @{text I'}, then backtracking and ultimately
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
743  | 
  succeeding after picking @{term "A \<longrightarrow> C"}. In the second lemma, however,
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
744  | 
  @{term "C \<and> D"} is matched first, the second pattern in the match cannot be
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
745  | 
  found and so the method fails, falling through to @{method prop_solver}.
 | 
| 
60298
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
746  | 
|
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
747  | 
More precise control is also possible by giving a positive  | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
748  | 
  number @{text n} as an argument to @{text cut}. This will limit the number
 | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
749  | 
  of backtracking results of that match to be at most @{text n}.
 | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
750  | 
  The match argument @{text "(cut 1)"} is the same as simply @{text "(cut)"}.
 | 
| 
60288
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
751  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
752  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
753  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
754  | 
subsection \<open>Multi-match revisited\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
755  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
756  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
757  | 
A multi-match will produce a sequence of potential bindings for for-fixed  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
758  | 
variables, where each binding environment is the result of matching against  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
759  | 
at least one element from the match target. For each environment, the match  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
760  | 
result will be all elements of the match target which agree with the pattern  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
761  | 
under that environment. This can result in unexpected behaviour when giving  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
762  | 
very general patterns.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
763  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
764  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
765  | 
lemma  | 
| 
60298
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
766  | 
assumes asms: "\<And>x. A x \<and> B x" "\<And>y. A y \<and> C y" "\<And>z. B z \<and> C z"  | 
| 
60288
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
767  | 
shows "A x \<and> C x"  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
768  | 
by (match asms in I: "\<And>x. P x \<and> ?Q x" (multi) for P \<Rightarrow>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
769  | 
\<open>match (P) in "A" \<Rightarrow> \<open>fail\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
770  | 
\<bar> _ \<Rightarrow> \<open>match I in "\<And>x. A x \<and> B x" \<Rightarrow> \<open>fail\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
771  | 
\<bar> _ \<Rightarrow> \<open>rule I\<close>\<close>\<close>)  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
772  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
773  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
774  | 
Intuitively it seems like this proof should fail to check. The first match  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
775  | 
  result, which binds @{term I} to the first two members of @{text asms},
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
776  | 
  fails the second inner match due to binding @{term P} to @{term A}.
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
777  | 
  Backtracking then attempts to bind @{term I} to the third member of @{text
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
778  | 
  asms}. This passes all inner matches, but fails when @{method rule} cannot
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
779  | 
successfully apply this to the current goal. After this, a valid match that  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
780  | 
  is produced by the unifier is one which binds @{term P} to simply @{text
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
781  | 
  "\<lambda>a. A ?x"}. The first inner match succeeds because @{text "\<lambda>a. A ?x"} does
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
782  | 
  not match @{term A}. The next inner match succeeds because @{term I} has
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
783  | 
  only been bound to the first member of @{text asms}. This is due to @{method
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
784  | 
  match} considering @{text "\<lambda>a. A ?x"} and @{text "\<lambda>a. A ?y"} as distinct
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
785  | 
terms.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
786  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
787  | 
The simplest way to address this is to explicitly disallow term bindings  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
788  | 
which we would consider invalid.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
789  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
790  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
791  | 
method abs_used for P =  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
792  | 
(match (P) in "\<lambda>a. ?P" \<Rightarrow> \<open>fail\<close> \<bar> _ \<Rightarrow> \<open>-\<close>)  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
793  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
794  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
795  | 
This method has no effect on the goal state, but instead serves as a filter  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
796  | 
on the environment produced from match.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
797  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
798  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
799  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
800  | 
section \<open>Uncurrying\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
801  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
802  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
803  | 
  The @{method match} method is not aware of the logical content of match
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
804  | 
targets. Each pattern is simply matched against the shallow structure of a  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
805  | 
  fact or term. Most facts are in \emph{normal form}, which curries premises
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
806  | 
  via meta-implication @{text "_ \<Longrightarrow> _"}.
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
807  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
808  | 
|
| 
60298
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
809  | 
text_raw \<open>\vbox{\<close>
 | 
| 
60288
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
810  | 
lemma  | 
| 
60298
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
811  | 
assumes asms: "D \<Longrightarrow> B \<Longrightarrow> C" "D \<Longrightarrow> A"  | 
| 
60288
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
812  | 
shows "D \<Longrightarrow> B \<Longrightarrow> C \<and> A"  | 
| 
60298
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
813  | 
by (match asms in H: "D \<Longrightarrow> _" (multi) \<Rightarrow> \<open>prop_solver elims: H\<close>)  | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
814  | 
text_raw \<open>}\<close>  | 
| 
60288
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
815  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
816  | 
  For the first member of @{text asms} the dummy pattern successfully matches
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
817  | 
  against @{term "B \<Longrightarrow> C"} and so the proof is successful.
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
818  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
819  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
820  | 
lemma  | 
| 
60298
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
821  | 
assumes asms: "A \<Longrightarrow> B \<Longrightarrow> C" "D \<Longrightarrow> C"  | 
| 
60288
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
822  | 
shows "D \<or> (A \<and> B) \<Longrightarrow> C"  | 
| 
60298
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
823  | 
apply (match asms in H: "_ \<Longrightarrow> C" (multi) \<Rightarrow> \<open>prop_solver elims: H\<close>)(*<*)?  | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
824  | 
apply (prop_solver elims: asms)  | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
825  | 
done(*>*)  | 
| 
60288
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
826  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
827  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
828  | 
This proof will fail to solve the goal. Our match pattern will only match  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
829  | 
  rules which have a single premise, and conclusion @{term C}, so the first
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
830  | 
  member of @{text asms} is not bound and thus the proof fails. Matching a
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
831  | 
  pattern of the form @{term "P \<Longrightarrow> Q"} against this fact will bind @{term "P"}
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
832  | 
  to @{term "A"} and @{term Q} to @{term "B \<Longrightarrow> C"}. Our pattern, with a
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
833  | 
  concrete @{term "C"} in the conclusion, will fail to match this fact.
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
834  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
835  | 
  To express our desired match, we may \emph{uncurry} our rules before
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
836  | 
matching against them. This forms a meta-conjunction of all premises in a  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
837  | 
fact, so that only one implication remains. For example the uncurried  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
838  | 
  version of @{term "A \<Longrightarrow> B \<Longrightarrow> C"} is @{term "A &&& B \<Longrightarrow> C"}. This will now match
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
839  | 
  our desired pattern @{text "_ \<Longrightarrow> C"}, and can be \emph{curried} after the
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
840  | 
match to put it back into normal form.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
841  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
842  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
843  | 
lemma  | 
| 
60298
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
844  | 
assumes asms: "A \<Longrightarrow> B \<Longrightarrow> C" "D \<Longrightarrow> C"  | 
| 
60288
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
845  | 
shows "D \<or> (A \<and> B) \<Longrightarrow> C"  | 
| 
60298
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
846  | 
by (match asms [uncurry] in H [curry]: "_ \<Longrightarrow> C" (multi) \<Rightarrow>  | 
| 
60288
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
847  | 
\<open>prop_solver elims: H\<close>)  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
848  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
849  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
850  | 
section \<open>Reverse matching\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
851  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
852  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
853  | 
  The @{method match} method only attempts to perform matching of the pattern
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
854  | 
against the match target. Specifically this means that it will not  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
855  | 
instantiate schematic terms in the match target.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
856  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
857  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
858  | 
lemma  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
859  | 
assumes asms: "\<And>x :: 'a. A x"  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
860  | 
shows "A y"  | 
| 
60298
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
861  | 
apply (match asms in H: "A y" \<Rightarrow> \<open>rule H\<close>)?  | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
862  | 
apply (match asms in H: P for P \<Rightarrow>  | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
863  | 
          \<open>match ("A y") in P \<Rightarrow> \<open>rule H\<close>\<close>)
 | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
864  | 
done  | 
| 
60288
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
865  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
866  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
867  | 
  In the first @{method match} we attempt to find a member of @{text asms}
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
868  | 
which matches our goal precisely. This fails due to no such member existing.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
869  | 
The second match reverses the role of the fact in the match, by first giving  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
870  | 
  a general pattern @{term P}. This bound pattern is then matched against
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
871  | 
  @{term "A y"}. In this case, @{term P} is bound to @{text "A ?x"} and so it
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
872  | 
successfully matches.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
873  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
874  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
875  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
876  | 
section \<open>Type matching\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
877  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
878  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
879  | 
  The rule instantiation attributes @{attribute "where"} and @{attribute "of"}
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
880  | 
attempt to guarantee type-correctness wherever possible. This can require  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
881  | 
  additional invocations of @{method match} in order to statically ensure that
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
882  | 
instantiation will succeed.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
883  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
884  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
885  | 
lemma  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
886  | 
assumes asms: "\<And>x :: 'a. A x"  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
887  | 
shows "A y"  | 
| 
60298
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
888  | 
by (match asms in H: "\<And>z :: 'b. P z" for P \<Rightarrow>  | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
889  | 
\<open>match (y) in "y :: 'b" for y \<Rightarrow> \<open>rule H [where z = y]\<close>\<close>)  | 
| 
60288
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
890  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
891  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
892  | 
  In this example the type @{text 'b} is matched to @{text 'a}, however
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
893  | 
  statically they are formally distinct types. The first match binds @{text
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
894  | 
  'b} while the inner match serves to coerce @{term y} into having the type
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
895  | 
  @{text 'b}. This allows the rule instantiation to successfully apply.
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
896  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
897  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
898  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
899  | 
chapter \<open>Method development\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
900  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
901  | 
section \<open>Tracing methods\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
902  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
903  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
904  | 
  Method tracing is supported by auxiliary print methods provided by @{theory
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
905  | 
  Eisbach_Tools}. These include @{method print_fact}, @{method print_term} and
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
906  | 
  @{method print_type}. Whenever a print method is evaluated it leaves the
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
907  | 
goal unchanged and writes its argument as tracing output.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
908  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
909  | 
  Print methods can be combined with the @{method fail} method to investigate
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
910  | 
the backtracking behaviour of a method.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
911  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
912  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
913  | 
lemma  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
914  | 
assumes asms: A B C D  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
915  | 
shows D  | 
| 
60298
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
916  | 
apply (match asms in H: _ \<Rightarrow> \<open>print_fact H, fail\<close>)(*<*)?  | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
917  | 
apply (simp add: asms)  | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
918  | 
done(*>*)  | 
| 
60288
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
919  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
920  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
921  | 
This proof will fail, but the tracing output will show the order that the  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
922  | 
assumptions are attempted.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
923  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
924  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
925  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
926  | 
section \<open>Integrating with Isabelle/ML\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
927  | 
|
| 
60298
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
928  | 
subsubsection \<open>Attributes\<close>  | 
| 
60288
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
929  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
930  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
931  | 
A custom rule attribute is a simple way to extend the functionality of  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
932  | 
  Eisbach methods. The dummy rule attribute notation (@{text "[[ _ ]]"})
 | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
933  | 
invokes the given attribute against a dummy fact and evaluates to the result  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
934  | 
of that attribute. When used as a match target, this can serve as an  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
935  | 
effective auxiliary function.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
936  | 
\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
937  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
938  | 
attribute_setup get_split_rule =  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
939  | 
\<open>Args.term >> (fn t =>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
940  | 
Thm.rule_attribute (fn context => fn _ =>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
941  | 
(case get_split_rule (Context.proof_of context) t of  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
942  | 
SOME thm => thm  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
943  | 
| NONE => Drule.dummy_thm)))\<close>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
944  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
945  | 
text \<open>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
946  | 
  In this example, the new attribute @{attribute get_split_rule} lifts the ML
 | 
| 
60298
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
947  | 
function of the same name into an attribute. When applied to a case  | 
| 
60288
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
948  | 
distinction over a datatype, it retrieves its corresponding split rule.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
949  | 
|
| 
60298
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
950  | 
We can then integrate this intro a method that applies the split rule, first  | 
| 
60288
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
951  | 
matching to ensure that fetching the rule was successful.  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
952  | 
\<close>  | 
| 
60298
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
953  | 
(*<*)declare TrueI [intros](*>*)  | 
| 
60288
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
954  | 
method splits =  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
955  | 
(match conclusion in "?P f" for f \<Rightarrow>  | 
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
956  | 
\<open>match [[get_split_rule f]] in U: "(_ :: bool) = _" \<Rightarrow>  | 
| 
60298
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
957  | 
\<open>rule U [THEN iffD2]\<close>\<close>)  | 
| 
60288
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
958  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
959  | 
lemma "L \<noteq> [] \<Longrightarrow> case L of [] \<Rightarrow> False | _ \<Rightarrow> True"  | 
| 
60298
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
960  | 
apply splits  | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
961  | 
apply (prop_solver intros: allI)  | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
962  | 
done  | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
963  | 
|
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
964  | 
text \<open>  | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
965  | 
  Here the new @{method splits} method transforms the goal to use only logical
 | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
966  | 
  connectives: @{term "L = [] \<longrightarrow> False \<and> (\<forall>x y. L = x # y \<longrightarrow> True)"}. This goal
 | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
967  | 
  is then in a form solvable by @{method prop_solver} when given the universal
 | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
968  | 
  quantifier introduction rule @{text allI}.
 | 
| 
 
7c278b692aae
updated Eisbach manual, using version 3149f9146eb5 of its Bitbucket repository;
 
wenzelm 
parents: 
60288 
diff
changeset
 | 
969  | 
\<close>  | 
| 
60288
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
970  | 
|
| 
 
d7f636331176
added Eisbach manual, using version 8845c4cb28b6 of its Bitbucket repository;
 
wenzelm 
parents:  
diff
changeset
 | 
971  | 
end  |