| author | wenzelm | 
| Wed, 07 Aug 2024 14:44:51 +0200 | |
| changeset 80661 | 231d58c412b5 | 
| parent 74887 | 56247fdb8bbb | 
| child 80684 | 5b8fccf0a48a | 
| permissions | -rw-r--r-- | 
| 60248 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 1 | (* Title: HOL/Eisbach/match_method.ML | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 2 | Author: Daniel Matichuk, NICTA/UNSW | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 3 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 4 | Setup for "match" proof method. It provides basic fact/term matching in | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 5 | addition to premise/conclusion matching through Subgoal.focus, and binds | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 6 | fact names from matches as well as term patterns within matches. | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 7 | *) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 8 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 9 | signature MATCH_METHOD = | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 10 | sig | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 11 | val focus_schematics: Proof.context -> Envir.tenv | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 12 | val focus_params: Proof.context -> term list | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 13 | (* FIXME proper ML interface for the main thing *) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 14 | end | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 15 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 16 | structure Match_Method : MATCH_METHOD = | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 17 | struct | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 18 | |
| 62133 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 19 | (* Filter premises by predicate, with premise order; recovers premise order afterwards.*) | 
| 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 20 | fun filter_prems_tac' ctxt prem = | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 21 | let | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 22 | fun Then NONE tac = SOME tac | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 23 | | Then (SOME tac) tac' = SOME (tac THEN' tac'); | 
| 62133 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 24 | fun thins idxH (tac, n, i) = | 
| 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 25 | if prem idxH then (tac, n + 1 , i) | 
| 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 26 | else (Then tac (rotate_tac n THEN' eresolve_tac ctxt [thin_rl]), 0, i + n); | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 27 | in | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 28 | SUBGOAL (fn (goal, i) => | 
| 62133 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 29 | let val idxHs = tag_list 0 (Logic.strip_assums_hyp goal) in | 
| 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 30 | (case fold thins idxHs (NONE, 0, 0) of | 
| 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 31 | (NONE, _, _) => no_tac | 
| 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 32 | | (SOME tac, _, n) => tac i THEN rotate_tac (~ n) i) | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 33 | end) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 34 | end; | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 35 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 36 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 37 | datatype match_kind = | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 38 | Match_Term of term Item_Net.T | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 39 | | Match_Fact of thm Item_Net.T | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 40 | | Match_Concl | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 41 | | Match_Prems of bool; | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 42 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 43 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 44 | val aconv_net = Item_Net.init (op aconv) single; | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 45 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 46 | val parse_match_kind = | 
| 69593 | 47 | Scan.lift \<^keyword>\<open>conclusion\<close> >> K Match_Concl || | 
| 48 | Scan.lift (\<^keyword>\<open>premises\<close> |-- Args.mode "local") >> Match_Prems || | |
| 49 | Scan.lift (\<^keyword>\<open>(\<close>) |-- Args.term --| Scan.lift (\<^keyword>\<open>)\<close>) >> | |
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 50 | (fn t => Match_Term (Item_Net.update t aconv_net)) || | 
| 74152 | 51 | Attrib.thms >> (fn thms => Match_Fact (fold Item_Net.update thms Thm.item_net)); | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 52 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 53 | |
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 54 | fun nameable_match m = (case m of Match_Fact _ => true | Match_Prems _ => true | _ => false); | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 55 | fun prop_match m = (case m of Match_Term _ => false | _ => true); | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 56 | |
| 63185 
08369e33c185
apply current morphism to method text before evaluating;
 matichuk <daniel.matichuk@nicta.com.au> parents: 
62165diff
changeset | 57 | val bound_thm : (thm, binding) Parse_Tools.parse_val parser = | 
| 
08369e33c185
apply current morphism to method text before evaluating;
 matichuk <daniel.matichuk@nicta.com.au> parents: 
62165diff
changeset | 58 | Parse_Tools.parse_thm_val Parse.binding; | 
| 
08369e33c185
apply current morphism to method text before evaluating;
 matichuk <daniel.matichuk@nicta.com.au> parents: 
62165diff
changeset | 59 | |
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 60 | val bound_term : (term, binding) Parse_Tools.parse_val parser = | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 61 | Parse_Tools.parse_term_val Parse.binding; | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 62 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 63 | val fixes = | 
| 60287 
adde5ce1e0a7
updated Eisbach, using version 134bc592909c of its Bitbucket repository;
 wenzelm parents: 
60285diff
changeset | 64 | Parse.and_list1 (Scan.repeat1 (Parse.position bound_term) -- | 
| 69593 | 65 | Scan.option (\<^keyword>\<open>::\<close> |-- Parse.!!! Parse.typ) | 
| 60287 
adde5ce1e0a7
updated Eisbach, using version 134bc592909c of its Bitbucket repository;
 wenzelm parents: 
60285diff
changeset | 66 | >> (fn (xs, T) => map (fn (x, pos) => ((x, T), pos)) xs)) >> flat; | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 67 | |
| 69593 | 68 | val for_fixes = Scan.optional (\<^keyword>\<open>for\<close> |-- fixes) []; | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 69 | |
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 70 | fun pos_of dyn = Parse_Tools.the_parse_val dyn |> Binding.pos_of; | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 71 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 72 | (*FIXME: Dynamic facts modify the background theory, so we have to resort | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 73 | to token replacement for matched facts. *) | 
| 61814 
1ca1142e1711
clarified type Token.src: plain token list, with usual implicit value assignment;
 wenzelm parents: 
60949diff
changeset | 74 | val dynamic_fact = | 
| 63185 
08369e33c185
apply current morphism to method text before evaluating;
 matichuk <daniel.matichuk@nicta.com.au> parents: 
62165diff
changeset | 75 | Scan.lift bound_thm -- Attrib.opt_attribs; | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 76 | |
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 77 | type match_args = {multi : bool, cut : int};
 | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 78 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 79 | val parse_match_args = | 
| 61835 | 80 | Scan.optional | 
| 81 | (Args.parens | |
| 82 | (Parse.enum1 "," | |
| 83 |         (Args.$$$ "multi" >> (fn _ => fn {cut, ...} => {multi = true, cut = cut}) ||
 | |
| 84 | Args.$$$ "cut" |-- Scan.optional Parse.nat 1 | |
| 85 |           >> (fn n => fn {multi, ...} => {multi = multi, cut = n})))) []
 | |
| 86 |   >> (fn fs => fold I fs {multi = false, cut = ~1});
 | |
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 87 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 88 | fun parse_named_pats match_kind = | 
| 61814 
1ca1142e1711
clarified type Token.src: plain token list, with usual implicit value assignment;
 wenzelm parents: 
60949diff
changeset | 89 | Args.context -- | 
| 
1ca1142e1711
clarified type Token.src: plain token list, with usual implicit value assignment;
 wenzelm parents: 
60949diff
changeset | 90 | Parse.and_list1' | 
| 
1ca1142e1711
clarified type Token.src: plain token list, with usual implicit value assignment;
 wenzelm parents: 
60949diff
changeset | 91 | (Scan.option (dynamic_fact --| Scan.lift Args.colon) :-- | 
| 
1ca1142e1711
clarified type Token.src: plain token list, with usual implicit value assignment;
 wenzelm parents: 
60949diff
changeset | 92 | (fn opt_dyn => | 
| 
1ca1142e1711
clarified type Token.src: plain token list, with usual implicit value assignment;
 wenzelm parents: 
60949diff
changeset | 93 | if is_none opt_dyn orelse nameable_match match_kind | 
| 
1ca1142e1711
clarified type Token.src: plain token list, with usual implicit value assignment;
 wenzelm parents: 
60949diff
changeset | 94 | then Scan.lift (Parse_Tools.name_term -- parse_match_args) | 
| 
1ca1142e1711
clarified type Token.src: plain token list, with usual implicit value assignment;
 wenzelm parents: 
60949diff
changeset | 95 | else | 
| 
1ca1142e1711
clarified type Token.src: plain token list, with usual implicit value assignment;
 wenzelm parents: 
60949diff
changeset | 96 | let val b = #1 (the opt_dyn) | 
| 
1ca1142e1711
clarified type Token.src: plain token list, with usual implicit value assignment;
 wenzelm parents: 
60949diff
changeset | 97 |           in error ("Cannot bind fact name in term match" ^ Position.here (pos_of b)) end)) --
 | 
| 74887 | 98 | Scan.lift (for_fixes -- (\<^keyword>\<open>\<Rightarrow>\<close> |-- Parse.token Parse.embedded)) | 
| 61912 
ad710de5c576
more standard nesting of sub-language: Parse.text allows atomic entities without quotes;
 wenzelm parents: 
61852diff
changeset | 99 | >> (fn ((ctxt, ts), (fixes, body)) => | 
| 
ad710de5c576
more standard nesting of sub-language: Parse.text allows atomic entities without quotes;
 wenzelm parents: 
61852diff
changeset | 100 | (case Token.get_value body of | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 101 | SOME (Token.Source src) => | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 102 | let | 
| 63527 | 103 | val text = Method.read ctxt src; | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 104 | val ts' = | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 105 | map | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 106 | (fn (b, (Parse_Tools.Real_Val v, match_args)) => | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 107 | ((Option.map (fn (b, att) => | 
| 60248 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 108 | (Parse_Tools.the_real_val b, att)) b, match_args), v) | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 109 | | _ => raise Fail "Expected closed term") ts | 
| 60248 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 110 | val fixes' = map (fn ((p, _), _) => Parse_Tools.the_real_val p) fixes | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 111 | in (ts', fixes', text) end | 
| 61818 | 112 | | _ => | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 113 | let | 
| 60469 | 114 | val (fix_names, ctxt3) = ctxt | 
| 115 | |> Proof_Context.add_fixes_cmd | |
| 116 | (map (fn ((pb, otyp), _) => (Parse_Tools.the_parse_val pb, otyp, NoSyn)) fixes) | |
| 117 | ||> Proof_Context.set_mode Proof_Context.mode_schematic; | |
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 118 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 119 | fun parse_term term = | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 120 | if prop_match match_kind | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 121 | then Syntax.parse_prop ctxt3 term | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 122 | else Syntax.parse_term ctxt3 term; | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 123 | |
| 62134 
2405ab06d5b1
remove Eisbach's dependency on HOL
 matichuk <daniel.matichuk@nicta.com.au> parents: 
