| author | blanchet | 
| Tue, 27 Jul 2010 18:45:55 +0200 | |
| changeset 38025 | b660597a6796 | 
| parent 36960 | 01594f816e3a | 
| child 40722 | 441260986b63 | 
| permissions | -rw-r--r-- | 
| 
30160
 
5f7b17941730
moved some generic tools to src/Tools/ -- src/Provers is essentially obsolete;
 
wenzelm 
parents: 
29269 
diff
changeset
 | 
1  | 
(* Title: Tools/eqsubst.ML  | 
| 
29269
 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 
wenzelm 
parents: 
27809 
diff
changeset
 | 
2  | 
Author: Lucas Dixon, University of Edinburgh  | 
| 15481 | 3  | 
|
| 18598 | 4  | 
A proof method to perform a substiution using an equation.  | 
5  | 
*)  | 
|
| 
15538
 
d8edf54cc28c
lucas - re-arranged code and added comments. Also added check to make sure the subgoal that we are being applied to exists. If it does not, empty seq is returned.
 
dixon 
parents: 
15486 
diff
changeset
 | 
6  | 
|
| 18591 | 7  | 
signature EQSUBST =  | 
| 15481 | 8  | 
sig  | 
| 
29269
 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 
wenzelm 
parents: 
27809 
diff
changeset
 | 
