| author | paulson <lp15@cam.ac.uk> | 
| Fri, 22 Nov 2024 16:05:42 +0000 | |
| changeset 81473 | 53e61087bc6f | 
| parent 80713 | 43e0f32451ee | 
| child 82642 | e478f85fe427 | 
| permissions | -rw-r--r-- | 
| 16014 | 1 | (* Title: Pure/simplifier.ML | 
| 2 | Author: Tobias Nipkow and Markus Wenzel, TU Muenchen | |
| 3 | ||
| 4 | Generic simplifier, suitable for most logics (see also | |
| 41386 | 5 | raw_simplifier.ML for the actual meta-level rewriting engine). | 
| 16014 | 6 | *) | 
| 7 | ||
| 8 | signature BASIC_SIMPLIFIER = | |
| 9 | sig | |
| 41228 
e1fce873b814
renamed structure MetaSimplifier to raw_Simplifer, to emphasize its meaning;
 wenzelm parents: 
41226diff
changeset | 10 | include BASIC_RAW_SIMPLIFIER | 
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 11 | val simp_tac: Proof.context -> int -> tactic | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 12 | val asm_simp_tac: Proof.context -> int -> tactic | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 13 | val full_simp_tac: Proof.context -> int -> tactic | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 14 | val asm_lr_simp_tac: Proof.context -> int -> tactic | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 15 | val asm_full_simp_tac: Proof.context -> int -> tactic | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 16 | val safe_simp_tac: Proof.context -> int -> tactic | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 17 | val safe_asm_simp_tac: Proof.context -> int -> tactic | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 18 | val safe_full_simp_tac: Proof.context -> int -> tactic | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 19 | val safe_asm_lr_simp_tac: Proof.context -> int -> tactic | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 20 | val safe_asm_full_simp_tac: Proof.context -> int -> tactic | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 21 | val simplify: Proof.context -> thm -> thm | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 22 | val asm_simplify: Proof.context -> thm -> thm | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 23 | val full_simplify: Proof.context -> thm -> thm | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 24 | val asm_lr_simplify: Proof.context -> thm -> thm | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 25 | val asm_full_simplify: Proof.context -> thm -> thm | 
| 16014 | 26 | end; | 
| 27 | ||
| 28 | signature SIMPLIFIER = | |
| 29 | sig | |
| 30 | include BASIC_SIMPLIFIER | |
| 80706 | 31 | val dest_simps: simpset -> (Thm_Name.T * thm) list | 
| 32 | val dest_congs: simpset -> (cong_name * thm) list | |
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 33 | val map_ss: (Proof.context -> Proof.context) -> Context.generic -> Context.generic | 
| 56510 
aec722524c33
added simproc markup, which also indicates legacy simprocs outside the name space;
 wenzelm parents: 
56204diff
changeset | 34 | val attrib: (thm -> Proof.context -> Proof.context) -> attribute | 
| 
aec722524c33
added simproc markup, which also indicates legacy simprocs outside the name space;
 wenzelm parents: 
56204diff
changeset | 35 | val simp_add: attribute | 
| 
aec722524c33
added simproc markup, which also indicates legacy simprocs outside the name space;
 wenzelm parents: 
56204diff
changeset | 36 | val simp_del: attribute | 
| 68403 | 37 | val simp_flip: attribute | 
| 56510 
aec722524c33
added simproc markup, which also indicates legacy simprocs outside the name space;
 wenzelm parents: 
56204diff
changeset | 38 | val cong_add: attribute | 
| 
aec722524c33
added simproc markup, which also indicates legacy simprocs outside the name space;
 wenzelm parents: 
56204diff
changeset | 39 | val cong_del: attribute | 
| 78115 | 40 | val check_simproc: Proof.context -> xstring * Position.T -> string * simproc | 
| 56510 
aec722524c33
added simproc markup, which also indicates legacy simprocs outside the name space;
 wenzelm parents: 
56204diff
changeset | 41 | val the_simproc: Proof.context -> string -> simproc | 
| 78812 
d769a183d51d
simprocs may be distinguished via 'identifier': only works for ML antiquotation (see also 13252110a6fe);
 wenzelm parents: 
78810diff
changeset | 42 | val make_simproc: Proof.context -> | 
| 80709 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 43 |     {name: string, kind: proc_kind, lhss: term list, proc: morphism -> proc, identifier: thm list} ->
 | 
| 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 44 | simproc | 
| 78812 
d769a183d51d
simprocs may be distinguished via 'identifier': only works for ML antiquotation (see also 13252110a6fe);
 wenzelm parents: 