62133diff
changeset | 124 | fun drop_judgment_dummy t = | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 125 | (case t of | 
| 62134 
2405ab06d5b1
remove Eisbach's dependency on HOL
 matichuk <daniel.matichuk@nicta.com.au> parents: 
62133diff
changeset | 126 | Const (judgment, _) $ | 
| 69593 | 127 | (Const (\<^syntax_const>\<open>_type_constraint_\<close>, T) $ | 
| 128 | Const (\<^const_name>\<open>Pure.dummy_pattern\<close>, _)) => | |
| 62134 
2405ab06d5b1
remove Eisbach's dependency on HOL
 matichuk <daniel.matichuk@nicta.com.au> parents: 
62133diff
changeset | 129 | if judgment = Object_Logic.judgment_name ctxt then | 
| 69593 | 130 | Const (\<^syntax_const>\<open>_type_constraint_\<close>, T) $ | 
| 131 | Const (\<^const_name>\<open>Pure.dummy_pattern\<close>, propT) | |
| 62134 
2405ab06d5b1
remove Eisbach's dependency on HOL
 matichuk <daniel.matichuk@nicta.com.au> parents: 
62133diff
changeset | 132 | else t | 
| 
2405ab06d5b1
remove Eisbach's dependency on HOL
 matichuk <daniel.matichuk@nicta.com.au> parents: 
62133diff
changeset | 133 | | t1 $ t2 => drop_judgment_dummy t1 $ drop_judgment_dummy t2 | 
| 
2405ab06d5b1
remove Eisbach's dependency on HOL
 matichuk <daniel.matichuk@nicta.com.au> parents: 
62133diff
changeset | 134 | | Abs (a, T, b) => Abs (a, T, drop_judgment_dummy b) | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 135 | | _ => t); | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 136 | |
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 137 | val pats = | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 138 | map (fn (_, (term, _)) => parse_term (Parse_Tools.the_parse_val term)) ts | 
| 62134 
2405ab06d5b1
remove Eisbach's dependency on HOL
 matichuk <daniel.matichuk@nicta.com.au> parents: 