9  | 
(* a type abbreviation for match information *)  | 
| 19871 | 10  | 
type match =  | 
11  | 
((indexname * (sort * typ)) list (* type instantiations *)  | 
|
12  | 
* (indexname * (typ * term)) list) (* term instantiations *)  | 
|
13  | 
* (string * typ) list (* fake named type abs env *)  | 
|
14  | 
* (string * typ) list (* type abs env *)  | 
|
15  | 
* term (* outer term *)  | 
|
16  | 
||
17  | 
type searchinfo =  | 
|
18  | 
theory  | 
|
19  | 
* int (* maxidx *)  | 
|
20  | 
* Zipper.T (* focusterm to search under *)  | 
|
21  | 
||
22  | 
exception eqsubst_occL_exp of  | 
|
| 31301 | 23  | 
string * int list * thm list * int * thm  | 
| 19871 | 24  | 
|
25  | 
(* low level substitution functions *)  | 
|
26  | 
val apply_subst_in_asm :  | 
|
27  | 
int ->  | 
|
| 31301 | 28  | 
thm ->  | 
29  | 
thm ->  | 
|
30  | 
(cterm list * int * 'a * thm) * match -> thm Seq.seq  | 
|
| 19871 | 31  | 
val apply_subst_in_concl :  | 
32  | 
int ->  | 
|
| 31301 | 33  | 
thm ->  | 
34  | 
cterm list * thm ->  | 
|
35  | 
thm -> match -> thm Seq.seq  | 
|
| 19871 | 36  | 
|
37  | 
(* matching/unification within zippers *)  | 
|
38  | 
val clean_match_z :  | 
|
| 31301 | 39  | 
theory -> term -> Zipper.T -> match option  | 
| 19871 | 40  | 
val clean_unify_z :  | 
| 31301 | 41  | 
theory -> int -> term -> Zipper.T -> match Seq.seq  | 
| 19871 | 42  | 
|
43  | 
(* skipping things in seq seq's *)  | 
|
44  | 
||
45  | 
(* skipping non-empty sub-sequences but when we reach the end  | 
|
46  | 
of the seq, remembering how much we have left to skip. *)  | 
|
47  | 
datatype 'a skipseq = SkipMore of int  | 
|
48  | 
| SkipSeq of 'a Seq.seq Seq.seq;  | 
|
49  | 
||
50  | 
val skip_first_asm_occs_search :  | 
|
51  | 
       ('a -> 'b -> 'c Seq.seq Seq.seq) ->
 | 
|
52  | 
'a -> int -> 'b -> 'c skipseq  | 
|
53  | 
val skip_first_occs_search :  | 
|
54  | 
       int -> ('a -> 'b -> 'c Seq.seq Seq.seq) -> 'a -> 'b -> 'c Seq.seq
 | 
|
55  | 
val skipto_skipseq : int -> 'a Seq.seq Seq.seq -> 'a skipseq  | 
|
56  | 
||
57  | 
(* tactics *)  | 
|
58  | 
val eqsubst_asm_tac :  | 
|
59  | 
Proof.context ->  | 
|
| 31301 | 60  | 
int list -> thm list -> int -> tactic  | 
| 19871 | 61  | 
val eqsubst_asm_tac' :  | 
62  | 
Proof.context ->  | 
|
| 31301 | 63  | 
(searchinfo -> int -> term -> match skipseq) ->  | 
64  | 
int -> thm -> int -> tactic  | 
|
| 19871 | 65  | 
val eqsubst_tac :  | 
66  | 
Proof.context ->  | 
|
| 22727 | 67  | 
int list -> (* list of occurences to rewrite, use [0] for any *)  | 
| 31301 | 68  | 
thm list -> int -> tactic  | 
| 19871 | 69  | 
val eqsubst_tac' :  | 
| 22727 | 70  | 
Proof.context -> (* proof context *)  | 
| 31301 | 71  | 
(searchinfo -> term -> match Seq.seq) (* search function *)  | 
72  | 
-> thm (* equation theorem to rewrite with *)  | 
|
| 22727 | 73  | 
-> int (* subgoal number in goal theorem *)  | 
| 31301 | 74  | 
-> thm (* goal theorem *)  | 
75  | 
-> thm Seq.seq (* rewritten goal theorem *)  | 
|
| 19871 | 76  | 
|
77  | 
||
78  | 
val fakefree_badbounds :  | 
|
| 31301 | 79  | 
(string * typ) list ->  | 
80  | 
term ->  | 
|
81  | 
(string * typ) list * (string * typ) list * term  | 
|
| 19871 | 82  | 
|
83  | 
val mk_foo_match :  | 
|
| 31301 | 84  | 
(term -> term) ->  | 
85  | 
       ('a * typ) list -> term -> term
 | 
|
| 19871 | 86  | 
|
87  | 
(* preparing substitution *)  | 
|
| 31301 | 88  | 
val prep_meta_eq : Proof.context -> thm -> thm list  | 
| 19871 | 89  | 
val prep_concl_subst :  | 
| 31301 | 90  | 
int -> thm -> (cterm list * thm) * searchinfo  | 
| 19871 | 91  | 
val prep_subst_in_asm :  | 
| 31301 | 92  | 
int -> thm -> int ->  | 
93  | 
(cterm list * int * int * thm) * searchinfo  | 
|
| 19871 | 94  | 
val prep_subst_in_asms :  | 
| 31301 | 95  | 
int -> thm ->  | 
96  | 
((cterm list * int * int * thm) * searchinfo) list  | 
|
| 19871 | 97  | 
val prep_zipper_match :  | 
| 31301 | 98  | 
Zipper.T -> term * ((string * typ) list * (string * typ) list * term)  | 
| 19871 | 99  | 
|
100  | 
(* search for substitutions *)  | 
|
101  | 
val valid_match_start : Zipper.T -> bool  | 
|
102  | 
val search_lr_all : Zipper.T -> Zipper.T Seq.seq  | 
|
103  | 
val search_lr_valid : (Zipper.T -> bool) -> Zipper.T -> Zipper.T Seq.seq  | 
|
104  | 
val searchf_lr_unify_all :  | 
|
| 31301 | 105  | 
searchinfo -> term -> match Seq.seq Seq.seq  | 
| 19871 | 106  | 
val searchf_lr_unify_valid :  | 
| 31301 | 107  | 
searchinfo -> term -> match Seq.seq Seq.seq  | 
| 23064 | 108  | 
val searchf_bt_unify_valid :  | 
| 31301 | 109  | 
searchinfo -> term -> match Seq.seq Seq.seq  | 
| 19871 | 110  | 
|
111  | 
(* syntax tools *)  | 
|
| 30513 | 112  | 
val ith_syntax : int list parser  | 
113  | 
val options_syntax : bool parser  | 
|
| 19871 | 114  | 
|
115  | 
(* Isar level hooks *)  | 
|
| 31301 | 116  | 
val eqsubst_asm_meth : Proof.context -> int list -> thm list -> Proof.method  | 
117  | 
val eqsubst_meth : Proof.context -> int list -> thm list -> Proof.method  | 
|
| 19871 | 118  | 
val setup : theory -> theory  | 
119  | 
||
| 15481 | 120  | 
end;  | 
121  | 
||
| 
19835
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
122  | 
structure EqSubst  | 
| 19871 | 123  | 
: EQSUBST  | 
| 
19835
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
124  | 
= struct  | 
| 
16004
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
125  | 
|
| 
19835
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
126  | 
structure Z = Zipper;  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
127  | 
|
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
128  | 
(* changes object "=" to meta "==" which prepares a given rewrite rule *)  | 
| 18598 | 129  | 
fun prep_meta_eq ctxt =  | 
| 
32149
 
ef59550a55d3
renamed simpset_of to global_simpset_of, and local_simpset_of to simpset_of -- same for claset and clasimpset;
 
wenzelm 
parents: 
32032 
diff
changeset
 | 
130  | 
Simplifier.mksimps (simpset_of ctxt) #> map Drule.zero_var_indexes;  | 
| 18598 | 131  | 
|
| 15481 | 132  | 
|
| 
15915
 
b0e8b37642a4
lucas - improved interface to isand.ML and cleaned up clean-unification code, and added some better comments.
 
dixon 
parents: 
15855 
diff
changeset
 | 
133  | 
(* a type abriviation for match information *)  | 
| 16978 | 134  | 
type match =  | 
135  | 
((indexname * (sort * typ)) list (* type instantiations *)  | 
|
136  | 
* (indexname * (typ * term)) list) (* term instantiations *)  | 
|
137  | 
* (string * typ) list (* fake named type abs env *)  | 
|
138  | 
* (string * typ) list (* type abs env *)  | 
|
139  | 
* term (* outer term *)  | 
|
| 
15550
 
806214035275
lucas - added more comments and an extra type to clarify the code.
 
dixon 
parents: 
15538 
diff
changeset
 | 
140  | 
|
| 16978 | 141  | 
type searchinfo =  | 
| 18598 | 142  | 
theory  | 
| 
16004
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
143  | 
* int (* maxidx *)  | 
| 
19835
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
144  | 
* Zipper.T (* focusterm to search under *)  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
145  | 
|
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
146  | 
|
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
147  | 
(* skipping non-empty sub-sequences but when we reach the end  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
148  | 
of the seq, remembering how much we have left to skip. *)  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
149  | 
datatype 'a skipseq = SkipMore of int  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
150  | 
| SkipSeq of 'a Seq.seq Seq.seq;  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
151  | 
(* given a seqseq, skip the first m non-empty seq's, note deficit *)  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
152  | 
fun skipto_skipseq m s =  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
153  | 
let  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
154  | 
fun skip_occs n sq =  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
155  | 
case Seq.pull sq of  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
156  | 
NONE => SkipMore n  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
157  | 
| SOME (h,t) =>  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
158  | 
(case Seq.pull h of NONE => skip_occs n t  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
159  | 
| SOME _ => if n <= 1 then SkipSeq (Seq.cons h t)  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
160  | 
else skip_occs (n - 1) t)  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
161  | 
in (skip_occs m s) end;  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
162  | 
|
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
163  | 
(* note: outerterm is the taget with the match replaced by a bound  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
164  | 
variable : ie: "P lhs" beocmes "%x. P x"  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
165  | 
insts is the types of instantiations of vars in lhs  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
166  | 
and typinsts is the type instantiations of types in the lhs  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
167  | 
Note: Final rule is the rule lifted into the ontext of the  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
168  | 
taget thm. *)  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
169  | 
fun mk_foo_match mkuptermfunc Ts t =  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
170  | 
let  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
171  | 
val ty = Term.type_of t  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
172  | 
val bigtype = (rev (map snd Ts)) ---> ty  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
173  | 
fun mk_foo 0 t = t  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
174  | 
| mk_foo i t = mk_foo (i - 1) (t $ (Bound (i - 1)))  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
175  | 
val num_of_bnds = (length Ts)  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
176  | 
(* foo_term = "fooabs y0 ... yn" where y's are local bounds *)  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
177  | 
val foo_term = mk_foo num_of_bnds (Bound num_of_bnds)  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
178  | 
    in Abs("fooabs", bigtype, mkuptermfunc foo_term) end;
 | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
179  | 
|
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
180  | 
(* T is outer bound vars, n is number of locally bound vars *)  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
181  | 
(* THINK: is order of Ts correct...? or reversed? *)  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
182  | 
fun fakefree_badbounds Ts t =  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
183  | 
let val (FakeTs,Ts,newnames) =  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
184  | 
List.foldr (fn ((n,ty),(FakeTs,Ts,usednames)) =>  | 
| 
20071
 
8f3e1ddb50e6
replaced Term.variant(list) by Name.variant(_list);
 
wenzelm 
parents: 
19975 
diff
changeset
 | 
185  | 
let val newname = Name.variant usednames n  | 
| 
19835
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
186  | 
in ((RWTools.mk_fake_bound_name newname,ty)::FakeTs,  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
187  | 
(newname,ty)::Ts,  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
188  | 
newname::usednames) end)  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
189  | 
([],[],[])  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
190  | 
Ts  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
191  | 
in (FakeTs, Ts, Term.subst_bounds (map Free FakeTs, t)) end;  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
192  | 
|
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
193  | 
(* before matching we need to fake the bound vars that are missing an  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
194  | 
abstraction. In this function we additionally construct the  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
195  | 
abstraction environment, and an outer context term (with the focus  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
196  | 
abstracted out) for use in rewriting with RWInst.rw *)  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
197  | 
fun prep_zipper_match z =  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
198  | 
let  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
199  | 
val t = Z.trm z  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
200  | 
val c = Z.ctxt z  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
201  | 
val Ts = Z.C.nty_ctxt c  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
202  | 
val (FakeTs', Ts', t') = fakefree_badbounds Ts t  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
203  | 
val absterm = mk_foo_match (Z.C.apply c) Ts' t'  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
204  | 
in  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
205  | 
(t', (FakeTs', Ts', absterm))  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
206  | 
end;  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
207  | 
|
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
208  | 
(* Matching and Unification with exception handled *)  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
209  | 
fun clean_match thy (a as (pat, t)) =  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
210  | 
let val (tyenv, tenv) = Pattern.match thy a (Vartab.empty, Vartab.empty)  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
211  | 
in SOME (Vartab.dest tyenv, Vartab.dest tenv)  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
212  | 
end handle Pattern.MATCH => NONE;  | 
| 
27033
 
6ef5134fc631
fixed bug: maxidx was wrongly calculuated from term, now calculated
 
dixon 
parents: 
23064 
diff
changeset
 | 
213  | 
|
| 
19835
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
214  | 
(* given theory, max var index, pat, tgt; returns Seq of instantiations *)  | 
| 
27033
 
6ef5134fc631
fixed bug: maxidx was wrongly calculuated from term, now calculated
 
dixon 
parents: 
23064 
diff
changeset
 | 
215  | 
fun clean_unify thry ix (a as (pat, tgt)) =  | 
| 
19835
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
216  | 
let  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
217  | 
(* type info will be re-derived, maybe this can be cached  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
218  | 
for efficiency? *)  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
219  | 
val pat_ty = Term.type_of pat;  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
220  | 
val tgt_ty = Term.type_of tgt;  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
221  | 
(* is it OK to ignore the type instantiation info?  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
222  | 
or should I be using it? *)  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
223  | 
val typs_unify =  | 
| 
29269
 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 
wenzelm 
parents: 
27809 
diff
changeset
 | 
224  | 
SOME (Sign.typ_unify thry (pat_ty, tgt_ty) (Vartab.empty, ix))  | 
| 
19835
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
225  | 
handle Type.TUNIFY => NONE;  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
226  | 
in  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
227  | 
case typs_unify of  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
228  | 
SOME (typinsttab, ix2) =>  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
229  | 
let  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
230  | 
(* is it right to throw away the flexes?  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
231  | 
or should I be using them somehow? *)  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
232  | 
fun mk_insts env =  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
233  | 
(Vartab.dest (Envir.type_env env),  | 
| 32032 | 234  | 
Vartab.dest (Envir.term_env env));  | 
235  | 
val initenv =  | 
|
236  | 
            Envir.Envir {maxidx = ix2, tenv = Vartab.empty, tyenv = typinsttab};
 | 
|
| 
27033
 
6ef5134fc631
fixed bug: maxidx was wrongly calculuated from term, now calculated
 
dixon 
parents: 
23064 
diff
changeset
 | 
237  | 
val useq = Unify.smash_unifiers thry [a] initenv  | 
| 
32960
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
238  | 
handle UnequalLengths => Seq.empty  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
239  | 
| Term.TERM _ => Seq.empty;  | 
| 
19835
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
240  | 
fun clean_unify' useq () =  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
241  | 
(case (Seq.pull useq) of  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
242  | 
NONE => NONE  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
243  | 
| SOME (h,t) => SOME (mk_insts h, Seq.make (clean_unify' t)))  | 
| 
32960
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
244  | 
handle UnequalLengths => NONE  | 
| 
27033
 
6ef5134fc631
fixed bug: maxidx was wrongly calculuated from term, now calculated
 
dixon 
parents: 
23064 
diff
changeset
 | 
245  | 
| Term.TERM _ => NONE  | 
| 
19835
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
246  | 
in  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
247  | 
(Seq.make (clean_unify' useq))  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
248  | 
end  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
249  | 
| NONE => Seq.empty  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
250  | 
end;  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
251  | 
|
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
252  | 
(* Matching and Unification for zippers *)  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
253  | 
(* Note: Ts is a modified version of the original names of the outer  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
254  | 
bound variables. New names have been introduced to make sure they are  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
255  | 
unique w.r.t all names in the term and each other. usednames' is  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
256  | 
oldnames + new names. *)  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
257  | 
fun clean_match_z thy pat z =  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
258  | 
let val (t, (FakeTs,Ts,absterm)) = prep_zipper_match z in  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
259  | 
case clean_match thy (pat, t) of  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
260  | 
NONE => NONE  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
261  | 
| SOME insts => SOME (insts, FakeTs, Ts, absterm) end;  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
262  | 
(* ix = max var index *)  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
263  | 
fun clean_unify_z sgn ix pat z =  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
264  | 
let val (t, (FakeTs, Ts,absterm)) = prep_zipper_match z in  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
265  | 
Seq.map (fn insts => (insts, FakeTs, Ts, absterm))  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
266  | 
(clean_unify sgn ix (t, pat)) end;  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
267  | 
|
| 
15550
 
806214035275
lucas - added more comments and an extra type to clarify the code.
 
dixon 
parents: 
15538 
diff
changeset
 | 
268  | 
|
| 
15538
 
d8edf54cc28c
lucas - re-arranged code and added comments. Also added check to make sure the subgoal that we are being applied to exists. If it does not, empty seq is returned.
 
dixon 
parents: 
15486 
diff
changeset
 | 
269  | 
(* FOR DEBUGGING...  | 
| 
 
d8edf54cc28c
lucas - re-arranged code and added comments. Also added check to make sure the subgoal that we are being applied to exists. If it does not, empty seq is returned.
 
dixon 
parents: 
15486 
diff
changeset
 | 
270  | 
type trace_subst_errT = int (* subgoal *)  | 
| 16978 | 271  | 
* thm (* thm with all goals *)  | 
| 33243 | 272  | 
* (cterm list (* certified free var placeholders for vars *)  | 
| 16978 | 273  | 
* thm) (* trivial thm of goal concl *)  | 
| 
15538
 
d8edf54cc28c
lucas - re-arranged code and added comments. Also added check to make sure the subgoal that we are being applied to exists. If it does not, empty seq is returned.
 
dixon 
parents: 
15486 
diff
changeset
 | 
274  | 
(* possible matches/unifiers *)  | 
| 16978 | 275  | 
* thm (* rule *)  | 
276  | 
* (((indexname * typ) list (* type instantiations *)  | 
|
277  | 
* (indexname * term) list ) (* term instantiations *)  | 
|
278  | 
* (string * typ) list (* Type abs env *)  | 
|
279  | 
* term) (* outer term *);  | 
|
| 
15538
 
d8edf54cc28c
lucas - re-arranged code and added comments. Also added check to make sure the subgoal that we are being applied to exists. If it does not, empty seq is returned.
 
dixon 
parents: 
15486 
diff
changeset
 | 
280  | 
|
| 32740 | 281  | 
val trace_subst_err = (Unsynchronized.ref NONE : trace_subst_errT option Unsynchronized.ref);  | 
282  | 
val trace_subst_search = Unsynchronized.ref false;  | 
|
| 
15538
 
d8edf54cc28c
lucas - re-arranged code and added comments. Also added check to make sure the subgoal that we are being applied to exists. If it does not, empty seq is returned.
 
dixon 
parents: 
15486 
diff
changeset
 | 
283  | 
exception trace_subst_exp of trace_subst_errT;  | 
| 
19835
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
284  | 
*)  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
285  | 
|
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
286  | 
|
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
287  | 
fun bot_left_leaf_of (l $ r) = bot_left_leaf_of l  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
288  | 
| bot_left_leaf_of (Abs(s,ty,t)) = bot_left_leaf_of t  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
289  | 
| bot_left_leaf_of x = x;  | 
| 
15538
 
d8edf54cc28c
lucas - re-arranged code and added comments. Also added check to make sure the subgoal that we are being applied to exists. If it does not, empty seq is returned.
 
dixon 
parents: 
15486 
diff
changeset
 | 
290  | 
|
| 
19975
 
ecd684d62808
fix to subst in order to allow subst when head of a term is a bound variable.
 
dixon 
parents: 
19871 
diff
changeset
 | 
291  | 
(* Avoid considering replacing terms which have a var at the head as  | 
| 
 
ecd684d62808
fix to subst in order to allow subst when head of a term is a bound variable.
 
dixon 
parents: 
19871 
diff
changeset
 | 
292  | 
they always succeed trivially, and uninterestingly. *)  | 
| 
19835
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
293  | 
fun valid_match_start z =  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
294  | 
(case bot_left_leaf_of (Z.trm z) of  | 
| 
19975
 
ecd684d62808
fix to subst in order to allow subst when head of a term is a bound variable.
 
dixon 
parents: 
19871 
diff
changeset
 | 
295  | 
Var _ => false  | 
| 
 
ecd684d62808
fix to subst in order to allow subst when head of a term is a bound variable.
 
dixon 
parents: 
19871 
diff
changeset
 | 
296  | 
| _ => true);  | 
| 
 
ecd684d62808
fix to subst in order to allow subst when head of a term is a bound variable.
 
dixon 
parents: 
19871 
diff
changeset
 | 
297  | 
|
| 
15814
 
d65f461c8672
lucas - fixed a big with renaming of bound variables. Other small changes.
 
dixon 
parents: 
15550 
diff
changeset
 | 
298  | 
(* search from top, left to right, then down *)  | 
| 19871 | 299  | 
val search_lr_all = ZipperSearch.all_bl_ur;  | 
| 15481 | 300  | 
|
| 
15814
 
d65f461c8672
lucas - fixed a big with renaming of bound variables. Other small changes.
 
dixon 
parents: 
15550 
diff
changeset
 | 
301  | 
(* search from top, left to right, then down *)  | 
| 19871 | 302  | 
fun search_lr_valid validf =  | 
| 
19835
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
303  | 
let  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
304  | 
fun sf_valid_td_lr z =  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
305  | 
let val here = if validf z then [Z.Here z] else [] in  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
306  | 
case Z.trm z  | 
| 19871 | 307  | 
of _ $ _ => [Z.LookIn (Z.move_down_left z)]  | 
308  | 
@ here  | 
|
309  | 
@ [Z.LookIn (Z.move_down_right z)]  | 
|
| 
19835
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
310  | 
| Abs _ => here @ [Z.LookIn (Z.move_down_abs z)]  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
311  | 
| _ => here  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
312  | 
end;  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
313  | 
in Z.lzy_search sf_valid_td_lr end;  | 
| 
15814
 
d65f461c8672
lucas - fixed a big with renaming of bound variables. Other small changes.
 
dixon 
parents: 
15550 
diff
changeset
 | 
314  | 
|
| 23064 | 315  | 
(* search from bottom to top, left to right *)  | 
316  | 
||
317  | 
fun search_bt_valid validf =  | 
|
318  | 
let  | 
|
319  | 
fun sf_valid_td_lr z =  | 
|
320  | 
let val here = if validf z then [Z.Here z] else [] in  | 
|
321  | 
case Z.trm z  | 
|
322  | 
of _ $ _ => [Z.LookIn (Z.move_down_left z),  | 
|
323  | 
Z.LookIn (Z.move_down_right z)] @ here  | 
|
324  | 
| Abs _ => [Z.LookIn (Z.move_down_abs z)] @ here  | 
|
325  | 
| _ => here  | 
|
326  | 
end;  | 
|
327  | 
in Z.lzy_search sf_valid_td_lr end;  | 
|
328  | 
||
329  | 
fun searchf_unify_gen f (sgn, maxidx, z) lhs =  | 
|
330  | 
Seq.map (clean_unify_z sgn maxidx lhs)  | 
|
331  | 
(Z.limit_apply f z);  | 
|
332  | 
||
| 
15814
 
d65f461c8672
lucas - fixed a big with renaming of bound variables. Other small changes.
 
dixon 
parents: 
15550 
diff
changeset
 | 
333  | 
(* search all unifications *)  | 
| 23064 | 334  | 
val searchf_lr_unify_all =  | 
335  | 
searchf_unify_gen search_lr_all;  | 
|
| 15481 | 336  | 
|
| 
15814
 
d65f461c8672
lucas - fixed a big with renaming of bound variables. Other small changes.
 
dixon 
parents: 
15550 
diff
changeset
 | 
337  | 
(* search only for 'valid' unifiers (non abs subterms and non vars) *)  | 
| 23064 | 338  | 
val searchf_lr_unify_valid =  | 
339  | 
searchf_unify_gen (search_lr_valid valid_match_start);  | 
|
| 
15929
 
68bd1e16552a
lucas - added option to select occurance to rewrite e.g. (occ 4)
 
dixon 
parents: 
15915 
diff
changeset
 | 
340  | 
|
| 23064 | 341  | 
val searchf_bt_unify_valid =  | 
342  | 
searchf_unify_gen (search_bt_valid valid_match_start);  | 
|
| 
15814
 
d65f461c8672
lucas - fixed a big with renaming of bound variables. Other small changes.
 
dixon 
parents: 
15550 
diff
changeset
 | 
343  | 
|
| 
15538
 
d8edf54cc28c
lucas - re-arranged code and added comments. Also added check to make sure the subgoal that we are being applied to exists. If it does not, empty seq is returned.
 
dixon 
parents: 
15486 
diff
changeset
 | 
344  | 
(* apply a substitution in the conclusion of the theorem th *)  | 
| 
 
d8edf54cc28c
lucas - re-arranged code and added comments. Also added check to make sure the subgoal that we are being applied to exists. If it does not, empty seq is returned.
 
dixon 
parents: 
15486 
diff
changeset
 | 
345  | 
(* cfvs are certified free var placeholders for goal params *)  | 
| 
 
d8edf54cc28c
lucas - re-arranged code and added comments. Also added check to make sure the subgoal that we are being applied to exists. If it does not, empty seq is returned.
 
dixon 
parents: 
15486 
diff
changeset
 | 
346  | 
(* conclthm is a theorem of for just the conclusion *)  | 
| 
 
d8edf54cc28c
lucas - re-arranged code and added comments. Also added check to make sure the subgoal that we are being applied to exists. If it does not, empty seq is returned.
 
dixon 
parents: 
15486 
diff
changeset
 | 
347  | 
(* m is instantiation/match information *)  | 
| 
 
d8edf54cc28c
lucas - re-arranged code and added comments. Also added check to make sure the subgoal that we are being applied to exists. If it does not, empty seq is returned.
 
dixon 
parents: 
15486 
diff
changeset
 | 
348  | 
(* rule is the equation for substitution *)  | 
| 16978 | 349  | 
fun apply_subst_in_concl i th (cfvs, conclthm) rule m =  | 
| 
15538
 
d8edf54cc28c
lucas - re-arranged code and added comments. Also added check to make sure the subgoal that we are being applied to exists. If it does not, empty seq is returned.
 
dixon 
parents: 
15486 
diff
changeset
 | 
350  | 
(RWInst.rw m rule conclthm)  | 
| 15855 | 351  | 
|> IsaND.unfix_frees cfvs  | 
| 
15915
 
b0e8b37642a4
lucas - improved interface to isand.ML and cleaned up clean-unification code, and added some better comments.
 
dixon 
parents: 
15855 
diff
changeset
 | 
352  | 
|> RWInst.beta_eta_contract  | 
| 
15538
 
d8edf54cc28c
lucas - re-arranged code and added comments. Also added check to make sure the subgoal that we are being applied to exists. If it does not, empty seq is returned.
 
dixon 
parents: 
15486 
diff
changeset
 | 
353  | 
|> (fn r => Tactic.rtac r i th);  | 
| 15481 | 354  | 
|
355  | 
(* substitute within the conclusion of goal i of gth, using a meta  | 
|
| 
15538
 
d8edf54cc28c
lucas - re-arranged code and added comments. Also added check to make sure the subgoal that we are being applied to exists. If it does not, empty seq is returned.
 
dixon 
parents: 
15486 
diff
changeset
 | 
356  | 
equation rule. Note that we assume rule has var indicies zero'd *)  | 
| 16978 | 357  | 
fun prep_concl_subst i gth =  | 
358  | 
let  | 
|
| 15481 | 359  | 
val th = Thm.incr_indexes 1 gth;  | 
360  | 
val tgt_term = Thm.prop_of th;  | 
|
361  | 
||
| 22578 | 362  | 
val sgn = Thm.theory_of_thm th;  | 
| 15481 | 363  | 
val ctermify = Thm.cterm_of sgn;  | 
364  | 
val trivify = Thm.trivial o ctermify;  | 
|
365  | 
||
366  | 
val (fixedbody, fvs) = IsaND.fix_alls_term i tgt_term;  | 
|
367  | 
val cfvs = rev (map ctermify fvs);  | 
|
368  | 
||
| 
15538
 
d8edf54cc28c
lucas - re-arranged code and added comments. Also added check to make sure the subgoal that we are being applied to exists. If it does not, empty seq is returned.
 
dixon 
parents: 
15486 
diff
changeset
 | 
369  | 
val conclterm = Logic.strip_imp_concl fixedbody;  | 
| 
 
d8edf54cc28c
lucas - re-arranged code and added comments. Also added check to make sure the subgoal that we are being applied to exists. If it does not, empty seq is returned.
 
dixon 
parents: 
15486 
diff
changeset
 | 
370  | 
val conclthm = trivify conclterm;  | 
| 
27033
 
6ef5134fc631
fixed bug: maxidx was wrongly calculuated from term, now calculated
 
dixon 
parents: 
23064 
diff
changeset
 | 
371  | 
val maxidx = Thm.maxidx_of th;  | 
| 
19835
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
372  | 
val ft = ((Z.move_down_right (* ==> *)  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
373  | 
o Z.move_down_left (* Trueprop *)  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
374  | 
o Z.mktop  | 
| 
16004
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
375  | 
o Thm.prop_of) conclthm)  | 
| 15481 | 376  | 
in  | 
| 
16004
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
377  | 
((cfvs, conclthm), (sgn, maxidx, ft))  | 
| 15481 | 378  | 
end;  | 
379  | 
||
380  | 
(* substitute using an object or meta level equality *)  | 
|
| 18598 | 381  | 
fun eqsubst_tac' ctxt searchf instepthm i th =  | 
| 16978 | 382  | 
let  | 
| 
16004
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
383  | 
val (cvfsconclthm, searchinfo) = prep_concl_subst i th;  | 
| 18598 | 384  | 
val stepthms = Seq.of_list (prep_meta_eq ctxt instepthm);  | 
| 
15538
 
d8edf54cc28c
lucas - re-arranged code and added comments. Also added check to make sure the subgoal that we are being applied to exists. If it does not, empty seq is returned.
 
dixon 
parents: 
15486 
diff
changeset
 | 
385  | 
fun rewrite_with_thm r =  | 
| 
 
d8edf54cc28c
lucas - re-arranged code and added comments. Also added check to make sure the subgoal that we are being applied to exists. If it does not, empty seq is returned.
 
dixon 
parents: 
15486 
diff
changeset
 | 
386  | 
let val (lhs,_) = Logic.dest_equals (Thm.concl_of r);  | 
| 18598 | 387  | 
in searchf searchinfo lhs  | 
388  | 
|> Seq.maps (apply_subst_in_concl i th cvfsconclthm r) end;  | 
|
389  | 
in stepthms |> Seq.maps rewrite_with_thm end;  | 
|
| 
15538
 
d8edf54cc28c
lucas - re-arranged code and added comments. Also added check to make sure the subgoal that we are being applied to exists. If it does not, empty seq is returned.
 
dixon 
parents: 
15486 
diff
changeset
 | 
390  | 
|
| 
 
d8edf54cc28c
lucas - re-arranged code and added comments. Also added check to make sure the subgoal that we are being applied to exists. If it does not, empty seq is returned.
 
dixon 
parents: 
15486 
diff
changeset
 | 
391  | 
|
| 19047 | 392  | 
(* distinct subgoals *)  | 
| 
15959
 
366d39e95d3c
lucas - fixed bug with uninstantiated type contexts in eqsubst and added the automatic removal of duplicate subgoals (when there are no flex-flex constraints)
 
dixon 
parents: 
15936 
diff
changeset
 | 
393  | 
fun distinct_subgoals th =  | 
| 19047 | 394  | 
the_default th (SINGLE distinct_subgoals_tac th);  | 
| 
15538
 
d8edf54cc28c
lucas - re-arranged code and added comments. Also added check to make sure the subgoal that we are being applied to exists. If it does not, empty seq is returned.
 
dixon 
parents: 
15486 
diff
changeset
 | 
395  | 
|
| 19047 | 396  | 
(* General substitution of multiple occurances using one of  | 
| 
15936
 
817ac93ee786
lucas - added ability to provide multiple replacements for subst: syntax is now: subst (1 3) myrule
 
dixon 
parents: 
15929 
diff
changeset
 | 
397  | 
the given theorems*)  | 
| 
19835
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
398  | 
|
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
399  | 
|
| 16978 | 400  | 
exception eqsubst_occL_exp of  | 
401  | 
string * (int list) * (thm list) * int * thm;  | 
|
402  | 
fun skip_first_occs_search occ srchf sinfo lhs =  | 
|
| 
19835
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
403  | 
case (skipto_skipseq occ (srchf sinfo lhs)) of  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
404  | 
SkipMore _ => Seq.empty  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
405  | 
| SkipSeq ss => Seq.flat ss;  | 
| 
16004
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
406  | 
|
| 22727 | 407  | 
(* The occL is a list of integers indicating which occurence  | 
408  | 
w.r.t. the search order, to rewrite. Backtracking will also find later  | 
|
409  | 
occurences, but all earlier ones are skipped. Thus you can use [0] to  | 
|
410  | 
just find all rewrites. *)  | 
|
411  | 
||
| 18598 | 412  | 
fun eqsubst_tac ctxt occL thms i th =  | 
| 
15936
 
817ac93ee786
lucas - added ability to provide multiple replacements for subst: syntax is now: subst (1 3) myrule
 
dixon 
parents: 
15929 
diff
changeset
 | 
413  | 
let val nprems = Thm.nprems_of th in  | 
| 
 
817ac93ee786
lucas - added ability to provide multiple replacements for subst: syntax is now: subst (1 3) myrule
 
dixon 
parents: 
15929 
diff
changeset
 | 
414  | 
if nprems < i then Seq.empty else  | 
| 16978 | 415  | 
let val thmseq = (Seq.of_list thms)  | 
416  | 
fun apply_occ occ th =  | 
|
| 18598 | 417  | 
thmseq |> Seq.maps  | 
| 
19835
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
418  | 
(fn r => eqsubst_tac'  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
419  | 
ctxt  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
420  | 
(skip_first_occs_search  | 
| 19871 | 421  | 
occ searchf_lr_unify_valid) r  | 
| 
15936
 
817ac93ee786
lucas - added ability to provide multiple replacements for subst: syntax is now: subst (1 3) myrule
 
dixon 
parents: 
15929 
diff
changeset
 | 
422  | 
(i + ((Thm.nprems_of th) - nprems))  | 
| 
 
817ac93ee786
lucas - added ability to provide multiple replacements for subst: syntax is now: subst (1 3) myrule
 
dixon 
parents: 
15929 
diff
changeset
 | 
423  | 
th);  | 
| 16978 | 424  | 
val sortedoccL =  | 
| 
16004
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
425  | 
Library.sort (Library.rev_order o Library.int_ord) occL;  | 
| 
15936
 
817ac93ee786
lucas - added ability to provide multiple replacements for subst: syntax is now: subst (1 3) myrule
 
dixon 
parents: 
15929 
diff
changeset
 | 
426  | 
in  | 
| 
16004
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
427  | 
Seq.map distinct_subgoals (Seq.EVERY (map apply_occ sortedoccL) th)  | 
| 
15936
 
817ac93ee786
lucas - added ability to provide multiple replacements for subst: syntax is now: subst (1 3) myrule
 
dixon 
parents: 
15929 
diff
changeset
 | 
428  | 
end  | 
| 
15959
 
366d39e95d3c
lucas - fixed bug with uninstantiated type contexts in eqsubst and added the automatic removal of duplicate subgoals (when there are no flex-flex constraints)
 
dixon 
parents: 
15936 
diff
changeset
 | 
429  | 
end  | 
| 
 
366d39e95d3c
lucas - fixed bug with uninstantiated type contexts in eqsubst and added the automatic removal of duplicate subgoals (when there are no flex-flex constraints)
 
dixon 
parents: 
15936 
diff
changeset
 | 
430  | 
    handle THM _ => raise eqsubst_occL_exp ("THM",occL,thms,i,th);
 | 
| 
 
366d39e95d3c
lucas - fixed bug with uninstantiated type contexts in eqsubst and added the automatic removal of duplicate subgoals (when there are no flex-flex constraints)
 
dixon 
parents: 
15936 
diff
changeset
 | 
431  | 
|
| 15481 | 432  | 
|
433  | 
(* inthms are the given arguments in Isar, and treated as eqstep with  | 
|
434  | 
the first one, then the second etc *)  | 
|
| 18598 | 435  | 
fun eqsubst_meth ctxt occL inthms =  | 
| 
30510
 
4120fc59dd85
unified type Proof.method and pervasive METHOD combinators;
 
wenzelm 
parents: 
30318 
diff
changeset
 | 
436  | 
SIMPLE_METHOD' (eqsubst_tac ctxt occL inthms);  | 
| 15481 | 437  | 
|
| 
16004
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
438  | 
(* apply a substitution inside assumption j, keeps asm in the same place *)  | 
| 16978 | 439  | 
fun apply_subst_in_asm i th rule ((cfvs, j, ngoalprems, pth),m) =  | 
440  | 
let  | 
|
| 
16004
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
441  | 
val th2 = Thm.rotate_rule (j - 1) i th; (* put premice first *)  | 
| 16978 | 442  | 
val preelimrule =  | 
| 
16004
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
443  | 
(RWInst.rw m rule pth)  | 
| 21708 | 444  | 
|> (Seq.hd o prune_params_tac)  | 
| 
16004
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
445  | 
|> Thm.permute_prems 0 ~1 (* put old asm first *)  | 
| 
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
446  | 
|> IsaND.unfix_frees cfvs (* unfix any global params *)  | 
| 
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
447  | 
|> RWInst.beta_eta_contract; (* normal form *)  | 
| 16978 | 448  | 
(* val elimrule =  | 
| 
16004
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
449  | 
preelimrule  | 
| 
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
450  | 
|> Tactic.make_elim (* make into elim rule *)  | 
| 
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
451  | 
|> Thm.lift_rule (th2, i); (* lift into context *)  | 
| 
16007
 
4dcccaa11a13
lucas - bugfix to subst in assumptions: fixed index error for conditional rules.
 
dixon 
parents: 
16004 
diff
changeset
 | 
452  | 
*)  | 
| 
16004
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
453  | 
in  | 
| 
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
454  | 
(* ~j because new asm starts at back, thus we subtract 1 *)  | 
| 
16007
 
4dcccaa11a13
lucas - bugfix to subst in assumptions: fixed index error for conditional rules.
 
dixon 
parents: 
16004 
diff
changeset
 | 
455  | 
Seq.map (Thm.rotate_rule (~j) ((Thm.nprems_of rule) + i))  | 
| 
 
4dcccaa11a13
lucas - bugfix to subst in assumptions: fixed index error for conditional rules.
 
dixon 
parents: 
16004 
diff
changeset
 | 
456  | 
(Tactic.dtac preelimrule i th2)  | 
| 
 
4dcccaa11a13
lucas - bugfix to subst in assumptions: fixed index error for conditional rules.
 
dixon 
parents: 
16004 
diff
changeset
 | 
457  | 
|
| 16978 | 458  | 
(* (Thm.bicompose  | 
| 
16004
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
459  | 
false (* use unification *)  | 
| 
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
460  | 
(true, (* elim resolution *)  | 
| 
16007
 
4dcccaa11a13
lucas - bugfix to subst in assumptions: fixed index error for conditional rules.
 
dixon 
parents: 
16004 
diff
changeset
 | 
461  | 
elimrule, (2 + (Thm.nprems_of rule)) - ngoalprems)  | 
| 
 
4dcccaa11a13
lucas - bugfix to subst in assumptions: fixed index error for conditional rules.
 
dixon 
parents: 
16004 
diff
changeset
 | 
462  | 
i th2) *)  | 
| 
16004
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
463  | 
end;  | 
| 15481 | 464  | 
|
465  | 
||
| 
15538
 
d8edf54cc28c
lucas - re-arranged code and added comments. Also added check to make sure the subgoal that we are being applied to exists. If it does not, empty seq is returned.
 
dixon 
parents: 
15486 
diff
changeset
 | 
466  | 
(* prepare to substitute within the j'th premise of subgoal i of gth,  | 
| 
 
d8edf54cc28c
lucas - re-arranged code and added comments. Also added check to make sure the subgoal that we are being applied to exists. If it does not, empty seq is returned.
 
dixon 
parents: 
15486 
diff
changeset
 | 
467  | 
using a meta-level equation. Note that we assume rule has var indicies  | 
| 
 
d8edf54cc28c
lucas - re-arranged code and added comments. Also added check to make sure the subgoal that we are being applied to exists. If it does not, empty seq is returned.
 
dixon 
parents: 
15486 
diff
changeset
 | 
468  | 
zero'd. Note that we also assume that premt is the j'th premice of  | 
| 
 
d8edf54cc28c
lucas - re-arranged code and added comments. Also added check to make sure the subgoal that we are being applied to exists. If it does not, empty seq is returned.
 
dixon 
parents: 
15486 
diff
changeset
 | 
469  | 
subgoal i of gth. Note the repetition of work done for each  | 
| 
 
d8edf54cc28c
lucas - re-arranged code and added comments. Also added check to make sure the subgoal that we are being applied to exists. If it does not, empty seq is returned.
 
dixon 
parents: 
15486 
diff
changeset
 | 
470  | 
assumption, i.e. this can be made more efficient for search over  | 
| 
 
d8edf54cc28c
lucas - re-arranged code and added comments. Also added check to make sure the subgoal that we are being applied to exists. If it does not, empty seq is returned.
 
dixon 
parents: 
15486 
diff
changeset
 | 
471  | 
multiple assumptions. *)  | 
| 16978 | 472  | 
fun prep_subst_in_asm i gth j =  | 
473  | 
let  | 
|
| 15481 | 474  | 
val th = Thm.incr_indexes 1 gth;  | 
475  | 
val tgt_term = Thm.prop_of th;  | 
|
476  | 
||
| 22578 | 477  | 
val sgn = Thm.theory_of_thm th;  | 
| 15481 | 478  | 
val ctermify = Thm.cterm_of sgn;  | 
479  | 
val trivify = Thm.trivial o ctermify;  | 
|
480  | 
||
481  | 
val (fixedbody, fvs) = IsaND.fix_alls_term i tgt_term;  | 
|
482  | 
val cfvs = rev (map ctermify fvs);  | 
|
483  | 
||
| 
18011
 
685d95c793ff
cleaned up nth, nth_update, nth_map and nth_string functions
 
haftmann 
parents: 
17795 
diff
changeset
 | 
484  | 
val asmt = nth (Logic.strip_imp_prems fixedbody) (j - 1);  | 
| 
15538
 
d8edf54cc28c
lucas - re-arranged code and added comments. Also added check to make sure the subgoal that we are being applied to exists. If it does not, empty seq is returned.
 
dixon 
parents: 
15486 
diff
changeset
 | 
485  | 
val asm_nprems = length (Logic.strip_imp_prems asmt);  | 
| 
 
d8edf54cc28c
lucas - re-arranged code and added comments. Also added check to make sure the subgoal that we are being applied to exists. If it does not, empty seq is returned.
 
dixon 
parents: 
15486 
diff
changeset
 | 
486  | 
|
| 
 
d8edf54cc28c
lucas - re-arranged code and added comments. Also added check to make sure the subgoal that we are being applied to exists. If it does not, empty seq is returned.
 
dixon 
parents: 
15486 
diff
changeset
 | 
487  | 
val pth = trivify asmt;  | 
| 
27033
 
6ef5134fc631
fixed bug: maxidx was wrongly calculuated from term, now calculated
 
dixon 
parents: 
23064 
diff
changeset
 | 
488  | 
val maxidx = Thm.maxidx_of th;  | 
| 
15538
 
d8edf54cc28c
lucas - re-arranged code and added comments. Also added check to make sure the subgoal that we are being applied to exists. If it does not, empty seq is returned.
 
dixon 
parents: 
15486 
diff
changeset
 | 
489  | 
|
| 
19835
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
490  | 
val ft = ((Z.move_down_right (* trueprop *)  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
491  | 
o Z.mktop  | 
| 
16004
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
492  | 
o Thm.prop_of) pth)  | 
| 
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
493  | 
in ((cfvs, j, asm_nprems, pth), (sgn, maxidx, ft)) end;  | 
| 15481 | 494  | 
|
| 
15538
 
d8edf54cc28c
lucas - re-arranged code and added comments. Also added check to make sure the subgoal that we are being applied to exists. If it does not, empty seq is returned.
 
dixon 
parents: 
15486 
diff
changeset
 | 
495  | 
(* prepare subst in every possible assumption *)  | 
| 16978 | 496  | 
fun prep_subst_in_asms i gth =  | 
| 
16004
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
497  | 
map (prep_subst_in_asm i gth)  | 
| 
19835
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
498  | 
((fn l => Library.upto (1, length l))  | 
| 
16004
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
499  | 
(Logic.prems_of_goal (Thm.prop_of gth) i));  | 
| 
15538
 
d8edf54cc28c
lucas - re-arranged code and added comments. Also added check to make sure the subgoal that we are being applied to exists. If it does not, empty seq is returned.
 
dixon 
parents: 
15486 
diff
changeset
 | 
500  | 
|
| 
 
d8edf54cc28c
lucas - re-arranged code and added comments. Also added check to make sure the subgoal that we are being applied to exists. If it does not, empty seq is returned.
 
dixon 
parents: 
15486 
diff
changeset
 | 
501  | 
|
| 
 
d8edf54cc28c
lucas - re-arranged code and added comments. Also added check to make sure the subgoal that we are being applied to exists. If it does not, empty seq is returned.
 
dixon 
parents: 
15486 
diff
changeset
 | 
502  | 
(* substitute in an assumption using an object or meta level equality *)  | 
| 18598 | 503  | 
fun eqsubst_asm_tac' ctxt searchf skipocc instepthm i th =  | 
| 16978 | 504  | 
let  | 
| 
16004
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
505  | 
val asmpreps = prep_subst_in_asms i th;  | 
| 18598 | 506  | 
val stepthms = Seq.of_list (prep_meta_eq ctxt instepthm);  | 
| 
16004
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
507  | 
fun rewrite_with_thm r =  | 
| 
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
508  | 
let val (lhs,_) = Logic.dest_equals (Thm.concl_of r)  | 
| 
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
509  | 
fun occ_search occ [] = Seq.empty  | 
| 
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
510  | 
| occ_search occ ((asminfo, searchinfo)::moreasms) =  | 
| 16978 | 511  | 
(case searchf searchinfo occ lhs of  | 
| 
19835
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
512  | 
SkipMore i => occ_search i moreasms  | 
| 
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
513  | 
| SkipSeq ss =>  | 
| 19861 | 514  | 
Seq.append (Seq.map (Library.pair asminfo) (Seq.flat ss))  | 
515  | 
(occ_search 1 moreasms))  | 
|
| 
16004
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
516  | 
(* find later substs also *)  | 
| 16978 | 517  | 
in  | 
| 18598 | 518  | 
occ_search skipocc asmpreps |> Seq.maps (apply_subst_in_asm i th r)  | 
| 
16004
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
519  | 
end;  | 
| 18598 | 520  | 
in stepthms |> Seq.maps rewrite_with_thm end;  | 
| 
15538
 
d8edf54cc28c
lucas - re-arranged code and added comments. Also added check to make sure the subgoal that we are being applied to exists. If it does not, empty seq is returned.
 
dixon 
parents: 
15486 
diff
changeset
 | 
521  | 
|
| 
16004
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
522  | 
|
| 16978 | 523  | 
fun skip_first_asm_occs_search searchf sinfo occ lhs =  | 
| 
19835
 
81d6dc597559
added updated version of IsaPlanner and substitution.
 
dixon 
parents: 
19473 
diff
changeset
 | 
524  | 
skipto_skipseq occ (searchf sinfo lhs);  | 
| 
16004
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
525  | 
|
| 18598 | 526  | 
fun eqsubst_asm_tac ctxt occL thms i th =  | 
| 16978 | 527  | 
let val nprems = Thm.nprems_of th  | 
| 
15538
 
d8edf54cc28c
lucas - re-arranged code and added comments. Also added check to make sure the subgoal that we are being applied to exists. If it does not, empty seq is returned.
 
dixon 
parents: 
15486 
diff
changeset
 | 
528  | 
in  | 
| 
16004
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
529  | 
if nprems < i then Seq.empty else  | 
| 16978 | 530  | 
let val thmseq = (Seq.of_list thms)  | 
531  | 
fun apply_occ occK th =  | 
|
| 18598 | 532  | 
thmseq |> Seq.maps  | 
| 16978 | 533  | 
(fn r =>  | 
| 18598 | 534  | 
eqsubst_asm_tac' ctxt (skip_first_asm_occs_search  | 
| 19871 | 535  | 
searchf_lr_unify_valid) occK r  | 
| 
16004
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
536  | 
(i + ((Thm.nprems_of th) - nprems))  | 
| 
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
537  | 
th);  | 
| 16978 | 538  | 
val sortedoccs =  | 
| 
16004
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
539  | 
Library.sort (Library.rev_order o Library.int_ord) occL  | 
| 
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
540  | 
in  | 
| 
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
541  | 
Seq.map distinct_subgoals  | 
| 
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
542  | 
(Seq.EVERY (map apply_occ sortedoccs) th)  | 
| 
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
543  | 
end  | 
| 
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
544  | 
end  | 
| 
 
031f56012483
lucas - fixed subst in assumptions to count redexes from left to right.
 
dixon 
parents: 
15959 
diff
changeset
 | 
545  | 
    handle THM _ => raise eqsubst_occL_exp ("THM",occL,thms,i,th);
 | 
| 15481 | 546  | 
|
547  | 
(* inthms are the given arguments in Isar, and treated as eqstep with  | 
|
548  | 
the first one, then the second etc *)  | 
|
| 18598 | 549  | 
fun eqsubst_asm_meth ctxt occL inthms =  | 
| 
30510
 
4120fc59dd85
unified type Proof.method and pervasive METHOD combinators;
 
wenzelm 
parents: 
30318 
diff
changeset
 | 
550  | 
SIMPLE_METHOD' (eqsubst_asm_tac ctxt occL inthms);  | 
| 15481 | 551  | 
|
552  | 
(* syntax for options, given "(asm)" will give back true, without  | 
|
553  | 
gives back false *)  | 
|
554  | 
val options_syntax =  | 
|
555  | 
(Args.parens (Args.$$$ "asm") >> (K true)) ||  | 
|
556  | 
(Scan.succeed false);  | 
|
| 
15936
 
817ac93ee786
lucas - added ability to provide multiple replacements for subst: syntax is now: subst (1 3) myrule
 
dixon 
parents: 
15929 
diff
changeset
 | 
557  | 
|
| 
15929
 
68bd1e16552a
lucas - added option to select occurance to rewrite e.g. (occ 4)
 
dixon 
parents: 
15915 
diff
changeset
 | 
558  | 
val ith_syntax =  | 
| 
36960
 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 
wenzelm 
parents: 
33243 
diff
changeset
 | 
559  | 
Scan.optional (Args.parens (Scan.repeat Parse.nat)) [0];  | 
| 15481 | 560  | 
|
| 18598 | 561  | 
(* combination method that takes a flag (true indicates that subst  | 
| 31301 | 562  | 
should be done to an assumption, false = apply to the conclusion of  | 
563  | 
the goal) as well as the theorems to use *)  | 
|
| 16978 | 564  | 
val setup =  | 
| 31301 | 565  | 
  Method.setup @{binding subst}
 | 
566  | 
(Scan.lift (options_syntax -- ith_syntax) -- Attrib.thms >>  | 
|
567  | 
(fn ((asmflag, occL), inthms) => fn ctxt =>  | 
|
568  | 
(if asmflag then eqsubst_asm_meth else eqsubst_meth) ctxt occL inthms))  | 
|
569  | 
"single-step substitution";  | 
|
| 15481 | 570  | 
|
| 16978 | 571  | 
end;  |