78810diff
changeset | 45 |   type ('a, 'b, 'c) simproc_spec =
 | 
| 80709 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 46 |     {passive: bool, name: binding, kind: proc_kind, lhss: 'a list, proc: 'b, identifier: 'c}
 | 
| 78812 
d769a183d51d
simprocs may be distinguished via 'identifier': only works for ML antiquotation (see also 13252110a6fe);
 wenzelm parents: 
78810diff
changeset | 47 | val read_simproc_spec: Proof.context -> | 
| 
d769a183d51d
simprocs may be distinguished via 'identifier': only works for ML antiquotation (see also 13252110a6fe);
 wenzelm parents: 
78810diff
changeset | 48 | (string, 'b, 'c) simproc_spec -> (term, 'b, 'c) simproc_spec | 
| 
d769a183d51d
simprocs may be distinguished via 'identifier': only works for ML antiquotation (see also 13252110a6fe);
 wenzelm parents: 
78810diff
changeset | 49 | val define_simproc: (term, morphism -> proc, thm list) simproc_spec -> local_theory -> | 
| 78810 
9473dd79e9c3
more robust read_simproc_spec: proper error positions;
 wenzelm parents: 
78809diff
changeset | 50 | simproc * local_theory | 
| 78812 
d769a183d51d
simprocs may be distinguished via 'identifier': only works for ML antiquotation (see also 13252110a6fe);
 wenzelm parents: 
78810diff
changeset | 51 | val simproc_setup: (term, morphism -> proc, thm list) simproc_spec -> simproc | 
| 
d769a183d51d
simprocs may be distinguished via 'identifier': only works for ML antiquotation (see also 13252110a6fe);
 wenzelm parents: 
78810diff
changeset | 52 | val simproc_setup_cmd: (string, morphism -> proc, thm list) simproc_spec -> simproc | 
| 78803 | 53 | val simproc_setup_command: (local_theory -> local_theory) parser | 
| 80700 | 54 | val add_proc: simproc -> Proof.context -> Proof.context | 
| 55 | val del_proc: simproc -> Proof.context -> Proof.context | |
| 59917 
9830c944670f
more uniform "verbose" option to print name space;
 wenzelm parents: 
59621diff
changeset | 56 | val pretty_simpset: bool -> Proof.context -> Pretty.T | 
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 57 | val default_mk_sym: Proof.context -> thm -> thm option | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 58 | val prems_of: Proof.context -> thm list | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 59 | val add_simp: thm -> Proof.context -> Proof.context | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 60 | val del_simp: thm -> Proof.context -> Proof.context | 
| 63221 
7d43fbbaba28
avoid warnings on duplicate rules in the given list;
 wenzelm parents: 
62913diff
changeset | 61 | val init_simpset: thm list -> Proof.context -> Proof.context | 
| 80711 
043e5fd3ce32
more direct access to Simplifier.mk_cong, to avoid odd Simpdata.mk_meta_cong seen in the wild;
 wenzelm parents: 
80709diff
changeset | 62 | val mk_cong: Proof.context -> thm -> thm | 
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 63 | val add_eqcong: thm -> Proof.context -> Proof.context | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 64 | val del_eqcong: thm -> Proof.context -> Proof.context | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 65 | val add_cong: thm -> Proof.context -> Proof.context | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 66 | val del_cong: thm -> Proof.context -> Proof.context | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 67 | val add_prems: thm list -> Proof.context -> Proof.context | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 68 | val mksimps: Proof.context -> thm -> thm list | 
| 80713 
43e0f32451ee
provide Simplifier.set_mksimps_context (roughly following Norbert Schirmer): allow update of context when premises are added to the local simpset;
 wenzelm parents: 
80711diff
changeset | 69 | val get_mksimps_context: Proof.context -> (thm -> Proof.context -> thm list * Proof.context) | 
| 
43e0f32451ee
provide Simplifier.set_mksimps_context (roughly following Norbert Schirmer): allow update of context when premises are added to the local simpset;
 wenzelm parents: 
80711diff
changeset | 70 | val set_mksimps_context: (thm -> Proof.context -> thm list * Proof.context) -> | 
| 
43e0f32451ee
provide Simplifier.set_mksimps_context (roughly following Norbert Schirmer): allow update of context when premises are added to the local simpset;
 wenzelm parents: 
80711diff
changeset | 71 | Proof.context -> Proof.context | 
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 72 | val set_mksimps: (Proof.context -> thm -> thm list) -> Proof.context -> Proof.context | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 73 | val set_mkcong: (Proof.context -> thm -> thm) -> Proof.context -> Proof.context | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 74 | val set_mksym: (Proof.context -> thm -> thm option) -> Proof.context -> Proof.context | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 75 | val set_mkeqTrue: (Proof.context -> thm -> thm option) -> Proof.context -> Proof.context | 
| 70586 | 76 | val set_term_ord: term ord -> Proof.context -> Proof.context | 
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 77 | val set_subgoaler: (Proof.context -> int -> tactic) -> Proof.context -> Proof.context | 
| 54729 
c5cd7a58cf2d
generic trace operations for main steps of Simplifier;
 wenzelm parents: 
54728diff
changeset | 78 | type trace_ops | 
| 54731 
384ac33802b0
clarified Trace_Ops: global theory data avoids init of simpset in Pure.thy, which is important to act as neutral element in merge;
 wenzelm parents: 
54729diff
changeset | 79 | val set_trace_ops: trace_ops -> theory -> theory | 
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 80 | val rewrite: Proof.context -> conv | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 81 | val asm_rewrite: Proof.context -> conv | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 82 | val full_rewrite: Proof.context -> conv | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 83 | val asm_lr_rewrite: Proof.context -> conv | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 84 | val asm_full_rewrite: Proof.context -> conv | 
| 30513 | 85 | val cong_modifiers: Method.modifier parser list | 
| 86 | val simp_modifiers': Method.modifier parser list | |
| 87 | val simp_modifiers: Method.modifier parser list | |
| 88 | val method_setup: Method.modifier parser list -> theory -> theory | |
| 63532 
b01154b74314
provide Pure.simp/simp_all, which only know about meta-equality;
 wenzelm parents: 
63221diff
changeset | 89 | val unsafe_solver_tac: Proof.context -> int -> tactic | 
| 
b01154b74314
provide Pure.simp/simp_all, which only know about meta-equality;
 wenzelm parents: 
63221diff
changeset | 90 | val unsafe_solver: solver | 
| 
b01154b74314
provide Pure.simp/simp_all, which only know about meta-equality;
 wenzelm parents: 
63221diff
changeset | 91 | val safe_solver_tac: Proof.context -> int -> tactic | 
| 
b01154b74314
provide Pure.simp/simp_all, which only know about meta-equality;
 wenzelm parents: 
63221diff
changeset | 92 | val safe_solver: solver | 
| 16014 | 93 | end; | 
| 94 | ||
| 95 | structure Simplifier: SIMPLIFIER = | |
| 96 | struct | |
| 97 | ||
| 41228 
e1fce873b814
renamed structure MetaSimplifier to raw_Simplifer, to emphasize its meaning;
 wenzelm parents: 
41226diff
changeset | 98 | open Raw_Simplifier; | 
| 21708 | 99 | |
| 100 | ||
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 101 | (** declarations **) | 
| 16014 | 102 | |
| 80713 
43e0f32451ee
provide Simplifier.set_mksimps_context (roughly following Norbert Schirmer): allow update of context when premises are added to the local simpset;
 wenzelm parents: 
80711diff
changeset | 103 | fun set_mksimps mk = set_mksimps_context (fn thm => fn ctxt => (mk ctxt thm, ctxt)); | 
| 
43e0f32451ee
provide Simplifier.set_mksimps_context (roughly following Norbert Schirmer): allow update of context when premises are added to the local simpset;
 wenzelm parents: 
80711diff
changeset | 104 | |
| 
43e0f32451ee
provide Simplifier.set_mksimps_context (roughly following Norbert Schirmer): allow update of context when premises are added to the local simpset;
 wenzelm parents: 
80711diff
changeset | 105 | |
| 26497 
1873915c64a9
purely functional setup of claset/simpset/clasimpset;
 wenzelm parents: 
26463diff
changeset | 106 | (* attributes *) | 
| 
1873915c64a9
purely functional setup of claset/simpset/clasimpset;
 wenzelm parents: 
26463diff
changeset | 107 | |
| 45620 
f2a587696afb
modernized some old-style infix operations, which were left over from the time of ML proof scripts;
 wenzelm parents: 
45375diff
changeset | 108 | fun attrib f = Thm.declaration_attribute (map_ss o f); | 
| 16014 | 109 | |
| 45620 
f2a587696afb
modernized some old-style infix operations, which were left over from the time of ML proof scripts;
 wenzelm parents: 
45375diff
changeset | 110 | val simp_add = attrib add_simp; | 
| 
f2a587696afb
modernized some old-style infix operations, which were left over from the time of ML proof scripts;
 wenzelm parents: 
45375diff
changeset | 111 | val simp_del = attrib del_simp; | 
| 68403 | 112 | val simp_flip = attrib flip_simp; | 
| 45620 
f2a587696afb
modernized some old-style infix operations, which were left over from the time of ML proof scripts;
 wenzelm parents: 
45375diff
changeset | 113 | val cong_add = attrib add_cong; | 
| 
f2a587696afb
modernized some old-style infix operations, which were left over from the time of ML proof scripts;
 wenzelm parents: 
45375diff
changeset | 114 | val cong_del = attrib del_cong; | 
| 26497 
1873915c64a9
purely functional setup of claset/simpset/clasimpset;
 wenzelm parents: 
26463diff
changeset | 115 | |
| 16014 | 116 | |
| 22201 | 117 | (** named simprocs **) | 
| 118 | ||
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 119 | structure Simprocs = Generic_Data | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 120 | ( | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 121 | type T = simproc Name_Space.table; | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 122 | val empty : T = Name_Space.empty_table "simproc"; | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 123 | fun merge data : T = Name_Space.merge_tables data; | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 124 | ); | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 125 | |
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 126 | |
| 22204 | 127 | (* get simprocs *) | 
| 128 | ||
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 129 | val get_simprocs = Simprocs.get o Context.Proof; | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 130 | |
| 42466 | 131 | val the_simproc = Name_Space.get o get_simprocs; | 
| 78115 | 132 | fun check_simproc ctxt = Name_Space.check (Context.Proof ctxt) (get_simprocs ctxt); | 
| 42465 
1ba52683512a
clarified check_simproc (with report) vs. the_simproc;
 wenzelm parents: 
42464diff
changeset | 133 | |
| 53171 | 134 | val _ = Theory.setup | 
| 69592 
a80d8ec6c998
support for isabelle update -u control_cartouches;
 wenzelm parents: 
69349diff
changeset | 135 | (ML_Antiquotation.value_embedded \<^binding>\<open>simproc\<close> | 
| 78115 | 136 | (Args.context -- Scan.lift Parse.embedded_position >> (fn (ctxt, name) => | 
| 137 | "Simplifier.the_simproc ML_context " ^ ML_Syntax.print_string (#1 (check_simproc ctxt name))))); | |
| 22204 | 138 | |
| 139 | ||
| 140 | (* define simprocs *) | |
| 22201 | 141 | |
| 80709 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 142 | fun make_simproc ctxt {name, lhss, kind, proc, identifier} =
 | 
| 61144 | 143 | let | 
| 70308 | 144 | val ctxt' = fold Proof_Context.augment lhss ctxt; | 
| 61144 | 145 | val lhss' = Variable.export_terms ctxt' ctxt lhss; | 
| 146 | in | |
| 78812 
d769a183d51d
simprocs may be distinguished via 'identifier': only works for ML antiquotation (see also 13252110a6fe);
 wenzelm parents: 
78810diff
changeset | 147 | cert_simproc (Proof_Context.theory_of ctxt) | 
| 80709 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 148 |       {name = name, kind = kind, lhss = lhss', proc = Morphism.entity proc, identifier = identifier}
 | 
| 61144 | 149 | end; | 
| 150 | ||
| 78812 
d769a183d51d
simprocs may be distinguished via 'identifier': only works for ML antiquotation (see also 13252110a6fe);
 wenzelm parents: 
78810diff
changeset | 151 | type ('a, 'b, 'c) simproc_spec =
 | 
| 80709 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 152 |   {passive: bool, name: binding, kind: proc_kind, lhss: 'a list, proc: 'b, identifier: 'c};
 | 
| 78810 
9473dd79e9c3
more robust read_simproc_spec: proper error positions;
 wenzelm parents: 
78809diff
changeset | 153 | |
| 80709 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 154 | fun read_simproc_spec ctxt {passive, name, kind, lhss, proc, identifier} =
 | 
| 78810 
9473dd79e9c3
more robust read_simproc_spec: proper error positions;
 wenzelm parents: 
78809diff
changeset | 155 | let | 
| 
9473dd79e9c3
more robust read_simproc_spec: proper error positions;
 wenzelm parents: 
78809diff
changeset | 156 | val lhss' = | 
| 
9473dd79e9c3
more robust read_simproc_spec: proper error positions;
 wenzelm parents: 
78809diff
changeset | 157 | Syntax.read_terms ctxt lhss handle ERROR msg => | 
| 
9473dd79e9c3
more robust read_simproc_spec: proper error positions;
 wenzelm parents: 
78809diff
changeset | 158 | error (msg ^ Position.here_list (map Syntax.read_input_pos lhss)); | 
| 80709 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 159 | in | 
| 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 160 |     {passive = passive, name = name, kind = kind, lhss = lhss', proc = proc, identifier = identifier}
 | 
| 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 161 | end; | 
| 78809 | 162 | |
| 80709 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 163 | fun define_simproc {passive, name, kind, lhss, proc, identifier} lthy =
 | 
| 22201 | 164 | let | 
| 78114 | 165 | val simproc0 = | 
| 78812 
d769a183d51d
simprocs may be distinguished via 'identifier': only works for ML antiquotation (see also 13252110a6fe);
 wenzelm parents: 
78810diff
changeset | 166 | make_simproc lthy | 
| 80709 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 167 |         {name = Local_Theory.full_name lthy name,
 | 
| 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 168 | kind = kind, lhss = lhss, proc = proc, identifier = identifier}; | 
| 22201 | 169 | in | 
| 78802 | 170 |     lthy |> Local_Theory.declaration {syntax = false, pervasive = false, pos = Binding.pos_of name}
 | 
| 78095 | 171 | (fn phi => fn context => | 
| 172 | let | |
| 78802 | 173 | val name' = Morphism.binding phi name; | 
| 78114 | 174 | val simproc' = simproc0 |> transform_simproc phi |> trim_context_simproc; | 
| 78095 | 175 | in | 
| 176 | context | |
| 78802 | 177 | |> Simprocs.map (#2 o Name_Space.define context true (name', simproc')) | 
| 80700 | 178 | |> not passive ? map_ss (add_proc simproc') | 
| 78095 | 179 | end) | 
| 78796 
f34926a91fea
clarified signature: more concise simproc setup in ML;
 wenzelm parents: 
78792diff
changeset | 180 | |> pair simproc0 | 
| 22201 | 181 | end; | 
| 182 | ||
| 183 | ||
| 78805 | 184 | (* simproc_setup with concrete syntax *) | 
| 22201 | 185 | |
| 78805 | 186 | val simproc_setup = | 
| 187 | Named_Target.setup_result Raw_Simplifier.transform_simproc o define_simproc; | |
| 22201 | 188 | |
| 78810 
9473dd79e9c3
more robust read_simproc_spec: proper error positions;
 wenzelm parents: 
78809diff
changeset | 189 | fun simproc_setup_cmd args = | 
| 
9473dd79e9c3
more robust read_simproc_spec: proper error positions;
 wenzelm parents: 
78809diff
changeset | 190 | Named_Target.setup_result Raw_Simplifier.transform_simproc | 
| 
9473dd79e9c3
more robust read_simproc_spec: proper error positions;
 wenzelm parents: 
78809diff
changeset | 191 | (fn lthy => lthy |> define_simproc (read_simproc_spec lthy args)); | 
| 78796 
f34926a91fea
clarified signature: more concise simproc setup in ML;
 wenzelm parents: 
78792diff
changeset | 192 | |
| 80709 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 193 | val parse_proc_kind = | 
| 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 194 | Parse.$$$ "congproc" >> K (Congproc false) || | 
| 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 195 | Parse.$$$ "weak_congproc" >> K (Congproc true) || | 
| 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 196 | Scan.succeed Simproc; | 
| 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 197 | |
| 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 198 | fun print_proc_kind kind = | 
| 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 199 | (case kind of | 
| 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 200 | Simproc => "Simplifier.Simproc" | 
| 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 201 | | Congproc weak => "Simplifier.Congproc " ^ Bool.toString weak); | 
| 78812 
d769a183d51d
simprocs may be distinguished via 'identifier': only works for ML antiquotation (see also 13252110a6fe);
 wenzelm parents: 
78810diff
changeset | 202 | |
| 
d769a183d51d
simprocs may be distinguished via 'identifier': only works for ML antiquotation (see also 13252110a6fe);
 wenzelm parents: 
78810diff
changeset | 203 | val parse_simproc_spec = | 
| 80709 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 204 | Scan.optional (Parse.$$$ "passive" >> K true) false -- parse_proc_kind -- | 
| 78799 | 205 | Parse.binding -- | 
| 206 |     (Parse.$$$ "(" |-- Parse.enum1 "|" Parse.term --| Parse.$$$ ")") --
 | |
| 78812 
d769a183d51d
simprocs may be distinguished via 'identifier': only works for ML antiquotation (see also 13252110a6fe);
 wenzelm parents: 
78810diff
changeset | 207 | (Parse.$$$ "=" |-- Parse.ML_source) -- | 
| 
d769a183d51d
simprocs may be distinguished via 'identifier': only works for ML antiquotation (see also 13252110a6fe);
 wenzelm parents: 
78810diff
changeset | 208 | Scan.option ((Parse.position (Parse.$$$ "identifier") >> #2) -- Parse.thms1) | 
| 80709 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 209 | >> (fn (((((a, b), c), d), e), f) => | 
| 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 210 |       {passive = a, kind = b, name = c, lhss = d, proc = e, identifier = f});
 | 
| 78796 
f34926a91fea
clarified signature: more concise simproc setup in ML;
 wenzelm parents: 
78792diff
changeset | 211 | |
| 78805 | 212 | val _ = Theory.setup | 
| 213 | (ML_Context.add_antiquotation_embedded \<^binding>\<open>simproc_setup\<close> | |
| 214 | (fn _ => fn input => fn ctxt => | |
| 215 | let | |
| 216 | val ml = ML_Lex.tokenize_no_range; | |
| 217 | ||
| 80709 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 218 |         val {passive, name, kind, lhss, proc, identifier} = input
 | 
| 78812 
d769a183d51d
simprocs may be distinguished via 'identifier': only works for ML antiquotation (see also 13252110a6fe);
 wenzelm parents: 
78810diff
changeset | 219 | |> Parse.read_embedded ctxt (Thy_Header.get_keywords' ctxt) parse_simproc_spec | 
| 78810 
9473dd79e9c3
more robust read_simproc_spec: proper error positions;
 wenzelm parents: 
78809diff
changeset | 220 | |> read_simproc_spec ctxt; | 
| 78796 
f34926a91fea
clarified signature: more concise simproc setup in ML;
 wenzelm parents: 
78792diff
changeset | 221 | |
| 78812 
d769a183d51d
simprocs may be distinguished via 'identifier': only works for ML antiquotation (see also 13252110a6fe);
 wenzelm parents: 
78810diff
changeset | 222 | val (decl1, ctxt1) = ML_Context.read_antiquotes proc ctxt; | 
| 
d769a183d51d
simprocs may be distinguished via 'identifier': only works for ML antiquotation (see also 13252110a6fe);
 wenzelm parents: 
78810diff
changeset | 223 | val (decl2, ctxt2) = | 
| 
d769a183d51d
simprocs may be distinguished via 'identifier': only works for ML antiquotation (see also 13252110a6fe);
 wenzelm parents: 
78810diff
changeset | 224 | (case identifier of | 
| 
d769a183d51d
simprocs may be distinguished via 'identifier': only works for ML antiquotation (see also 13252110a6fe);
 wenzelm parents: 
78810diff
changeset | 225 |             NONE => (K ("", "[]"), ctxt1)
 | 
| 
d769a183d51d
simprocs may be distinguished via 'identifier': only works for ML antiquotation (see also 13252110a6fe);
 wenzelm parents: 
78810diff
changeset | 226 | | SOME (_, thms) => ML_Thms.thm_binding "thms" false (Attrib.eval_thms ctxt1 thms) ctxt1); | 
| 
d769a183d51d
simprocs may be distinguished via 'identifier': only works for ML antiquotation (see also 13252110a6fe);
 wenzelm parents: 
78810diff
changeset | 227 | |
| 
d769a183d51d
simprocs may be distinguished via 'identifier': only works for ML antiquotation (see also 13252110a6fe);
 wenzelm parents: 
78810diff
changeset | 228 | fun decl' ctxt' = | 
| 78805 | 229 | let | 
| 78812 
d769a183d51d
simprocs may be distinguished via 'identifier': only works for ML antiquotation (see also 13252110a6fe);
 wenzelm parents: 
78810diff
changeset | 230 | val (ml_env1, ml_body1) = decl1 ctxt'; | 
| 
d769a183d51d
simprocs may be distinguished via 'identifier': only works for ML antiquotation (see also 13252110a6fe);
 wenzelm parents: 
78810diff
changeset | 231 | val (ml_env2, ml_body2) = decl2 ctxt' |> apply2 ml; | 
| 78805 | 232 | val ml_body' = | 
| 233 |               ml "Simplifier.simproc_setup {passive = " @ ml (Bool.toString passive) @
 | |
| 234 | ml ", name = " @ ml (ML_Syntax.make_binding (Binding.name_of name, Binding.pos_of name)) @ | |
| 80709 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 235 | ml ", kind = " @ ml (print_proc_kind kind) @ | 
| 78810 
9473dd79e9c3
more robust read_simproc_spec: proper error positions;
 wenzelm parents: 
78809diff
changeset | 236 | ml ", lhss = " @ ml (ML_Syntax.print_list ML_Syntax.print_term lhss) @ | 
| 78812 
d769a183d51d
simprocs may be distinguished via 'identifier': only works for ML antiquotation (see also 13252110a6fe);
 wenzelm parents: 
78810diff
changeset | 237 |               ml ", proc = (" @ ml_body1 @ ml ")" @
 | 
| 
d769a183d51d
simprocs may be distinguished via 'identifier': only works for ML antiquotation (see also 13252110a6fe);
 wenzelm parents: 
78810diff
changeset | 238 |               ml ", identifier = (" @ ml_body2 @ ml ")}";
 | 
| 
d769a183d51d
simprocs may be distinguished via 'identifier': only works for ML antiquotation (see also 13252110a6fe);
 wenzelm parents: 
78810diff
changeset | 239 | in (ml_env1 @ ml_env2, ml_body') end; | 
| 
d769a183d51d
simprocs may be distinguished via 'identifier': only works for ML antiquotation (see also 13252110a6fe);
 wenzelm parents: 
78810diff
changeset | 240 | in (decl', ctxt2) end)); | 
| 78797 | 241 | |
| 78803 | 242 | val simproc_setup_command = | 
| 80709 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 243 |   parse_simproc_spec >> (fn {passive, name, kind, lhss, proc, identifier} =>
 | 
| 78812 
d769a183d51d
simprocs may be distinguished via 'identifier': only works for ML antiquotation (see also 13252110a6fe);
 wenzelm parents: 
78810diff
changeset | 244 | (case identifier of | 
| 
d769a183d51d
simprocs may be distinguished via 'identifier': only works for ML antiquotation (see also 13252110a6fe);
 wenzelm parents: 
78810diff
changeset | 245 | NONE => | 
| 
d769a183d51d
simprocs may be distinguished via 'identifier': only works for ML antiquotation (see also 13252110a6fe);
 wenzelm parents: 
78810diff
changeset | 246 | Context.proof_map | 
| 
d769a183d51d
simprocs may be distinguished via 'identifier': only works for ML antiquotation (see also 13252110a6fe);
 wenzelm parents: 
78810diff
changeset | 247 | (ML_Context.expression (Input.pos_of proc) | 
| 
d769a183d51d
simprocs may be distinguished via 'identifier': only works for ML antiquotation (see also 13252110a6fe);
 wenzelm parents: 
78810diff
changeset | 248 | (ML_Lex.read | 
| 
d769a183d51d
simprocs may be distinguished via 'identifier': only works for ML antiquotation (see also 13252110a6fe);
 wenzelm parents: 
78810diff
changeset | 249 |               ("Simplifier.simproc_setup_cmd {passive = " ^ Bool.toString passive ^
 | 
| 
d769a183d51d
simprocs may be distinguished via 'identifier': only works for ML antiquotation (see also 13252110a6fe);
 wenzelm parents: 
78810diff
changeset | 250 | ", name = " ^ ML_Syntax.make_binding (Binding.name_of name, Binding.pos_of name) ^ | 
| 80709 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 251 | ", kind = " ^ print_proc_kind kind ^ | 
| 78812 
d769a183d51d
simprocs may be distinguished via 'identifier': only works for ML antiquotation (see also 13252110a6fe);
 wenzelm parents: 
78810diff
changeset | 252 | ", lhss = " ^ ML_Syntax.print_strings lhss ^ | 
| 
d769a183d51d
simprocs may be distinguished via 'identifier': only works for ML antiquotation (see also 13252110a6fe);
 wenzelm parents: 
78810diff
changeset | 253 |                ", proc = (") @ ML_Lex.read_source proc @ ML_Lex.read "), identifier = []}"))
 | 
| 
d769a183d51d
simprocs may be distinguished via 'identifier': only works for ML antiquotation (see also 13252110a6fe);
 wenzelm parents: 
78810diff
changeset | 254 | | SOME (pos, _) => | 
| 
d769a183d51d
simprocs may be distinguished via 'identifier': only works for ML antiquotation (see also 13252110a6fe);
 wenzelm parents: 
78810diff
changeset | 255 |         error ("Bad command " ^ Markup.markup Markup.keyword1 "simproc_setup" ^
 | 
| 
d769a183d51d
simprocs may be distinguished via 'identifier': only works for ML antiquotation (see also 13252110a6fe);
 wenzelm parents: 
78810diff
changeset | 256 | " with " ^ Markup.markup Markup.keyword2 "identifier" ^ | 
| 
d769a183d51d
simprocs may be distinguished via 'identifier': only works for ML antiquotation (see also 13252110a6fe);
 wenzelm parents: 
78810diff
changeset | 257 | ": this is only supported in\nML antiquotation \<^simproc_setup>\<open>...\<close>" ^ Position.here pos))); | 
| 78803 | 258 | |
| 78796 
f34926a91fea
clarified signature: more concise simproc setup in ML;
 wenzelm parents: 
78792diff
changeset | 259 | |
| 
f34926a91fea
clarified signature: more concise simproc setup in ML;
 wenzelm parents: 
78792diff
changeset | 260 | |
| 71788 
ca3ac5238c41
hooks for foundational terms: protection of foundational terms during simplification
 haftmann parents: 
71235diff
changeset | 261 | (** congruence rule to protect foundational terms of local definitions **) | 
| 
ca3ac5238c41
hooks for foundational terms: protection of foundational terms during simplification
 haftmann parents: 
71235diff
changeset | 262 | |
| 
ca3ac5238c41
hooks for foundational terms: protection of foundational terms during simplification
 haftmann parents: 
71235diff
changeset | 263 | local | 
| 
ca3ac5238c41
hooks for foundational terms: protection of foundational terms during simplification
 haftmann parents: 
71235diff
changeset | 264 | |
| 78043 | 265 | fun add_foundation_cong (binding, (const, target_params)) gthy = | 
| 266 | if null target_params then gthy | |
| 71788 
ca3ac5238c41
hooks for foundational terms: protection of foundational terms during simplification
 haftmann parents: 
71235diff
changeset | 267 | else | 
| 
ca3ac5238c41
hooks for foundational terms: protection of foundational terms during simplification
 haftmann parents: 
71235diff
changeset | 268 | let | 
| 78043 | 269 | val thy = Context.theory_of gthy; | 
| 270 | val cong = | |
| 271 | list_comb (const, target_params) | |
| 272 | |> Logic.varify_global | |
| 273 | |> Thm.global_cterm_of thy | |
| 274 | |> Thm.reflexive | |
| 275 | |> Thm.close_derivation \<^here>; | |
| 276 | val cong_binding = Binding.qualify_name true binding "cong"; | |
| 71788 
ca3ac5238c41
hooks for foundational terms: protection of foundational terms during simplification
 haftmann parents: 
71235diff
changeset | 277 | in | 
| 
ca3ac5238c41
hooks for foundational terms: protection of foundational terms during simplification
 haftmann parents: 
71235diff
changeset | 278 | gthy | 
| 78043 | 279 | |> Attrib.generic_notes Thm.theoremK [((cong_binding, []), [([cong], [])])] | 
| 280 | |> #2 | |
| 71788 
ca3ac5238c41
hooks for foundational terms: protection of foundational terms during simplification
 haftmann parents: 
71235diff
changeset | 281 | end; | 
| 
ca3ac5238c41
hooks for foundational terms: protection of foundational terms during simplification
 haftmann parents: 
71235diff
changeset | 282 | |
| 78043 | 283 | val _ = Theory.setup (Generic_Target.add_foundation_interpretation add_foundation_cong); | 
| 71788 
ca3ac5238c41
hooks for foundational terms: protection of foundational terms during simplification
 haftmann parents: 
71235diff
changeset | 284 | |
| 78043 | 285 | in end; | 
| 71788 
ca3ac5238c41
hooks for foundational terms: protection of foundational terms during simplification
 haftmann parents: 
71235diff
changeset | 286 | |
| 
ca3ac5238c41
hooks for foundational terms: protection of foundational terms during simplification
 haftmann parents: 
71235diff
changeset | 287 | |
| 22201 | 288 | |
| 56510 
aec722524c33
added simproc markup, which also indicates legacy simprocs outside the name space;
 wenzelm parents: 
56204diff
changeset | 289 | (** pretty_simpset **) | 
| 
aec722524c33
added simproc markup, which also indicates legacy simprocs outside the name space;
 wenzelm parents: 
56204diff
changeset | 290 | |
| 59917 
9830c944670f
more uniform "verbose" option to print name space;
 wenzelm parents: 
59621diff
changeset | 291 | fun pretty_simpset verbose ctxt = | 
| 56510 
aec722524c33
added simproc markup, which also indicates legacy simprocs outside the name space;
 wenzelm parents: 
56204diff
changeset | 292 | let | 
| 
aec722524c33
added simproc markup, which also indicates legacy simprocs outside the name space;
 wenzelm parents: 
56204diff
changeset | 293 | val pretty_term = Syntax.pretty_term ctxt; | 
| 61268 | 294 | val pretty_thm = Thm.pretty_thm ctxt; | 
| 295 | val pretty_thm_item = Thm.pretty_thm_item ctxt; | |
| 56510 
aec722524c33
added simproc markup, which also indicates legacy simprocs outside the name space;
 wenzelm parents: 
56204diff
changeset | 296 | |
| 
aec722524c33
added simproc markup, which also indicates legacy simprocs outside the name space;
 wenzelm parents: 
56204diff
changeset | 297 | fun pretty_simproc (name, lhss) = | 
| 
aec722524c33
added simproc markup, which also indicates legacy simprocs outside the name space;
 wenzelm parents: 
56204diff
changeset | 298 | Pretty.block | 
| 
aec722524c33
added simproc markup, which also indicates legacy simprocs outside the name space;
 wenzelm parents: 
56204diff
changeset | 299 | (Pretty.mark_str name :: Pretty.str ":" :: Pretty.fbrk :: | 
| 61098 | 300 | Pretty.fbreaks (map (Pretty.item o single o pretty_term) lhss)); | 
| 56510 
aec722524c33
added simproc markup, which also indicates legacy simprocs outside the name space;
 wenzelm parents: 
56204diff
changeset | 301 | |
| 80709 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 302 |     fun pretty_congproc (name, {lhss, proc}) =
 | 
| 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 303 | let | 
| 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 304 | val prt_rule = | 
| 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 305 |           (case try (Morphism.form_context' ctxt proc) @{cterm dummy} of
 | 
| 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 306 | SOME (SOME thm) => [Pretty.fbrk, Pretty.str "rule:", Pretty.fbrk, pretty_thm thm] | 
| 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 307 | | NONE => []); | 
| 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 308 | in | 
| 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 309 | Pretty.block | 
| 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 310 | (Pretty.mark_str name :: Pretty.str ":" :: Pretty.fbrk :: | 
| 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 311 | Pretty.fbreaks (map (Pretty.item o single o pretty_term) lhss) @ prt_rule) | 
| 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 312 | end; | 
| 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 313 | |
| 56510 
aec722524c33
added simproc markup, which also indicates legacy simprocs outside the name space;
 wenzelm parents: 
56204diff
changeset | 314 | fun pretty_cong_name (const, name) = | 
| 
aec722524c33
added simproc markup, which also indicates legacy simprocs outside the name space;
 wenzelm parents: 
56204diff
changeset | 315 | pretty_term ((if const then Const else Free) (name, dummyT)); | 
| 
aec722524c33
added simproc markup, which also indicates legacy simprocs outside the name space;
 wenzelm parents: 
56204diff
changeset | 316 | fun pretty_cong (name, thm) = | 
| 
aec722524c33
added simproc markup, which also indicates legacy simprocs outside the name space;
 wenzelm parents: 
56204diff
changeset | 317 | Pretty.block [pretty_cong_name name, Pretty.str ":", Pretty.brk 1, pretty_thm thm]; | 
| 
aec722524c33
added simproc markup, which also indicates legacy simprocs outside the name space;
 wenzelm parents: 
56204diff
changeset | 318 | |
| 80708 | 319 | val ss = dest_ss (simpset_of ctxt); | 
| 80709 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 320 | val simproc_space = Name_Space.space_of_table (get_simprocs ctxt); | 
| 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 321 | val simprocs = Name_Space.markup_entries verbose ctxt simproc_space (#simprocs ss); | 
| 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 322 | val congprocs = Name_Space.markup_entries verbose ctxt simproc_space (#congprocs ss); | 
| 56510 
aec722524c33
added simproc markup, which also indicates legacy simprocs outside the name space;
 wenzelm parents: 
56204diff
changeset | 323 | in | 
| 80708 | 324 | [Pretty.big_list "simplification rules:" (map (pretty_thm_item o #2) (#simps ss)), | 
| 56510 
aec722524c33
added simproc markup, which also indicates legacy simprocs outside the name space;
 wenzelm parents: 
56204diff
changeset | 325 | Pretty.big_list "simplification procedures:" (map pretty_simproc simprocs), | 
| 80709 
e6f026505c5b
support for congprocs in the Simplifier, closely following Norbert Schirmer et-al, but with only one "simproc" name space and "simproc_setup" command / ML antiquotation;
 wenzelm parents: 
80708diff
changeset | 326 | Pretty.big_list "congruence procedures:" (map pretty_congproc congprocs), | 
| 80708 | 327 | Pretty.big_list "congruences:" (map pretty_cong (#congs ss)), | 
| 328 |       Pretty.strs ("loopers:" :: map quote (#loopers ss)),
 | |
| 329 |       Pretty.strs ("unsafe solvers:" :: map quote (#unsafe_solvers ss)),
 | |
| 330 |       Pretty.strs ("safe solvers:" :: map quote (#safe_solvers ss))]
 | |
| 56510 
aec722524c33
added simproc markup, which also indicates legacy simprocs outside the name space;
 wenzelm parents: 
56204diff
changeset | 331 | |> Pretty.chunks | 
| 
aec722524c33
added simproc markup, which also indicates legacy simprocs outside the name space;
 wenzelm parents: 
56204diff
changeset | 332 | end; | 
| 
aec722524c33
added simproc markup, which also indicates legacy simprocs outside the name space;
 wenzelm parents: 
56204diff
changeset | 333 | |
| 
aec722524c33
added simproc markup, which also indicates legacy simprocs outside the name space;
 wenzelm parents: 
56204diff
changeset | 334 | |
| 
aec722524c33
added simproc markup, which also indicates legacy simprocs outside the name space;
 wenzelm parents: 
56204diff
changeset | 335 | |
| 17967 
7a733b7438e1
added simplification tactics and rules (from meta_simplifier.ML);
 wenzelm parents: 
17898diff
changeset | 336 | (** simplification tactics and rules **) | 
| 
7a733b7438e1
added simplification tactics and rules (from meta_simplifier.ML);
 wenzelm parents: 
17898diff
changeset | 337 | |
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 338 | fun solve_all_tac solvers ctxt = | 
| 17967 
7a733b7438e1
added simplification tactics and rules (from meta_simplifier.ML);
 wenzelm parents: 
17898diff
changeset | 339 | let | 
| 71235 | 340 | val subgoal_tac = Raw_Simplifier.subgoal_tac (Raw_Simplifier.set_solvers solvers ctxt); | 
| 341 | val solve_tac = subgoal_tac THEN_ALL_NEW (K no_tac); | |
| 17967 
7a733b7438e1
added simplification tactics and rules (from meta_simplifier.ML);
 wenzelm parents: 
17898diff
changeset | 342 | in DEPTH_SOLVE (solve_tac 1) end; | 
| 
7a733b7438e1
added simplification tactics and rules (from meta_simplifier.ML);
 wenzelm parents: 
17898diff
changeset | 343 | |
| 
7a733b7438e1
added simplification tactics and rules (from meta_simplifier.ML);
 wenzelm parents: 
17898diff
changeset | 344 | (*NOTE: may instantiate unknowns that appear also in other subgoals*) | 
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 345 | fun generic_simp_tac safe mode ctxt = | 
| 17967 
7a733b7438e1
added simplification tactics and rules (from meta_simplifier.ML);
 wenzelm parents: 
17898diff
changeset | 346 | let | 
| 71235 | 347 | val loop_tac = Raw_Simplifier.loop_tac ctxt; | 
| 348 | val (unsafe_solvers, solvers) = Raw_Simplifier.solvers ctxt; | |
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 349 | val solve_tac = FIRST' (map (Raw_Simplifier.solver ctxt) | 
| 22717 | 350 | (rev (if safe then solvers else unsafe_solvers))); | 
| 17967 
7a733b7438e1
added simplification tactics and rules (from meta_simplifier.ML);
 wenzelm parents: 
17898diff
changeset | 351 | |
| 
7a733b7438e1
added simplification tactics and rules (from meta_simplifier.ML);
 wenzelm parents: 
17898diff
changeset | 352 | fun simp_loop_tac i = | 
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 353 | Raw_Simplifier.generic_rewrite_goal_tac mode (solve_all_tac unsafe_solvers) ctxt i THEN | 
| 17967 
7a733b7438e1
added simplification tactics and rules (from meta_simplifier.ML);
 wenzelm parents: 
17898diff
changeset | 354 | (solve_tac i ORELSE TRY ((loop_tac THEN_ALL_NEW simp_loop_tac) i)); | 
| 52458 
210bca64b894
less intrusive SELECT_GOAL: merely rearrange subgoals without detaching goal state, and thus preserve maxidx context;
 wenzelm parents: 
51717diff
changeset | 355 | in PREFER_GOAL (simp_loop_tac 1) end; | 
| 17967 
7a733b7438e1
added simplification tactics and rules (from meta_simplifier.ML);
 wenzelm parents: 
17898diff
changeset | 356 | |
| 
7a733b7438e1
added simplification tactics and rules (from meta_simplifier.ML);
 wenzelm parents: 
17898diff
changeset | 357 | local | 
| 
7a733b7438e1
added simplification tactics and rules (from meta_simplifier.ML);
 wenzelm parents: 
17898diff
changeset | 358 | |
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 359 | fun simp rew mode ctxt thm = | 
| 17967 
7a733b7438e1
added simplification tactics and rules (from meta_simplifier.ML);
 wenzelm parents: 
17898diff
changeset | 360 | let | 
| 71235 | 361 | val (unsafe_solvers, _) = Raw_Simplifier.solvers ctxt; | 
| 22717 | 362 | val tacf = solve_all_tac (rev unsafe_solvers); | 
| 17967 
7a733b7438e1
added simplification tactics and rules (from meta_simplifier.ML);
 wenzelm parents: 
17898diff
changeset | 363 | fun prover s th = Option.map #1 (Seq.pull (tacf s th)); | 
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 364 | in rew mode prover ctxt thm end; | 
| 17967 
7a733b7438e1
added simplification tactics and rules (from meta_simplifier.ML);
 wenzelm parents: 
17898diff
changeset | 365 | |
| 
7a733b7438e1
added simplification tactics and rules (from meta_simplifier.ML);
 wenzelm parents: 
17898diff
changeset | 366 | in | 
| 
7a733b7438e1
added simplification tactics and rules (from meta_simplifier.ML);
 wenzelm parents: 
17898diff
changeset | 367 | |
| 41228 
e1fce873b814
renamed structure MetaSimplifier to raw_Simplifer, to emphasize its meaning;
 wenzelm parents: 
41226diff
changeset | 368 | val simp_thm = simp Raw_Simplifier.rewrite_thm; | 
| 
e1fce873b814
renamed structure MetaSimplifier to raw_Simplifer, to emphasize its meaning;
 wenzelm parents: 
41226diff
changeset | 369 | val simp_cterm = simp Raw_Simplifier.rewrite_cterm; | 
| 17967 
7a733b7438e1
added simplification tactics and rules (from meta_simplifier.ML);
 wenzelm parents: 
17898diff
changeset | 370 | |
| 
7a733b7438e1
added simplification tactics and rules (from meta_simplifier.ML);
 wenzelm parents: 
17898diff
changeset | 371 | end; | 
| 
7a733b7438e1
added simplification tactics and rules (from meta_simplifier.ML);
 wenzelm parents: 
17898diff
changeset | 372 | |
| 
7a733b7438e1
added simplification tactics and rules (from meta_simplifier.ML);
 wenzelm parents: 
17898diff
changeset | 373 | |
| 16806 | 374 | (* tactics *) | 
| 375 | ||
| 16014 | 376 | val simp_tac = generic_simp_tac false (false, false, false); | 
| 377 | val asm_simp_tac = generic_simp_tac false (false, true, false); | |
| 378 | val full_simp_tac = generic_simp_tac false (true, false, false); | |
| 379 | val asm_lr_simp_tac = generic_simp_tac false (true, true, false); | |
| 380 | val asm_full_simp_tac = generic_simp_tac false (true, true, true); | |
| 50107 | 381 | |
| 382 | (*not totally safe: may instantiate unknowns that appear also in other subgoals*) | |
| 383 | val safe_simp_tac = generic_simp_tac true (false, false, false); | |
| 384 | val safe_asm_simp_tac = generic_simp_tac true (false, true, false); | |
| 385 | val safe_full_simp_tac = generic_simp_tac true (true, false, false); | |
| 386 | val safe_asm_lr_simp_tac = generic_simp_tac true (true, true, false); | |
| 16014 | 387 | val safe_asm_full_simp_tac = generic_simp_tac true (true, true, true); | 
| 388 | ||
| 16806 | 389 | |
| 390 | (* conversions *) | |
| 391 | ||
| 17967 
7a733b7438e1
added simplification tactics and rules (from meta_simplifier.ML);
 wenzelm parents: 
17898diff
changeset | 392 | val simplify = simp_thm (false, false, false); | 
| 
7a733b7438e1
added simplification tactics and rules (from meta_simplifier.ML);
 wenzelm parents: 
17898diff
changeset | 393 | val asm_simplify = simp_thm (false, true, false); | 
| 
7a733b7438e1
added simplification tactics and rules (from meta_simplifier.ML);
 wenzelm parents: 
17898diff
changeset | 394 | val full_simplify = simp_thm (true, false, false); | 
| 
7a733b7438e1
added simplification tactics and rules (from meta_simplifier.ML);
 wenzelm parents: 
17898diff
changeset | 395 | val asm_lr_simplify = simp_thm (true, true, false); | 
| 
7a733b7438e1
added simplification tactics and rules (from meta_simplifier.ML);
 wenzelm parents: 
17898diff
changeset | 396 | val asm_full_simplify = simp_thm (true, true, true); | 
| 16014 | 397 | |
| 17967 
7a733b7438e1
added simplification tactics and rules (from meta_simplifier.ML);
 wenzelm parents: 
17898diff
changeset | 398 | val rewrite = simp_cterm (false, false, false); | 
| 
7a733b7438e1
added simplification tactics and rules (from meta_simplifier.ML);
 wenzelm parents: 
17898diff
changeset | 399 | val asm_rewrite = simp_cterm (false, true, false); | 
| 
7a733b7438e1
added simplification tactics and rules (from meta_simplifier.ML);
 wenzelm parents: 
17898diff
changeset | 400 | val full_rewrite = simp_cterm (true, false, false); | 
| 
7a733b7438e1
added simplification tactics and rules (from meta_simplifier.ML);
 wenzelm parents: 
17898diff
changeset | 401 | val asm_lr_rewrite = simp_cterm (true, true, false); | 
| 
7a733b7438e1
added simplification tactics and rules (from meta_simplifier.ML);
 wenzelm parents: 
17898diff
changeset | 402 | val asm_full_rewrite = simp_cterm (true, true, true); | 
| 16014 | 403 | |
| 404 | ||
| 405 | ||
| 406 | (** concrete syntax of attributes **) | |
| 407 | ||
| 408 | (* add / del *) | |
| 409 | ||
| 410 | val simpN = "simp"; | |
| 68403 | 411 | val flipN = "flip" | 
| 16014 | 412 | val congN = "cong"; | 
| 413 | val onlyN = "only"; | |
| 414 | val no_asmN = "no_asm"; | |
| 415 | val no_asm_useN = "no_asm_use"; | |
| 416 | val no_asm_simpN = "no_asm_simp"; | |
| 417 | val asm_lrN = "asm_lr"; | |
| 418 | ||
| 419 | ||
| 24024 | 420 | (* simprocs *) | 
| 421 | ||
| 422 | local | |
| 423 | ||
| 424 | val add_del = | |
| 80700 | 425 | (Args.del -- Args.colon >> K del_proc || | 
| 426 | Scan.option (Args.add -- Args.colon) >> K add_proc) | |
| 78072 | 427 | >> (fn f => fn simproc => Morphism.entity (fn phi => Thm.declaration_attribute | 
| 80700 | 428 | (K (Raw_Simplifier.map_ss (f (transform_simproc phi simproc)))))); | 
| 24024 | 429 | |
| 430 | in | |
| 431 | ||
| 30528 | 432 | val simproc_att = | 
| 42465 
1ba52683512a
clarified check_simproc (with report) vs. the_simproc;
 wenzelm parents: 
42464diff
changeset | 433 | (Args.context -- Scan.lift add_del) :|-- (fn (ctxt, decl) => | 
| 78115 | 434 | Scan.repeat1 (Scan.lift (Args.named_attribute (decl o #2 o check_simproc ctxt)))) | 
| 45375 
7fe19930dfc9
more explicit representation of rule_attribute vs. declaration_attribute vs. mixed_attribute;
 wenzelm parents: 
45326diff
changeset | 435 | >> (fn atts => Thm.declaration_attribute (fn th => | 
| 46776 | 436 | fold (fn att => Thm.attribute_declaration (Morphism.form att) th) atts)); | 
| 24024 | 437 | |
| 438 | end; | |
| 24124 
4399175e3014
turned simp_depth_limit into configuration option;
 wenzelm parents: 
24024diff
changeset | 439 | |
| 24024 | 440 | |
| 16014 | 441 | (* conversions *) | 
| 442 | ||
| 443 | local | |
| 444 | ||
| 445 | fun conv_mode x = | |
| 446 | ((Args.parens (Args.$$$ no_asmN) >> K simplify || | |
| 447 | Args.parens (Args.$$$ no_asm_simpN) >> K asm_simplify || | |
| 448 | Args.parens (Args.$$$ no_asm_useN) >> K full_simplify || | |
| 449 | Scan.succeed asm_full_simplify) |> Scan.lift) x; | |
| 450 | ||
| 451 | in | |
| 452 | ||
| 30528 | 453 | val simplified = conv_mode -- Attrib.thms >> | 
| 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: 
61841diff
changeset | 454 | (fn (f, ths) => Thm.rule_attribute ths (fn context => | 
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 455 | f ((if null ths then I else Raw_Simplifier.clear_simpset) | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 456 | (Context.proof_of context) addsimps ths))); | 
| 16014 | 457 | |
| 458 | end; | |
| 459 | ||
| 460 | ||
| 461 | (* setup attributes *) | |
| 462 | ||
| 80711 
043e5fd3ce32
more direct access to Simplifier.mk_cong, to avoid odd Simpdata.mk_meta_cong seen in the wild;
 wenzelm parents: 
80709diff
changeset | 463 | val cong_format = Scan.succeed (Thm.rule_attribute [] (Context.proof_of #> mk_cong)); | 
| 
043e5fd3ce32
more direct access to Simplifier.mk_cong, to avoid odd Simpdata.mk_meta_cong seen in the wild;
 wenzelm parents: 
80709diff
changeset | 464 | |
| 53171 | 465 | val _ = Theory.setup | 
| 67147 | 466 | (Attrib.setup \<^binding>\<open>simp\<close> (Attrib.add_del simp_add simp_del) | 
| 30528 | 467 | "declaration of Simplifier rewrite rule" #> | 
| 67147 | 468 | Attrib.setup \<^binding>\<open>cong\<close> (Attrib.add_del cong_add cong_del) | 
| 30528 | 469 | "declaration of Simplifier congruence rule" #> | 
| 67147 | 470 | Attrib.setup \<^binding>\<open>simproc\<close> simproc_att | 
| 33671 | 471 | "declaration of simplification procedures" #> | 
| 80711 
043e5fd3ce32
more direct access to Simplifier.mk_cong, to avoid odd Simpdata.mk_meta_cong seen in the wild;
 wenzelm parents: 
80709diff
changeset | 472 | Attrib.setup \<^binding>\<open>simplified\<close> simplified "simplified rule" #> | 
| 
043e5fd3ce32
more direct access to Simplifier.mk_cong, to avoid odd Simpdata.mk_meta_cong seen in the wild;
 wenzelm parents: 
80709diff
changeset | 473 | Attrib.setup \<^binding>\<open>cong_format\<close> cong_format "internal format of Simplifier cong rule"); | 
| 16014 | 474 | |
| 475 | ||
| 476 | ||
| 31300 | 477 | (** method syntax **) | 
| 16014 | 478 | |
| 479 | val cong_modifiers = | |
| 64556 | 480 | [Args.$$$ congN -- Args.colon >> K (Method.modifier cong_add \<^here>), | 
| 481 | Args.$$$ congN -- Args.add -- Args.colon >> K (Method.modifier cong_add \<^here>), | |
| 482 | Args.$$$ congN -- Args.del -- Args.colon >> K (Method.modifier cong_del \<^here>)]; | |
| 16014 | 483 | |
| 484 | val simp_modifiers = | |
| 64556 | 485 | [Args.$$$ simpN -- Args.colon >> K (Method.modifier simp_add \<^here>), | 
| 486 | Args.$$$ simpN -- Args.add -- Args.colon >> K (Method.modifier simp_add \<^here>), | |
| 487 | Args.$$$ simpN -- Args.del -- Args.colon >> K (Method.modifier simp_del \<^here>), | |
| 68403 | 488 | Args.$$$ simpN -- Args.$$$ flipN -- Args.colon >> K (Method.modifier simp_flip \<^here>), | 
| 58048 
aa6296d09e0e
more explicit Method.modifier with reported position;
 wenzelm parents: 
58008diff
changeset | 489 | Args.$$$ simpN -- Args.$$$ onlyN -- Args.colon >> | 
| 64556 | 490 |     K {init = Raw_Simplifier.clear_simpset, attribute = simp_add, pos = \<^here>}]
 | 
| 16014 | 491 | @ cong_modifiers; | 
| 492 | ||
| 493 | val simp_modifiers' = | |
| 64556 | 494 | [Args.add -- Args.colon >> K (Method.modifier simp_add \<^here>), | 
| 495 | Args.del -- Args.colon >> K (Method.modifier simp_del \<^here>), | |
| 68403 | 496 | Args.$$$ flipN -- Args.colon >> K (Method.modifier simp_flip \<^here>), | 
| 58048 
aa6296d09e0e
more explicit Method.modifier with reported position;
 wenzelm parents: 
58008diff
changeset | 497 | Args.$$$ onlyN -- Args.colon >> | 
| 64556 | 498 |     K {init = Raw_Simplifier.clear_simpset, attribute = simp_add, pos = \<^here>}]
 | 
| 16014 | 499 | @ cong_modifiers; | 
| 500 | ||
| 31300 | 501 | val simp_options = | 
| 502 | (Args.parens (Args.$$$ no_asmN) >> K simp_tac || | |
| 503 | Args.parens (Args.$$$ no_asm_simpN) >> K asm_simp_tac || | |
| 504 | Args.parens (Args.$$$ no_asm_useN) >> K full_simp_tac || | |
| 505 | Args.parens (Args.$$$ asm_lrN) >> K asm_lr_simp_tac || | |
| 506 | Scan.succeed asm_full_simp_tac); | |
| 16014 | 507 | |
| 31300 | 508 | fun simp_method more_mods meth = | 
| 35613 | 509 | Scan.lift simp_options --| | 
| 31300 | 510 | Method.sections (more_mods @ simp_modifiers') >> | 
| 35613 | 511 | (fn tac => fn ctxt => METHOD (fn facts => meth ctxt tac facts)); | 
| 16014 | 512 | |
| 513 | ||
| 514 | ||
| 18708 | 515 | (** setup **) | 
| 516 | ||
| 31300 | 517 | fun method_setup more_mods = | 
| 67147 | 518 | Method.setup \<^binding>\<open>simp\<close> | 
| 31300 | 519 | (simp_method more_mods (fn ctxt => fn tac => fn facts => | 
| 61841 
4d3527b94f2a
more general types Proof.method / context_tactic;
 wenzelm parents: 
61268diff
changeset | 520 | HEADGOAL (Method.insert_tac ctxt facts THEN' | 
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
51688diff
changeset | 521 | (CHANGED_PROP oo tac) ctxt))) | 
| 31300 | 522 | "simplification" #> | 
| 67147 | 523 | Method.setup \<^binding>\<open>simp_all\<close> | 
| 31300 | 524 | (simp_method more_mods (fn ctxt => fn tac => fn facts => | 
| 61841 
4d3527b94f2a
more general types Proof.method / context_tactic;
 wenzelm parents: 
61268diff
changeset | 525 | ALLGOALS (Method.insert_tac ctxt facts) THEN | 
| 58008 | 526 | (CHANGED_PROP o PARALLEL_ALLGOALS o tac) ctxt)) | 
| 31300 | 527 | "simplification (all goals)"; | 
| 16014 | 528 | |
| 63532 
b01154b74314
provide Pure.simp/simp_all, which only know about meta-equality;
 wenzelm parents: 
63221diff
changeset | 529 | fun unsafe_solver_tac ctxt = | 
| 
b01154b74314
provide Pure.simp/simp_all, which only know about meta-equality;
 wenzelm parents: 
63221diff
changeset | 530 | FIRST' [resolve_tac ctxt (Drule.reflexive_thm :: Raw_Simplifier.prems_of ctxt), assume_tac ctxt]; | 
| 
b01154b74314
provide Pure.simp/simp_all, which only know about meta-equality;
 wenzelm parents: 
63221diff
changeset | 531 | val unsafe_solver = mk_solver "Pure unsafe" unsafe_solver_tac; | 
| 16014 | 532 | |
| 63532 
b01154b74314
provide Pure.simp/simp_all, which only know about meta-equality;
 wenzelm parents: 
63221diff
changeset | 533 | (*no premature instantiation of variables during simplification*) | 
| 
b01154b74314
provide Pure.simp/simp_all, which only know about meta-equality;
 wenzelm parents: 
63221diff
changeset | 534 | fun safe_solver_tac ctxt = | 
| 
b01154b74314
provide Pure.simp/simp_all, which only know about meta-equality;
 wenzelm parents: 
63221diff
changeset | 535 | FIRST' [match_tac ctxt (Drule.reflexive_thm :: Raw_Simplifier.prems_of ctxt), eq_assume_tac]; | 
| 
b01154b74314
provide Pure.simp/simp_all, which only know about meta-equality;
 wenzelm parents: 
63221diff
changeset | 536 | val safe_solver = mk_solver "Pure safe" safe_solver_tac; | 
| 16014 | 537 | |
| 63532 
b01154b74314
provide Pure.simp/simp_all, which only know about meta-equality;
 wenzelm parents: 
63221diff
changeset | 538 | val _ = | 
| 
b01154b74314
provide Pure.simp/simp_all, which only know about meta-equality;
 wenzelm parents: 
63221diff
changeset | 539 | Theory.setup | 
| 
b01154b74314
provide Pure.simp/simp_all, which only know about meta-equality;
 wenzelm parents: 
63221diff
changeset | 540 | (method_setup [] #> Context.theory_map (map_ss (fn ctxt => | 
| 
b01154b74314
provide Pure.simp/simp_all, which only know about meta-equality;
 wenzelm parents: 
63221diff
changeset | 541 | empty_simpset ctxt | 
| 
b01154b74314
provide Pure.simp/simp_all, which only know about meta-equality;
 wenzelm parents: 
63221diff
changeset | 542 | setSSolver safe_solver | 
| 
b01154b74314
provide Pure.simp/simp_all, which only know about meta-equality;
 wenzelm parents: 
63221diff
changeset | 543 | setSolver unsafe_solver | 
| 
b01154b74314
provide Pure.simp/simp_all, which only know about meta-equality;
 wenzelm parents: 
63221diff
changeset | 544 | |> set_subgoaler asm_simp_tac))); | 
| 16014 | 545 | |
| 546 | end; | |
| 547 | ||
| 32738 | 548 | structure Basic_Simplifier: BASIC_SIMPLIFIER = Simplifier; | 
| 549 | open Basic_Simplifier; |