62133diff
changeset | 139 | |> map drop_judgment_dummy | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 140 | |> (fn ts => fold_map Term.replace_dummy_patterns ts (Variable.maxidx_of ctxt3 + 1)) | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 141 | |> fst | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 142 | |> Syntax.check_terms ctxt3; | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 143 | |
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 144 | val pat_fixes = fold (Term.add_frees) pats [] |> map fst; | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 145 | |
| 60248 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 146 | val _ = | 
| 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 147 | map2 (fn nm => fn (_, pos) => | 
| 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 148 | member (op =) pat_fixes nm orelse | 
| 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 149 |                 error ("For-fixed variable must be bound in some pattern" ^ Position.here pos))
 | 
| 60407 | 150 | fix_names fixes; | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 151 | |
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 152 | val _ = map (Term.map_types Type.no_tvars) pats; | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 153 | |
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 154 | val ctxt4 = fold Variable.declare_term pats ctxt3; | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 155 | |
| 60407 | 156 | val (real_fixes, ctxt5) = ctxt4 | 
| 157 | |> fold_map Proof_Context.inferred_param fix_names |>> map Free; | |
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 158 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 159 | fun reject_extra_free (Free (x, _)) () = | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 160 | if Variable.is_fixed ctxt5 x then () | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 161 |                 else error ("Illegal use of free (unfixed) variable " ^ quote x)
 | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 162 | | reject_extra_free _ () = (); | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 163 | val _ = (fold o fold_aterms) reject_extra_free pats (); | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 164 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 165 | val binds = | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 166 | map (fn (b, _) => Option.map (fn (b, att) => (Parse_Tools.the_parse_val b, att)) b) ts; | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 167 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 168 | fun upd_ctxt (SOME (b, att)) pat (tms, ctxt) = | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 169 | let | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 170 | val ([nm], ctxt') = | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 171 | Variable.variant_fixes [Name.internal (Binding.name_of b)] ctxt; | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 172 | val abs_nms = Term.strip_all_vars pat; | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 173 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 174 | val param_thm = map (Drule.mk_term o Thm.cterm_of ctxt' o Free) abs_nms | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 175 | |> Conjunction.intr_balanced | 
