| author | traytel | 
| Thu, 31 Mar 2016 21:19:45 +0200 | |
| changeset 62778 | f0e8ed202ce5 | 
| parent 61853 | fb7756087101 | 
| child 63527 | 59eff6e56d81 | 
| permissions | -rw-r--r-- | 
| 60248 
f7e4294216d2
updated Eisbach, using version fb741500f533 of its Bitbucket repository;
 wenzelm parents: 
60209diff
changeset | 1 | (* Title: HOL/Eisbach/Eisbach_Tools.thy | 
| 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 | Usability tools for Eisbach. | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 5 | *) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 6 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 7 | theory Eisbach_Tools | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 8 | imports Eisbach | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 9 | begin | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 10 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 11 | ML \<open> | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 12 | local | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 13 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 14 | fun trace_method parser print = | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 15 | Scan.lift (Args.mode "dummy") -- parser >> | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 16 | (fn (dummy, x) => fn ctxt => SIMPLE_METHOD (fn st => | 
| 60553 | 17 | (if dummy orelse not (Method.detect_closure_state st) | 
| 18 | then tracing (print ctxt x) else (); | |
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 19 | all_tac st))); | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 20 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 21 | fun setup_trace_method binding parser print = | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 22 | Method.setup binding | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 23 | (trace_method parser (fn ctxt => fn x => Binding.name_of binding ^ ": " ^ print ctxt x)) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 24 | ""; | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 25 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 26 | in | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 27 | |
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 28 | val _ = | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 29 | Theory.setup | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 30 |    (setup_trace_method @{binding print_fact}
 | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 31 | (Scan.lift (Scan.ahead Parse.not_eof) -- Attrib.thms) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 32 | (fn ctxt => fn (tok, thms) => | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 33 | (* FIXME proper formatting!? *) | 
| 61268 | 34 | Token.unparse tok ^ ": " ^ commas (map (Thm.string_of_thm ctxt) thms)) #> | 
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 35 |     setup_trace_method @{binding print_term}
 | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 36 | (Scan.lift (Scan.ahead Parse.not_eof) -- Args.term) | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 37 | (fn ctxt => fn (tok, t) => | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 38 | (* FIXME proper formatting!? *) | 
| 60209 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 39 | Token.unparse tok ^ ": " ^ Syntax.string_of_term ctxt t) #> | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 40 |     setup_trace_method @{binding print_type}
 | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 41 | (Scan.lift (Scan.ahead Parse.not_eof) -- Args.typ) | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 42 | (fn ctxt => fn (tok, t) => | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 43 | (* FIXME proper formatting!? *) | 
| 
022ca2799c73
updated Eisbach, using version 5df3d8c72403 of its Bitbucket repository;
 wenzelm parents: 
60119diff
changeset | 44 | Token.unparse tok ^ ": " ^ Syntax.string_of_typ ctxt t)); | 
| 60119 
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 | end | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 47 | \<close> | 
| 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 48 | |
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 49 | ML \<open> | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 50 | fun try_map v seq = | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 51 | (case try Seq.pull seq of | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 52 | SOME (SOME (x, seq')) => Seq.make (fn () => SOME(x, try_map v seq')) | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 53 | | SOME NONE => Seq.empty | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 54 | | NONE => v); | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 55 | \<close> | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 56 | |
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 57 | method_setup catch = \<open> | 
| 61818 | 58 | Method_Closure.method_text -- Method_Closure.method_text >> | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 59 | (fn (text, text') => fn ctxt => fn using => fn st => | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 60 | let | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 61 | val method = Method_Closure.method_evaluate text ctxt using; | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 62 | val backup_results = Method_Closure.method_evaluate text' ctxt using st; | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 63 | in | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 64 | (case try method st of | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 65 | SOME seq => try_map backup_results seq | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 66 | | NONE => backup_results) | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 67 | end) | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 68 | \<close> | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 69 | |
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 70 | ML \<open> | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 71 | fun uncurry_rule thm = Conjunction.uncurry_balanced (Thm.nprems_of thm) thm; | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 72 | fun curry_rule thm = | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 73 | if Thm.no_prems thm then thm | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 74 | else | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 75 | let val conjs = Logic.dest_conjunctions (Thm.major_prem_of thm); | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 76 | in Conjunction.curry_balanced (length conjs) thm end; | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 77 | \<close> | 
| 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 78 | |
| 61853 
fb7756087101
rule_attribute and declaration_attribute implicitly support abstract closure, but mixed_attribute implementations need to be aware of Thm.is_free_dummy;
 wenzelm parents: 
61818diff
changeset | 79 | attribute_setup uncurry = \<open>Scan.succeed (Thm.rule_attribute [] (K uncurry_rule))\<close> | 
| 
fb7756087101
rule_attribute and declaration_attribute implicitly support abstract closure, but mixed_attribute implementations need to be aware of Thm.is_free_dummy;
 wenzelm parents: 
61818diff
changeset | 80 | attribute_setup curry = \<open>Scan.succeed (Thm.rule_attribute [] (K curry_rule))\<close> | 
| 60285 
b4f1a0a701ae
updated Eisbach, using version 4863020a8fe9 of its Bitbucket repository;
 wenzelm parents: 
60248diff
changeset | 81 | |
| 60119 
54bea620e54f
added Eisbach, using version 3752768caa17 of its Bitbucket repository;
 wenzelm parents: diff
changeset | 82 | end |