| 74266 | 176 | |> Drule.generalize (Names.empty, Names.make_set (map fst abs_nms)) | 
| 61852 | 177 | |> Thm.tag_free_dummy; | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 178 | |
| 60248 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 179 | val atts = map (Attrib.attribute ctxt') att; | 
| 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 180 | val (param_thm', ctxt'') = Thm.proof_attributes atts param_thm ctxt'; | 
| 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 181 | |
| 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 182 | fun label_thm thm = | 
| 60367 | 183 | Thm.cterm_of ctxt'' (Free (nm, propT)) | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 184 | |> Drule.mk_term | 
| 60248 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 185 | |> not (null abs_nms) ? Conjunction.intr thm | 
| 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 186 | |
| 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 187 | val [head_thm, body_thm] = | 
| 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 188 | Drule.zero_var_indexes_list (map label_thm [param_thm, param_thm']) | 
| 61852 | 189 | |> map Thm.tag_free_dummy; | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 190 | |
| 60248 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 191 | val ctxt''' = | 
| 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 192 | Attrib.local_notes "" [((b, []), [([body_thm], [])])] ctxt'' | 
| 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 193 | |> snd | 
| 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 194 | |> Variable.declare_maxidx (Thm.maxidx_of head_thm); | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 195 | in | 
| 63185 
08369e33c185
apply current morphism to method text before evaluating;
 matichuk <daniel.matichuk@nicta.com.au> parents: 
62165diff
changeset | 196 | (SOME (head_thm, att) :: tms, ctxt''') | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 197 | end | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 198 | | upd_ctxt NONE _ (tms, ctxt) = (NONE :: tms, ctxt); | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 199 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 200 | val (binds, ctxt6) = ctxt5 | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 201 | |> (fn ctxt => fold2 upd_ctxt binds pats ([], ctxt) |> apfst rev) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 202 | ||> Proof_Context.restore_mode ctxt; | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 203 | |
| 63527 | 204 | val (text, src) = Method.read_closure_input ctxt6 (Token.input_of body); | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 205 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 206 | val morphism = | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 207 | Variable.export_morphism ctxt6 | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 208 | (ctxt | 
| 61814 
1ca1142e1711
clarified type Token.src: plain token list, with usual implicit value assignment;
 wenzelm parents: 
60949diff
changeset | 209 | |> fold Token.declare_maxidx src | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 210 | |> Variable.declare_maxidx (Variable.maxidx_of ctxt6)); | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 211 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 212 | val pats' = map (Term.map_types Type_Infer.paramify_vars #> Morphism.term morphism) pats; | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 213 | val _ = ListPair.app (fn ((_, (v, _)), t) => Parse_Tools.the_parse_fun v t) (ts, pats'); | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 214 | |
| 60248 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 215 | fun close_src src = | 
| 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 216 | let | 
| 61814 
1ca1142e1711
clarified type Token.src: plain token list, with usual implicit value assignment;
 wenzelm parents: 
60949diff
changeset | 217 | val src' = src |> map (Token.closure #> Token.transform morphism); | 
| 60248 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 218 | val _ = | 
| 61814 
1ca1142e1711
clarified type Token.src: plain token list, with usual implicit value assignment;
 wenzelm parents: 
60949diff
changeset | 219 | (Token.args_of_src src ~~ Token.args_of_src src') | 
| 
1ca1142e1711
clarified type Token.src: plain token list, with usual implicit value assignment;
 wenzelm parents: 
60949diff
changeset | 220 | |> List.app (fn (tok, tok') => | 
| 
1ca1142e1711
clarified type Token.src: plain token list, with usual implicit value assignment;
 wenzelm parents: 
60949diff
changeset | 221 | (case Token.get_value tok' of | 
| 
1ca1142e1711
clarified type Token.src: plain token list, with usual implicit value assignment;
 wenzelm parents: 
60949diff
changeset | 222 | SOME value => ignore (Token.assign (SOME value) tok) | 
| 
1ca1142e1711
clarified type Token.src: plain token list, with usual implicit value assignment;
 wenzelm parents: 
60949diff
changeset | 223 | | NONE => ())); | 
| 60248 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 224 | in src' end; | 
| 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 225 | |
| 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 226 | val binds' = | 
| 63185 
08369e33c185
apply current morphism to method text before evaluating;
 matichuk <daniel.matichuk@nicta.com.au> parents: 
62165diff
changeset | 227 | map (Option.map (fn (t, atts) => (Morphism.thm morphism t, map close_src atts))) binds; | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 228 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 229 | val _ = | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 230 | ListPair.app | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 231 | (fn ((SOME ((v, _)), _), SOME (t, _)) => Parse_Tools.the_parse_fun v t | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 232 | | ((NONE, _), NONE) => () | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 233 | | _ => error "Mismatch between real and parsed bound variables") | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 234 | (ts, binds'); | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 235 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 236 | val real_fixes' = map (Morphism.term morphism) real_fixes; | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 237 | val _ = | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 238 | ListPair.app (fn (((v, _) , _), t) => Parse_Tools.the_parse_fun v t) | 
| 60248 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 239 | (fixes, real_fixes'); | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 240 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 241 | val match_args = map (fn (_, (_, match_args)) => match_args) ts; | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 242 | val binds'' = (binds' ~~ match_args) ~~ pats'; | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 243 | |
| 61814 
1ca1142e1711
clarified type Token.src: plain token list, with usual implicit value assignment;
 wenzelm parents: 
60949diff
changeset | 244 | val src' = map (Token.transform morphism) src; | 
| 61912 
ad710de5c576
more standard nesting of sub-language: Parse.text allows atomic entities without quotes;
 wenzelm parents: 
61852diff
changeset | 245 | val _ = Token.assign (SOME (Token.Source src')) body; | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 246 | in | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 247 | (binds'', real_fixes', text) | 
| 61814 
1ca1142e1711
clarified type Token.src: plain token list, with usual implicit value assignment;
 wenzelm parents: 
60949diff
changeset | 248 | end)); | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 249 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 250 | |
| 63185 
08369e33c185
apply current morphism to method text before evaluating;
 matichuk <daniel.matichuk@nicta.com.au> parents: 
62165diff
changeset | 251 | fun dest_internal_term t = | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 252 | (case try Logic.dest_conjunction t of | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 253 | SOME (params, head) => | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 254 | (params |> Logic.dest_conjunctions |> map Logic.dest_term, | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 255 | head |> Logic.dest_term) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 256 | | NONE => ([], t |> Logic.dest_term)); | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 257 | |
| 63185 
08369e33c185
apply current morphism to method text before evaluating;
 matichuk <daniel.matichuk@nicta.com.au> parents: 
62165diff
changeset | 258 | fun dest_internal_fact thm = dest_internal_term (Thm.prop_of thm); | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 259 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 260 | fun inst_thm ctxt env ts params thm = | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 261 | let | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 262 | val ts' = map (Envir.norm_term env) ts; | 
| 60791 | 263 | val insts = map (#1 o dest_Var) ts' ~~ map (Thm.cterm_of ctxt) params; | 
| 264 | in infer_instantiate ctxt insts thm end; | |
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 265 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 266 | fun do_inst fact_insts' env text ctxt = | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 267 | let | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 268 | val fact_insts = | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 269 | map_filter | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 270 | (fn ((((SOME ((_, head), att), _), _), _), thms) => SOME (head, (thms, att)) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 271 | | _ => NONE) fact_insts'; | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 272 | |
| 73553 | 273 | fun try_dest_term thm = \<^try>\<open>#2 (dest_internal_fact thm)\<close>; | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 274 | |
| 60248 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 275 | fun expand_fact fact_insts thm = | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 276 | the_default [thm] | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 277 | (case try_dest_term thm of | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 278 | SOME t_ident => AList.lookup (op aconv) fact_insts t_ident | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 279 | | NONE => NONE); | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 280 | |
| 60248 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 281 | fun fact_morphism fact_insts = | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 282 | Morphism.term_morphism "do_inst.term" (Envir.norm_term env) $> | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 283 | Morphism.typ_morphism "do_inst.type" (Envir.norm_type (Envir.type_env env)) $> | 
| 60248 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 284 | Morphism.fact_morphism "do_inst.fact" (maps (expand_fact fact_insts)); | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 285 | |
| 60248 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 286 | fun apply_attribute (head, (fact, atts)) (fact_insts, ctxt) = | 
| 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 287 | let | 
| 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 288 | val morphism = fact_morphism fact_insts; | 
| 61814 
1ca1142e1711
clarified type Token.src: plain token list, with usual implicit value assignment;
 wenzelm parents: 
60949diff
changeset | 289 | val atts' = map (Attrib.attribute ctxt o map (Token.transform morphism)) atts; | 
| 60248 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 290 | val (fact'', ctxt') = fold_map (Thm.proof_attributes atts') fact ctxt; | 
| 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 291 | in ((head, fact'') :: fact_insts, ctxt') end; | 
| 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 292 | |
| 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 293 | (*TODO: What to do about attributes that raise errors?*) | 
| 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 294 | val (fact_insts', ctxt') = fold_rev (apply_attribute) fact_insts ([], ctxt); | 
| 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 295 | |
| 61814 
1ca1142e1711
clarified type Token.src: plain token list, with usual implicit value assignment;
 wenzelm parents: 
60949diff
changeset | 296 | val text' = (Method.map_source o map) (Token.transform (fact_morphism fact_insts')) text; | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 297 | in | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 298 | (text', ctxt') | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 299 | end; | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 300 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 301 | fun prep_fact_pat ((x, args), pat) ctxt = | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 302 | let | 
| 60695 
757549b4bbe6
Variable.focus etc.: optional bindings provided by user;
 wenzelm parents: 
60642diff
changeset | 303 | val ((params, pat'), ctxt') = Variable.focus NONE pat ctxt; | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 304 | val params' = map (Free o snd) params; | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 305 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 306 | val morphism = | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 307 | Variable.export_morphism ctxt' | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 308 | (ctxt |> Variable.declare_maxidx (Variable.maxidx_of ctxt')); | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 309 | val pat'' :: params'' = map (Morphism.term morphism) (pat' :: params'); | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 310 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 311 | fun prep_head (t, att) = (dest_internal_fact t, att); | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 312 | in | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 313 | ((((Option.map prep_head x, args), params''), pat''), ctxt') | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 314 | end; | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 315 | |
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 316 | fun morphism_env morphism env = | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 317 | let | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 318 | val tenv = Envir.term_env env | 
| 60248 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 319 | |> Vartab.map (K (fn (T, t) => (Morphism.typ morphism T, Morphism.term morphism t))); | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 320 | val tyenv = Envir.type_env env | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 321 | |> Vartab.map (K (fn (S, T) => (S, Morphism.typ morphism T))); | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 322 |    in Envir.Envir {maxidx = Envir.maxidx_of env, tenv = tenv, tyenv = tyenv} end;
 | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 323 | |
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 324 | fun export_with_params ctxt morphism (SOME ts, params) thm env = | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 325 | let | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 326 | val outer_env = morphism_env morphism env; | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 327 | val thm' = Morphism.thm morphism thm; | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 328 | in inst_thm ctxt outer_env params ts thm' end | 
| 60552 | 329 | | export_with_params _ morphism (NONE, _) thm _ = Morphism.thm morphism thm; | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 330 | |
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 331 | fun match_filter_env is_newly_fixed pat_vars fixes params env = | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 332 | let | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 333 | val param_vars = map Term.dest_Var params; | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 334 | |
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 335 | val tenv = Envir.term_env env; | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 336 | val params' = map (fn (xi, _) => Vartab.lookup tenv xi) param_vars; | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 337 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 338 | val fixes_vars = map Term.dest_Var fixes; | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 339 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 340 | val all_vars = Vartab.keys tenv; | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 341 | val extra_vars = subtract (fn ((xi, _), xi') => xi = xi') fixes_vars all_vars; | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 342 | |
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 343 | val tenv' = tenv |> fold (Vartab.delete_safe) extra_vars; | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 344 | val env' = | 
| 61846 | 345 |       Envir.Envir {maxidx = Envir.maxidx_of env, tenv = tenv', tyenv = Envir.type_env env};
 | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 346 | |
| 60552 | 347 | val all_params_bound = forall (fn SOME (_, Free (x, _)) => is_newly_fixed x | _ => false) params'; | 
| 61846 | 348 | val all_params_distinct = not (has_duplicates (eq_option (eq_pair (op =) (op aconv))) params'); | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 349 | |
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 350 | val pat_fixes = inter (eq_fst (op =)) fixes_vars pat_vars; | 
| 60248 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 351 | val all_pat_fixes_bound = forall (fn (xi, _) => is_some (Vartab.lookup tenv' xi)) pat_fixes; | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 352 | in | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 353 | if all_params_bound andalso all_pat_fixes_bound andalso all_params_distinct | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 354 | then SOME env' | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 355 | else NONE | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 356 | end; | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 357 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 358 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 359 | (* Slightly hacky way of uniquely identifying focus premises *) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 360 | val prem_idN = "premise_id"; | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 361 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 362 | fun prem_id_eq ((id, _ : thm), (id', _ : thm)) = id = id'; | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 363 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 364 | val prem_rules : (int * thm) Item_Net.T = | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 365 | Item_Net.init prem_id_eq (single o Thm.full_prop_of o snd); | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 366 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 367 | fun raw_thm_to_id thm = | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 368 | (case Properties.get (Thm.get_tags thm) prem_idN of NONE => NONE | SOME id => Int.fromString id) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 369 | |> the_default ~1; | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 370 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 371 | structure Focus_Data = Proof_Data | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 372 | ( | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 373 | type T = | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 374 | (int * (int * thm) Item_Net.T) * (*prems*) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 375 | Envir.tenv * (*schematics*) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 376 | term list (*params*) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 377 | fun init _ : T = ((0, prem_rules), Vartab.empty, []) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 378 | ); | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 379 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 380 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 381 | (* focus prems *) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 382 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 383 | val focus_prems = #1 o Focus_Data.get; | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 384 | |
| 62133 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 385 | fun transfer_focus_prems from_ctxt = | 
| 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 386 |   Focus_Data.map (@{apply 3(1)} (K (focus_prems from_ctxt)))
 | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 387 | |
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 388 | |
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 389 | fun add_focus_prem prem = | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 390 | `(Focus_Data.get #> #1 #> #1) ##> | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 391 |   (Focus_Data.map o @{apply 3(1)}) (fn (next, net) =>
 | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 392 | (next + 1, Item_Net.update (next, Thm.tag_rule (prem_idN, string_of_int next) prem) net)); | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 393 | |
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 394 | fun remove_focus_prem' (ident, thm) = | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 395 |   (Focus_Data.map o @{apply 3(1)} o apsnd)
 | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 396 | (Item_Net.remove (ident, thm)); | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 397 | |
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 398 | fun remove_focus_prem thm = remove_focus_prem' (raw_thm_to_id thm, thm); | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 399 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 400 | (*TODO: Preliminary analysis to see if we're trying to clear in a non-focus match?*) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 401 | val _ = | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 402 | Theory.setup | 
| 69593 | 403 | (Attrib.setup \<^binding>\<open>thin\<close> | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 404 | (Scan.succeed | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 405 | (Thm.declaration_attribute (fn th => Context.mapping I (remove_focus_prem th)))) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 406 | "clear premise inside match method"); | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 407 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 408 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 409 | (* focus schematics *) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 410 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 411 | val focus_schematics = #2 o Focus_Data.get; | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 412 | |
| 60642 
48dd1cefb4ae
simplified Thm.instantiate and derivatives: the LHS refers to non-certified variables -- this merely serves as index into already certified structures (or is ignored);
 wenzelm parents: 
60553diff
changeset | 413 | fun add_focus_schematics schematics = | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 414 |   (Focus_Data.map o @{apply 3(2)})
 | 
| 60642 
48dd1cefb4ae
simplified Thm.instantiate and derivatives: the LHS refers to non-certified variables -- this merely serves as index into already certified structures (or is ignored);
 wenzelm parents: 
60553diff
changeset | 415 | (fold (fn ((xi, T), ct) => Vartab.update_new (xi, (T, Thm.term_of ct))) schematics); | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 416 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 417 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 418 | (* focus params *) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 419 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 420 | val focus_params = #3 o Focus_Data.get; | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 421 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 422 | fun add_focus_params params = | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 423 |   (Focus_Data.map o @{apply 3(3)})
 | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 424 | (append (map (fn (_, ct) => Thm.term_of ct) params)); | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 425 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 426 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 427 | (* Add focus elements as proof data *) | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 428 | fun augment_focus (focus: Subgoal.focus) : (int list * Subgoal.focus) = | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 429 | let | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 430 |     val {context, params, prems, asms, concl, schematics} = focus;
 | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 431 | |
| 60552 | 432 | val (prem_ids, ctxt') = context | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 433 | |> add_focus_params params | 
| 74282 | 434 | |> add_focus_schematics (Vars.dest (snd schematics)) | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 435 | |> fold_map add_focus_prem (rev prems) | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 436 | |
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 437 | in | 
| 60552 | 438 | (prem_ids, | 
| 62133 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 439 |       {context = ctxt',
 | 
| 60552 | 440 | params = params, | 
| 441 | prems = prems, | |
| 442 | concl = concl, | |
| 443 | schematics = schematics, | |
| 444 | asms = asms}) | |
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 445 | end; | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 446 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 447 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 448 | (* Fix schematics in the goal *) | 
| 60695 
757549b4bbe6
Variable.focus etc.: optional bindings provided by user;
 wenzelm parents: 
60642diff
changeset | 449 | fun focus_concl ctxt i bindings goal = | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 450 | let | 
| 60367 | 451 |     val ({context = ctxt', concl, params, prems, asms, schematics}, goal') =
 | 
| 60695 
757549b4bbe6
Variable.focus etc.: optional bindings provided by user;
 wenzelm parents: 
60642diff
changeset | 452 | Subgoal.focus_params ctxt i bindings goal; | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 453 | |
| 74221 | 454 | val ((_, inst), ctxt'') = Variable.import_inst true [Thm.term_of concl] ctxt'; | 
| 455 | val schematic_terms = | |
| 74266 | 456 | Vars.fold (fn (v, t) => cons (v, Thm.cterm_of ctxt'' t)) inst []; | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 457 | |
| 74282 | 458 | val goal'' = Thm.instantiate (TVars.empty, Vars.make schematic_terms) goal'; | 
| 459 | val concl' = Thm.instantiate_cterm (TVars.empty, Vars.make schematic_terms) concl; | |
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 460 | val (schematic_types, schematic_terms') = schematics; | 
| 74282 | 461 | val schematics' = (schematic_types, fold Vars.add schematic_terms schematic_terms'); | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 462 | in | 
| 60367 | 463 |     ({context = ctxt'', concl = concl', params = params, prems = prems,
 | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 464 | schematics = schematics', asms = asms} : Subgoal.focus, goal'') | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 465 | end; | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 466 | |
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 467 | |
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 468 | fun deduplicate eq prev seq = | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 469 | Seq.make (fn () => | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 470 | (case Seq.pull seq of | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 471 | SOME (x, seq') => | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 472 | if member eq prev x | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 473 | then Seq.pull (deduplicate eq prev seq') | 
| 60248 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 474 | else SOME (x, deduplicate eq (x :: prev) seq') | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 475 | | NONE => NONE)); | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 476 | |
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 477 | |
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 478 | fun consistent_env env = | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 479 | let | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 480 | val tenv = Envir.term_env env; | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 481 | val tyenv = Envir.type_env env; | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 482 | in | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 483 | forall (fn (_, (T, t)) => Envir.norm_type tyenv T = fastype_of t) (Vartab.dest tenv) | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 484 | end; | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 485 | |
| 60552 | 486 | fun term_eq_wrt (env1, env2) (t1, t2) = | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 487 | Envir.eta_contract (Envir.norm_term env1 t1) aconv | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 488 | Envir.eta_contract (Envir.norm_term env2 t2); | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 489 | |
| 60552 | 490 | fun type_eq_wrt (env1, env2) (T1, T2) = | 
| 491 | Envir.norm_type (Envir.type_env env1) T1 = Envir.norm_type (Envir.type_env env2) T2; | |
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 492 | |
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 493 | |
| 60248 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 494 | fun eq_env (env1, env2) = | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 495 | Envir.maxidx_of env1 = Envir.maxidx_of env1 andalso | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 496 | ListPair.allEq (fn ((var, (_, t)), (var', (_, t'))) => | 
| 60552 | 497 | (var = var' andalso term_eq_wrt (env1, env2) (t, t'))) | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 498 | (apply2 Vartab.dest (Envir.term_env env1, Envir.term_env env2)) | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 499 | andalso | 
| 60248 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 500 | ListPair.allEq (fn ((var, (_, T)), (var', (_, T'))) => | 
| 60552 | 501 | var = var' andalso type_eq_wrt (env1, env2) (T, T')) | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 502 | (apply2 Vartab.dest (Envir.type_env env1, Envir.type_env env2)); | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 503 | |
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 504 | |
| 60552 | 505 | fun merge_env (env1, env2) = | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 506 | let | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 507 | val tenv = | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 508 | Vartab.merge (eq_snd (term_eq_wrt (env1, env2))) (Envir.term_env env1, Envir.term_env env2); | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 509 | val tyenv = | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 510 | Vartab.merge (eq_snd (type_eq_wrt (env1, env2)) andf eq_fst (op =)) | 
| 60552 | 511 | (Envir.type_env env1, Envir.type_env env2); | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 512 | val maxidx = Int.max (Envir.maxidx_of env1, Envir.maxidx_of env2); | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 513 |   in Envir.Envir {maxidx = maxidx, tenv = tenv, tyenv = tyenv} end;
 | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 514 | |
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 515 | |
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 516 | fun import_with_tags thms ctxt = | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 517 | let | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 518 | val ((_, thms'), ctxt') = Variable.import false thms ctxt; | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 519 | val thms'' = map2 (fn thm => Thm.map_tags (K (Thm.get_tags thm))) thms thms'; | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 520 | in (thms'', ctxt') end; | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 521 | |
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 522 | |
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 523 | fun try_merge (env, env') = SOME (merge_env (env, env')) handle Vartab.DUP _ => NONE | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 524 | |
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 525 | |
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 526 | fun Seq_retrieve seq f = | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 527 | let | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 528 | fun retrieve' (list, seq) f = | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 529 | (case Seq.pull seq of | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 530 | SOME (x, seq') => | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 531 | if f x then (SOME x, (list, seq')) | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 532 | else retrieve' (list @ [x], seq') f | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 533 | | NONE => (NONE, (list, seq))); | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 534 | |
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 535 | val (result, (list, seq)) = retrieve' ([], seq) f; | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 536 | in (result, Seq.append (Seq.of_list list) seq) end; | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 537 | |
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 538 | fun match_facts ctxt fixes prop_pats get = | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 539 | let | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 540 | fun is_multi (((_, x : match_args), _), _) = #multi x; | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 541 | fun get_cut (((_, x : match_args), _), _) = #cut x; | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 542 | fun do_cut n = if n = ~1 then I else Seq.take n; | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 543 | |
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 544 | val raw_thmss = map (get o snd) prop_pats; | 
| 60552 | 545 | val (thmss, ctxt') = fold_burrow import_with_tags raw_thmss ctxt; | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 546 | |
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 547 | val newly_fixed = Variable.is_newly_fixed ctxt' ctxt; | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 548 | |
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 549 | val morphism = Variable.export_morphism ctxt' ctxt; | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 550 | |
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 551 | fun match_thm (((x, params), pat), thm) = | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 552 | let | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 553 | val pat_vars = Term.add_vars pat []; | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 554 | |
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 555 | val ts = Option.map (fst o fst) (fst x); | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 556 | |
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 557 | val item' = Thm.prop_of thm; | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 558 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 559 | val matches = | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 560 | (Unify.matchers (Context.Proof ctxt) [(pat, item')]) | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 561 | |> Seq.filter consistent_env | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 562 | |> Seq.map_filter (fn env' => | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 563 | (case match_filter_env newly_fixed pat_vars fixes params env' of | 
| 60552 | 564 | SOME env'' => SOME (export_with_params ctxt morphism (ts, params) thm env', env'') | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 565 | | NONE => NONE)) | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 566 | |> Seq.map (apfst (Thm.map_tags (K (Thm.get_tags thm)))) | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 567 | |> deduplicate (eq_pair Thm.eq_thm_prop eq_env) [] | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 568 | in matches end; | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 569 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 570 | val all_matches = | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 571 | map2 pair prop_pats thmss | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 572 | |> map (fn (pat, matches) => (pat, map (fn thm => match_thm (pat, thm)) matches)); | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 573 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 574 | fun proc_multi_match (pat, thmenvs) (pats, env) = | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 575 | do_cut (get_cut pat) | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 576 | (if is_multi pat then | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 577 | let | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 578 | fun maximal_set tail seq envthms = | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 579 | Seq.make (fn () => | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 580 | (case Seq.pull seq of | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 581 | SOME ((thm, env'), seq') => | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 582 | let | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 583 | val (result, envthms') = | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 584 | Seq_retrieve envthms (fn (env, _) => eq_env (env, env')); | 
| 62133 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 585 | in | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 586 | (case result of | 
| 60552 | 587 | SOME (_, thms) => SOME ((env', thm :: thms), maximal_set tail seq' envthms') | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 588 | | NONE => Seq.pull (maximal_set (tail @ [(env', [thm])]) seq' envthms')) | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 589 | end | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 590 | | NONE => Seq.pull (Seq.append envthms (Seq.of_list tail)))); | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 591 | |
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 592 | val maximal_sets = fold (maximal_set []) thmenvs Seq.empty; | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 593 | in | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 594 | maximal_sets | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 595 | |> Seq.map swap | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 596 | |> Seq.filter (fn (thms, _) => not (null thms)) | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 597 | |> Seq.map_filter (fn (thms, env') => | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 598 | (case try_merge (env, env') of | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 599 | SOME env'' => SOME ((pat, thms) :: pats, env'') | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 600 | | NONE => NONE)) | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 601 | end | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 602 | else | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 603 | let | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 604 | fun just_one (thm, env') = | 
| 60552 | 605 | (case try_merge (env, env') of | 
| 606 | SOME env'' => SOME ((pat, [thm]) :: pats, env'') | |
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 607 | | NONE => NONE); | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 608 | in fold (fn seq => Seq.append (Seq.map_filter just_one seq)) thmenvs Seq.empty end); | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 609 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 610 | val all_matches = | 
| 63615 | 611 | Seq.EVERY (map proc_multi_match all_matches) ([], Envir.init); | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 612 | in | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 613 | all_matches | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 614 | |> Seq.map (apsnd (morphism_env morphism)) | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 615 | end; | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 616 | |
| 62133 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 617 | fun real_match using outer_ctxt fixes m text pats st = | 
| 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 618 | let | 
| 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 619 | val goal_ctxt = | 
| 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 620 | fold Variable.declare_term fixes outer_ctxt | 
| 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 621 | (*FIXME Is this a good idea? We really only care about the maxidx*) | 
| 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 622 | |> fold (fn (_, t) => Variable.declare_term t) pats; | 
| 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 623 | |
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 624 | fun make_fact_matches ctxt get = | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 625 | let | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 626 | val (pats', ctxt') = fold_map prep_fact_pat pats ctxt; | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 627 | in | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 628 | match_facts ctxt' fixes pats' get | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 629 | |> Seq.map (fn (fact_insts, env) => do_inst fact_insts env text ctxt') | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 630 | end; | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 631 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 632 | fun make_term_matches ctxt get = | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 633 | let | 
| 61839 | 634 | val pats' = map | 
| 635 | (fn ((SOME _, _), _) => error "Cannot name term match" | |
| 636 | | ((_, x), t) => (((NONE, x), []), Logic.mk_term t)) pats; | |
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 637 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 638 | val thm_of = Drule.mk_term o Thm.cterm_of ctxt; | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 639 | fun get' t = get (Logic.dest_term t) |> map thm_of; | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 640 | in | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 641 | match_facts ctxt fixes pats' get' | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 642 | |> Seq.map (fn (fact_insts, env) => do_inst fact_insts env text ctxt) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 643 | end; | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 644 | in | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 645 | (case m of | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 646 | Match_Fact net => | 
| 61841 
4d3527b94f2a
more general types Proof.method / context_tactic;
 wenzelm parents: 
61840diff
changeset | 647 | make_fact_matches goal_ctxt (Item_Net.retrieve net) | 
| 
4d3527b94f2a
more general types Proof.method / context_tactic;
 wenzelm parents: 
61840diff
changeset | 648 | |> Seq.map (fn (text, ctxt') => | 
| 63527 | 649 | Method.evaluate_runtime text ctxt' using (ctxt', st) | 
| 62133 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 650 | |> Seq.filter_results |> Seq.map (fn (_, thm) => (outer_ctxt, thm))) | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 651 | | Match_Term net => | 
| 61841 
4d3527b94f2a
more general types Proof.method / context_tactic;
 wenzelm parents: 
61840diff
changeset | 652 | make_term_matches goal_ctxt (Item_Net.retrieve net) | 
| 
4d3527b94f2a
more general types Proof.method / context_tactic;
 wenzelm parents: 
61840diff
changeset | 653 | |> Seq.map (fn (text, ctxt') => | 
| 63527 | 654 | Method.evaluate_runtime text ctxt' using (ctxt', st) | 
| 62133 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 655 | |> Seq.filter_results |> Seq.map (fn (_, thm) => (outer_ctxt, thm))) | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 656 | | match_kind => | 
| 61839 | 657 | if Thm.no_prems st then Seq.empty | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 658 | else | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 659 | let | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 660 | fun focus_cases f g = | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 661 | (case match_kind of | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 662 | Match_Prems b => f b | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 663 | | Match_Concl => g | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 664 | | _ => raise Fail "Match kind fell through"); | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 665 | |
| 62133 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 666 |             val ((local_premids, {context = focus_ctxt, params, asms, concl, prems, ...}), focused_goal) =
 | 
| 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 667 | focus_cases (K Subgoal.focus_prems) focus_concl goal_ctxt 1 NONE st | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 668 | |>> augment_focus; | 
| 62133 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 669 | |
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 670 | val texts = | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 671 | focus_cases | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 672 | (fn is_local => fn _ => | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 673 | make_fact_matches focus_ctxt | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 674 | (Item_Net.retrieve (focus_prems focus_ctxt |> snd) | 
| 60552 | 675 | #> is_local ? filter (fn (p, _) => exists (fn id' => id' = p) local_premids) | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 676 | #> order_list)) | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 677 | (fn _ => | 
| 61839 | 678 | make_term_matches focus_ctxt | 
| 679 | (fn _ => [Logic.strip_imp_concl (Thm.term_of concl)])) | |
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 680 | (); | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 681 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 682 | (*TODO: How to handle cases? *) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 683 | |
| 62133 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 684 | fun do_retrofit (inner_ctxt, st1) = | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 685 | let | 
| 62133 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 686 | val (_, before_prems) = focus_prems focus_ctxt; | 
| 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 687 | val (_, after_prems) = focus_prems inner_ctxt; | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 688 | |
| 62133 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 689 | val removed_prems = | 
| 62165 | 690 | Item_Net.filter (null o Item_Net.lookup after_prems) before_prems | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 691 | |
| 62133 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 692 | val removed_local_prems = Item_Net.content removed_prems | 
| 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 693 | |> filter (fn (id, _) => member (op =) local_premids id) | 
| 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 694 | |> map (fn (_, prem) => Thm.prop_of prem) | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 695 | |
| 62133 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 696 | fun filter_removed_prems prems = | 
| 62165 | 697 | Item_Net.filter (null o Item_Net.lookup removed_prems) prems; | 
| 62133 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 698 | |
| 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 699 | val outer_ctxt' = outer_ctxt | 
| 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 700 |                   |> Focus_Data.map (@{apply 3(1)} (apsnd filter_removed_prems));
 | 
| 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 701 | |
| 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 702 | val n_subgoals = Thm.nprems_of st1; | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 703 | |
| 62133 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 704 | val removed_prem_idxs = | 
| 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 705 | prems | 
| 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 706 | |> tag_list 0 | 
| 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 707 | |> filter (member (op aconv) removed_local_prems o Thm.prop_of o snd) | 
| 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 708 | |> map fst | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 709 | |
| 62133 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 710 | fun filter_prem (i, _) = not (member (op =) removed_prem_idxs i); | 
| 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 711 | |
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 712 | in | 
| 62133 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 713 | Subgoal.retrofit inner_ctxt goal_ctxt params asms 1 st1 st | 
| 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 714 | |> focus_cases | 
| 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 715 | (fn _ => (n_subgoals > 0 andalso length removed_local_prems > 0) ? | 
| 61840 | 716 | (Seq.map (Goal.restrict 1 n_subgoals) | 
| 717 | #> Seq.maps (ALLGOALS (fn i => | |
| 62133 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 718 | DETERM (filter_prems_tac' goal_ctxt filter_prem i))) | 
| 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 719 | #> Seq.map (Goal.unrestrict 1))) | 
| 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 720 | I | 
| 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 721 | |> Seq.map (pair outer_ctxt') | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 722 | end; | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 723 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 724 | fun apply_text (text, ctxt') = | 
| 63527 | 725 | Method.evaluate_runtime text ctxt' using (ctxt', focused_goal) | 
| 62133 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 726 | |> Seq.filter_results | 
| 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 727 | |> Seq.maps (Seq.DETERM do_retrofit) | 
| 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 728 | |
| 61839 | 729 | in Seq.map apply_text texts end) | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 730 | end; | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 731 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 732 | val _ = | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 733 | Theory.setup | 
| 69593 | 734 | (Method.setup \<^binding>\<open>match\<close> | 
| 61837 | 735 | (parse_match_kind :-- | 
| 69593 | 736 | (fn kind => Scan.lift \<^keyword>\<open>in\<close> |-- Parse.enum1' "\<bar>" (parse_named_pats kind)) >> | 
| 61837 | 737 | (fn (matches, bodies) => fn ctxt => | 
| 61841 
4d3527b94f2a
more general types Proof.method / context_tactic;
 wenzelm parents: 
61840diff
changeset | 738 | CONTEXT_METHOD (fn using => Method.RUNTIME (fn (goal_ctxt, st) => | 
| 61837 | 739 | let | 
| 62133 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 740 | val ctxt' = transfer_focus_prems goal_ctxt ctxt; | 
| 61841 
4d3527b94f2a
more general types Proof.method / context_tactic;
 wenzelm parents: 
61840diff
changeset | 741 | fun exec (pats, fixes, text) st' = | 
| 62133 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 742 | real_match using ctxt' fixes matches text pats st'; | 
| 61841 
4d3527b94f2a
more general types Proof.method / context_tactic;
 wenzelm parents: 
61840diff
changeset | 743 | in | 
| 
4d3527b94f2a
more general types Proof.method / context_tactic;
 wenzelm parents: 
61840diff
changeset | 744 | Seq.flat (Seq.FIRST (map exec bodies) st) | 
| 62133 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 745 | |> Seq.map (apfst (fn ctxt' => transfer_focus_prems ctxt' goal_ctxt)) | 
| 
43518f70b438
match method now makes proper use of context_tactic
 matichuk <daniel.matichuk@nicta.com.au> parents: 
61912diff
changeset | 746 | |> Seq.make_results | 
| 61841 
4d3527b94f2a
more general types Proof.method / context_tactic;
 wenzelm parents: 
61840diff
changeset | 747 | end)))) | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 748 | "structural analysis/matching on goals"); | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 749 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 750 | end; |