| author | wenzelm | 
| Tue, 17 Dec 2019 15:04:29 +0100 | |
| changeset 71297 | 9f2085c499a2 | 
| parent 69597 | ff784d5a5bfb | 
| child 78806 | aca84704d46f | 
| permissions | -rw-r--r-- | 
| 19494 | 1 | (* Title: HOL/Nominal/nominal_permeq.ML | 
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32733diff
changeset | 2 | Author: Christian Urban, TU Muenchen | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32733diff
changeset | 3 | Author: Julien Narboux, TU Muenchen | 
| 17870 | 4 | |
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32733diff
changeset | 5 | Methods for simplifying permutations and for analysing equations | 
| 61144 | 6 | involving permutations. | 
| 19494 | 7 | *) | 
| 17870 | 8 | |
| 20431 | 9 | (* | 
| 10 | FIXMES: | |
| 11 | ||
| 12 | - allow the user to give an explicit set S in the | |
| 13 | fresh_guess tactic which is then verified | |
| 14 | ||
| 15 | - the perm_compose tactic does not do an "outermost | |
| 16 | rewriting" and can therefore not deal with goals | |
| 17 | like | |
| 18 | ||
| 19 | [(a,b)] o pi1 o pi2 = .... | |
| 20 | ||
| 61144 | 21 | rather it tries to permute pi1 over pi2, which | 
| 22 | results in a failure when used with the | |
| 20431 | 23 | perm_(full)_simp tactics | 
| 24 | ||
| 25 | *) | |
| 26 | ||
| 27 | ||
| 19987 
b97607d4d9a5
- put declarations inside a structure (NominalPermeq)
 berghofe parents: 
19858diff
changeset | 28 | signature NOMINAL_PERMEQ = | 
| 
b97607d4d9a5
- put declarations inside a structure (NominalPermeq)
 berghofe parents: 
19858diff
changeset | 29 | sig | 
| 25997 | 30 | val perm_simproc_fun : simproc | 
| 31 | val perm_simproc_app : simproc | |
| 32 | ||
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
46219diff
changeset | 33 | val perm_simp_tac : Proof.context -> int -> tactic | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
46219diff
changeset | 34 | val perm_extend_simp_tac : Proof.context -> int -> tactic | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
46219diff
changeset | 35 | val supports_tac : Proof.context -> int -> tactic | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
46219diff
changeset | 36 | val finite_guess_tac : Proof.context -> int -> tactic | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
46219diff
changeset | 37 | val fresh_guess_tac : Proof.context -> int -> tactic | 
| 17870 | 38 | |
| 30549 | 39 | val perm_simp_meth : (Proof.context -> Proof.method) context_parser | 
| 40 | val perm_simp_meth_debug : (Proof.context -> Proof.method) context_parser | |
| 41 | val perm_extend_simp_meth : (Proof.context -> Proof.method) context_parser | |
| 42 | val perm_extend_simp_meth_debug : (Proof.context -> Proof.method) context_parser | |
| 43 | val supports_meth : (Proof.context -> Proof.method) context_parser | |
| 44 | val supports_meth_debug : (Proof.context -> Proof.method) context_parser | |
| 45 | val finite_guess_meth : (Proof.context -> Proof.method) context_parser | |
| 46 | val finite_guess_meth_debug : (Proof.context -> Proof.method) context_parser | |
| 47 | val fresh_guess_meth : (Proof.context -> Proof.method) context_parser | |
| 48 | val fresh_guess_meth_debug : (Proof.context -> Proof.method) context_parser | |
| 19987 
b97607d4d9a5
- put declarations inside a structure (NominalPermeq)
 berghofe parents: 
19858diff
changeset | 49 | end | 
| 
b97607d4d9a5
- put declarations inside a structure (NominalPermeq)
 berghofe parents: 
19858diff
changeset | 50 | |
| 
b97607d4d9a5
- put declarations inside a structure (NominalPermeq)
 berghofe parents: 
19858diff
changeset | 51 | structure NominalPermeq : NOMINAL_PERMEQ = | 
| 
b97607d4d9a5
- put declarations inside a structure (NominalPermeq)
 berghofe parents: 
19858diff
changeset | 52 | struct | 
| 
b97607d4d9a5
- put declarations inside a structure (NominalPermeq)
 berghofe parents: 
19858diff
changeset | 53 | |
| 22418 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 54 | (* some lemmas needed below *) | 
| 24519 | 55 | val finite_emptyI = @{thm "finite.emptyI"};
 | 
| 56 | val finite_Un     = @{thm "finite_Un"};
 | |
| 57 | val conj_absorb   = @{thm "conj_absorb"};
 | |
| 58 | val not_false     = @{thm "not_False_eq_True"}
 | |
| 44684 
8dde3352d5c4
assert Pure equations for theorem references; tuned
 haftmann parents: 
43278diff
changeset | 59 | val perm_fun_def  = Simpdata.mk_eq @{thm "Nominal.perm_fun_def"};
 | 
| 24519 | 60 | val perm_eq_app   = @{thm "Nominal.pt_fun_app_eq"};
 | 
| 44684 
8dde3352d5c4
assert Pure equations for theorem references; tuned
 haftmann parents: 
43278diff
changeset | 61 | val supports_def  = Simpdata.mk_eq @{thm "Nominal.supports_def"};
 | 
| 
8dde3352d5c4
assert Pure equations for theorem references; tuned
 haftmann parents: 
43278diff
changeset | 62 | val fresh_def     = Simpdata.mk_eq @{thm "Nominal.fresh_def"};
 | 
| 24519 | 63 | val fresh_prod    = @{thm "Nominal.fresh_prod"};
 | 
| 64 | val fresh_unit    = @{thm "Nominal.fresh_unit"};
 | |
| 65 | val supports_rule = @{thm "supports_finite"};
 | |
| 66 | val supp_prod     = @{thm "supp_prod"};
 | |
| 67 | val supp_unit     = @{thm "supp_unit"};
 | |
| 68 | val pt_perm_compose_aux = @{thm "pt_perm_compose_aux"};
 | |
| 69 | val cp1_aux             = @{thm "cp1_aux"};
 | |
| 61144 | 70 | val perm_aux_fold       = @{thm "perm_aux_fold"};
 | 
| 24519 | 71 | val supports_fresh_rule = @{thm "supports_fresh"};
 | 
| 21669 | 72 | |
| 22418 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 73 | (* needed in the process of fully simplifying permutations *) | 
| 24519 | 74 | val strong_congs = [@{thm "if_cong"}]
 | 
| 22418 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 75 | (* needed to avoid warnings about overwritten congs *) | 
| 24519 | 76 | val weak_congs   = [@{thm "if_weak_cong"}]
 | 
| 22418 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 77 | |
| 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 78 | (* debugging *) | 
| 61144 | 79 | fun DEBUG ctxt (msg,tac) = | 
| 80 |     CHANGED (EVERY [print_tac ctxt ("before "^msg), tac, print_tac ctxt ("after "^msg)]);
 | |
| 81 | fun NO_DEBUG _ (_,tac) = CHANGED tac; | |
| 22418 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 82 | |
| 19477 | 83 | |
| 22418 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 84 | (* simproc that deals with instances of permutations in front *) | 
| 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 85 | (* of applications; just adding this rule to the simplifier *) | 
| 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 86 | (* would loop; it also needs careful tuning with the simproc *) | 
| 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 87 | (* for functions to avoid further possibilities for looping *) | 
| 61144 | 88 | fun perm_simproc_app' ctxt ct = | 
| 89 | let | |
| 90 | val thy = Proof_Context.theory_of ctxt | |
| 91 | val redex = Thm.term_of ct | |
| 22418 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 92 | (* the "application" case is only applicable when the head of f is not a *) | 
| 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 93 | (* constant or when (f x) is a permuation with two or more arguments *) | 
| 61144 | 94 | fun applicable_app t = | 
| 22418 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 95 | (case (strip_comb t) of | 
| 69597 | 96 | (Const (\<^const_name>\<open>Nominal.perm\<close>,_),ts) => (length ts) >= 2 | 
| 22418 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 97 | | (Const _,_) => false | 
| 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 98 | | _ => true) | 
| 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 99 | in | 
| 61144 | 100 | case redex of | 
| 19169 
20a73345dd6e
fixed a problem where a permutation is not analysed
 urbanc parents: 
19163diff
changeset | 101 | (* case pi o (f x) == (pi o f) (pi o x) *) | 
| 69597 | 102 | (Const(\<^const_name>\<open>Nominal.perm\<close>, | 
| 103 | Type(\<^type_name>\<open>fun\<close>, | |
| 104 | [Type(\<^type_name>\<open>list\<close>, [Type(\<^type_name>\<open>prod\<close>,[Type(n,_),_])]),_])) $ pi $ (f $ x)) => | |
| 22418 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 105 | (if (applicable_app f) then | 
| 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 106 | let | 
| 30364 
577edc39b501
moved basic algebra of long names from structure NameSpace to Long_Name;
 wenzelm parents: 
30280diff
changeset | 107 | val name = Long_Name.base_name n | 
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
46219diff
changeset | 108 |                 val at_inst = Global_Theory.get_thm thy ("at_" ^ name ^ "_inst")
 | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
46219diff
changeset | 109 |                 val pt_inst = Global_Theory.get_thm thy ("pt_" ^ name ^ "_inst")
 | 
| 22418 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 110 | in SOME ((at_inst RS (pt_inst RS perm_eq_app)) RS eq_reflection) end | 
| 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 111 | else NONE) | 
| 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 112 | | _ => NONE | 
| 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 113 | end | 
| 19139 | 114 | |
| 61144 | 115 | val perm_simproc_app = | 
| 69597 | 116 | Simplifier.make_simproc \<^context> "perm_simproc_app" | 
| 117 |    {lhss = [\<^term>\<open>Nominal.perm pi x\<close>], proc = K perm_simproc_app'}
 | |
| 25997 | 118 | |
| 24519 | 119 | (* a simproc that deals with permutation instances in front of functions *) | 
| 61144 | 120 | fun perm_simproc_fun' ctxt ct = | 
| 121 | let | |
| 122 | val redex = Thm.term_of ct | |
| 22418 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 123 | fun applicable_fun t = | 
| 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 124 | (case (strip_comb t) of | 
| 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 125 | (Abs _ ,[]) => true | 
| 69597 | 126 | | (Const (\<^const_name>\<open>Nominal.perm\<close>,_),_) => false | 
| 22418 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 127 | | (Const _, _) => true | 
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32733diff
changeset | 128 | | _ => false) | 
| 22418 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 129 | in | 
| 61144 | 130 | case redex of | 
| 131 | (* case pi o f == (%x. pi o (f ((rev pi)o x))) *) | |
| 69597 | 132 | (Const(\<^const_name>\<open>Nominal.perm\<close>,_) $ pi $ f) => | 
| 44830 | 133 | (if applicable_fun f then SOME perm_fun_def else NONE) | 
| 22418 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 134 | | _ => NONE | 
| 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 135 | end | 
| 19139 | 136 | |
| 61144 | 137 | val perm_simproc_fun = | 
| 69597 | 138 | Simplifier.make_simproc \<^context> "perm_simproc_fun" | 
| 139 |    {lhss = [\<^term>\<open>Nominal.perm pi x\<close>], proc = K perm_simproc_fun'}
 | |
| 25997 | 140 | |
| 28322 
6f4cf302c798
made the perm_simp tactic to understand options such as (no_asm)
 urbanc parents: 
28262diff
changeset | 141 | (* function for simplyfying permutations *) | 
| 
6f4cf302c798
made the perm_simp tactic to understand options such as (no_asm)
 urbanc parents: 
28262diff
changeset | 142 | (* stac contains the simplifiation tactic that is *) | 
| 
6f4cf302c798
made the perm_simp tactic to understand options such as (no_asm)
 urbanc parents: 
28262diff
changeset | 143 | (* applied (see (no_asm) options below *) | 
| 61144 | 144 | fun perm_simp_gen stac dyn_thms eqvt_thms ctxt i = | 
| 56230 | 145 |     ("general simplification of permutations", fn st => SUBGOAL (fn _ =>
 | 
| 22418 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 146 | let | 
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
46219diff
changeset | 147 | val ctxt' = ctxt | 
| 60359 | 148 | addsimps (maps (Proof_Context.get_thms ctxt) dyn_thms @ eqvt_thms) | 
| 25997 | 149 | addsimprocs [perm_simproc_fun, perm_simproc_app] | 
| 45620 
f2a587696afb
modernized some old-style infix operations, which were left over from the time of ML proof scripts;
 wenzelm parents: 
44830diff
changeset | 150 | |> fold Simplifier.del_cong weak_congs | 
| 
f2a587696afb
modernized some old-style infix operations, which were left over from the time of ML proof scripts;
 wenzelm parents: 
44830diff
changeset | 151 | |> fold Simplifier.add_cong strong_congs | 
| 19477 | 152 | in | 
| 56230 | 153 | stac ctxt' i | 
| 154 | end) i st); | |
| 19477 | 155 | |
| 22418 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 156 | (* general simplification of permutations and permutation that arose from eqvt-problems *) | 
| 61144 | 157 | fun perm_simp stac ctxt = | 
| 22610 | 158 | let val simps = ["perm_swap","perm_fresh_fresh","perm_bij","perm_pi_simp","swap_simps"] | 
| 61144 | 159 | in | 
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
46219diff
changeset | 160 | perm_simp_gen stac simps [] ctxt | 
| 22610 | 161 | end; | 
| 162 | ||
| 61144 | 163 | fun eqvt_simp stac ctxt = | 
| 22610 | 164 | let val simps = ["perm_swap","perm_fresh_fresh","perm_pi_simp"] | 
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
46219diff
changeset | 165 | val eqvts_thms = NominalThmDecls.get_eqvt_thms ctxt; | 
| 61144 | 166 | in | 
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
46219diff
changeset | 167 | perm_simp_gen stac simps eqvts_thms ctxt | 
| 22610 | 168 | end; | 
| 22562 
80b814fe284b
rename bij and fresh into bijs and freshs and lookup for eqvts lemma using the ml value instead of the name
 narboux parents: 
22541diff
changeset | 169 | |
| 22418 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 170 | |
| 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 171 | (* main simplification tactics for permutations *) | 
| 56491 | 172 | fun perm_simp_tac_gen_i stac tactical ctxt i = DETERM (tactical ctxt (perm_simp stac ctxt i)); | 
| 61144 | 173 | fun eqvt_simp_tac_gen_i stac tactical ctxt i = DETERM (tactical ctxt (eqvt_simp stac ctxt i)); | 
| 22418 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 174 | |
| 28322 
6f4cf302c798
made the perm_simp tactic to understand options such as (no_asm)
 urbanc parents: 
28262diff
changeset | 175 | val perm_simp_tac_i = perm_simp_tac_gen_i simp_tac | 
| 
6f4cf302c798
made the perm_simp tactic to understand options such as (no_asm)
 urbanc parents: 
28262diff
changeset | 176 | val perm_asm_simp_tac_i = perm_simp_tac_gen_i asm_simp_tac | 
| 
6f4cf302c798
made the perm_simp tactic to understand options such as (no_asm)
 urbanc parents: 
28262diff
changeset | 177 | val perm_full_simp_tac_i = perm_simp_tac_gen_i full_simp_tac | 
| 
6f4cf302c798
made the perm_simp tactic to understand options such as (no_asm)
 urbanc parents: 
28262diff
changeset | 178 | val perm_asm_lr_simp_tac_i = perm_simp_tac_gen_i asm_lr_simp_tac | 
| 
6f4cf302c798
made the perm_simp tactic to understand options such as (no_asm)
 urbanc parents: 
28262diff
changeset | 179 | val perm_asm_full_simp_tac_i = perm_simp_tac_gen_i asm_full_simp_tac | 
| 
6f4cf302c798
made the perm_simp tactic to understand options such as (no_asm)
 urbanc parents: 
28262diff
changeset | 180 | val eqvt_asm_full_simp_tac_i = eqvt_simp_tac_gen_i asm_full_simp_tac | 
| 22418 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 181 | |
| 19477 | 182 | (* applies the perm_compose rule such that *) | 
| 183 | (* pi o (pi' o lhs) = rhs *) | |
| 61144 | 184 | (* is transformed to *) | 
| 19477 | 185 | (* (pi o pi') o (pi' o lhs) = rhs *) | 
| 186 | (* *) | |
| 187 | (* this rule would loop in the simplifier, so some trick is used with *) | |
| 188 | (* generating perm_aux'es for the outermost permutation and then un- *) | |
| 189 | (* folding the definition *) | |
| 25997 | 190 | |
| 61144 | 191 | fun perm_compose_simproc' ctxt ct = | 
| 192 | (case Thm.term_of ct of | |
| 69597 | 193 | (Const (\<^const_name>\<open>Nominal.perm\<close>, Type (\<^type_name>\<open>fun\<close>, [Type (\<^type_name>\<open>list\<close>, | 
| 194 | [Type (\<^type_name>\<open>Product_Type.prod\<close>, [T as Type (tname,_),_])]),_])) $ pi1 $ (Const (\<^const_name>\<open>Nominal.perm\<close>, | |
| 195 | Type (\<^type_name>\<open>fun\<close>, [Type (\<^type_name>\<open>list\<close>, [Type (\<^type_name>\<open>Product_Type.prod\<close>, [U as Type (uname,_),_])]),_])) $ | |
| 25997 | 196 | pi2 $ t)) => | 
| 19477 | 197 | let | 
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
46219diff
changeset | 198 | val thy = Proof_Context.theory_of ctxt | 
| 30364 
577edc39b501
moved basic algebra of long names from structure NameSpace to Long_Name;
 wenzelm parents: 
30280diff
changeset | 199 | val tname' = Long_Name.base_name tname | 
| 
577edc39b501
moved basic algebra of long names from structure NameSpace to Long_Name;
 wenzelm parents: 
30280diff
changeset | 200 | val uname' = Long_Name.base_name uname | 
| 25997 | 201 | in | 
| 202 | if pi1 <> pi2 then (* only apply the composition rule in this case *) | |
| 61144 | 203 | if T = U then | 
| 60801 | 204 | SOME (Thm.instantiate' | 
| 59621 
291934bac95e
Thm.cterm_of and Thm.ctyp_of operate on local context;
 wenzelm parents: 
59582diff
changeset | 205 | [SOME (Thm.global_ctyp_of thy (fastype_of t))] | 
| 
291934bac95e
Thm.cterm_of and Thm.ctyp_of operate on local context;
 wenzelm parents: 
59582diff
changeset | 206 | [SOME (Thm.global_cterm_of thy pi1), SOME (Thm.global_cterm_of thy pi2), SOME (Thm.global_cterm_of thy t)] | 
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
46219diff
changeset | 207 |             (mk_meta_eq ([Global_Theory.get_thm thy ("pt_"^tname'^"_inst"),
 | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
46219diff
changeset | 208 |              Global_Theory.get_thm thy ("at_"^tname'^"_inst")] MRS pt_perm_compose_aux)))
 | 
| 25997 | 209 | else | 
| 60801 | 210 | SOME (Thm.instantiate' | 
| 59621 
291934bac95e
Thm.cterm_of and Thm.ctyp_of operate on local context;
 wenzelm parents: 
59582diff
changeset | 211 | [SOME (Thm.global_ctyp_of thy (fastype_of t))] | 
| 
291934bac95e
Thm.cterm_of and Thm.ctyp_of operate on local context;
 wenzelm parents: 
59582diff
changeset | 212 | [SOME (Thm.global_cterm_of thy pi1), SOME (Thm.global_cterm_of thy pi2), SOME (Thm.global_cterm_of thy t)] | 
| 61144 | 213 |             (mk_meta_eq (Global_Theory.get_thm thy ("cp_"^tname'^"_"^uname'^"_inst") RS
 | 
| 25997 | 214 | cp1_aux))) | 
| 215 | else NONE | |
| 216 | end | |
| 217 | | _ => NONE); | |
| 19477 | 218 | |
| 61144 | 219 | val perm_compose_simproc = | 
| 69597 | 220 | Simplifier.make_simproc \<^context> "perm_compose" | 
| 221 |    {lhss = [\<^term>\<open>Nominal.perm pi1 (Nominal.perm pi2 t)\<close>],
 | |
| 62913 | 222 | proc = K perm_compose_simproc'} | 
| 19477 | 223 | |
| 61144 | 224 | fun perm_compose_tac ctxt i = | 
| 25997 | 225 |   ("analysing permutation compositions on the lhs",
 | 
| 226 | fn st => EVERY | |
| 60754 | 227 | [resolve_tac ctxt [trans] i, | 
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
46219diff
changeset | 228 | asm_full_simp_tac (empty_simpset ctxt addsimprocs [perm_compose_simproc]) i, | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
46219diff
changeset | 229 | asm_full_simp_tac (put_simpset HOL_basic_ss ctxt addsimps [perm_aux_fold]) i] st); | 
| 18012 | 230 | |
| 58956 
a816aa3ff391
proper context for compose_tac, Splitter.split_tac (relevant for unify trace options);
 wenzelm parents: 
56492diff
changeset | 231 | fun apply_cong_tac ctxt i = ("application of congruence", cong_tac ctxt i);
 | 
| 17870 | 232 | |
| 22418 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 233 | |
| 19477 | 234 | (* unfolds the definition of permutations *) | 
| 235 | (* applied to functions such that *) | |
| 61144 | 236 | (* pi o f = rhs *) | 
| 19477 | 237 | (* is transformed to *) | 
| 22418 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 238 | (* %x. pi o (f ((rev pi) o x)) = rhs *) | 
| 60754 | 239 | fun unfold_perm_fun_def_tac ctxt i = | 
| 61144 | 240 |     ("unfolding of permutations on functions",
 | 
| 67710 
cc2db3239932
added HOLogic.mk_obj_eq convenience and eliminated some clones;
 wenzelm parents: 
62913diff
changeset | 241 | resolve_tac ctxt [HOLogic.mk_obj_eq perm_fun_def RS trans] i) | 
| 17870 | 242 | |
| 19477 | 243 | (* applies the ext-rule such that *) | 
| 244 | (* *) | |
| 22418 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 245 | (* f = g goes to /\x. f x = g x *) | 
| 60754 | 246 | fun ext_fun_tac ctxt i = | 
| 247 |   ("extensionality expansion of functions", resolve_tac ctxt @{thms ext} i);
 | |
| 17870 | 248 | |
| 249 | ||
| 28322 
6f4cf302c798
made the perm_simp tactic to understand options such as (no_asm)
 urbanc parents: 
28262diff
changeset | 250 | (* perm_extend_simp_tac_i is perm_simp plus additional tactics *) | 
| 19477 | 251 | (* to decide equation that come from support problems *) | 
| 252 | (* since it contains looping rules the "recursion" - depth is set *) | |
| 253 | (* to 10 - this seems to be sufficient in most cases *) | |
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
46219diff
changeset | 254 | fun perm_extend_simp_tac_i tactical ctxt = | 
| 61144 | 255 | let fun perm_extend_simp_tac_aux tactical ctxt n = | 
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32733diff
changeset | 256 | if n=0 then K all_tac | 
| 61144 | 257 | else DETERM o | 
| 60754 | 258 | (FIRST' | 
| 259 |                  [fn i => tactical ctxt ("splitting conjunctions on the rhs", resolve_tac ctxt [conjI] i),
 | |
| 260 | fn i => tactical ctxt (perm_simp asm_full_simp_tac ctxt i), | |
| 261 | fn i => tactical ctxt (perm_compose_tac ctxt i), | |
| 61144 | 262 | fn i => tactical ctxt (apply_cong_tac ctxt i), | 
| 60754 | 263 | fn i => tactical ctxt (unfold_perm_fun_def_tac ctxt i), | 
| 264 | fn i => tactical ctxt (ext_fun_tac ctxt i)] | |
| 265 | THEN_ALL_NEW (TRY o (perm_extend_simp_tac_aux tactical ctxt (n-1)))) | |
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
46219diff
changeset | 266 | in perm_extend_simp_tac_aux tactical ctxt 10 end; | 
| 19151 | 267 | |
| 22418 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 268 | |
| 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 269 | (* tactic that tries to solve "supports"-goals; first it *) | 
| 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 270 | (* unfolds the support definition and strips off the *) | 
| 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 271 | (* intros, then applies eqvt_simp_tac *) | 
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
46219diff
changeset | 272 | fun supports_tac_i tactical ctxt i = | 
| 61144 | 273 | let | 
| 36945 | 274 | val simps = [supports_def, Thm.symmetric fresh_def, fresh_prod] | 
| 17870 | 275 | in | 
| 56491 | 276 |       EVERY [tactical ctxt ("unfolding of supports   ", simp_tac (put_simpset HOL_basic_ss ctxt addsimps simps) i),
 | 
| 60754 | 277 |              tactical ctxt ("stripping of foralls    ", REPEAT_DETERM (resolve_tac ctxt [allI] i)),
 | 
| 278 |              tactical ctxt ("geting rid of the imps  ", resolve_tac ctxt [impI] i),
 | |
| 279 |              tactical ctxt ("eliminating conjuncts   ", REPEAT_DETERM (eresolve_tac ctxt [conjE] i)),
 | |
| 280 |              tactical ctxt ("applying eqvt_simp      ", eqvt_simp_tac_gen_i asm_full_simp_tac tactical ctxt i)]
 | |
| 17870 | 281 | end; | 
| 282 | ||
| 19151 | 283 | |
| 22418 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 284 | (* tactic that guesses the finite-support of a goal *) | 
| 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 285 | (* it first collects all free variables and tries to show *) | 
| 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 286 | (* that the support of these free variables (op supports) *) | 
| 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 287 | (* the goal *) | 
| 20854 | 288 | fun collect_vars i (Bound j) vs = if j < i then vs else insert (op =) (Bound (j - i)) vs | 
| 289 | | collect_vars i (v as Free _) vs = insert (op =) v vs | |
| 290 | | collect_vars i (v as Var _) vs = insert (op =) v vs | |
| 19151 | 291 | | collect_vars i (Const _) vs = vs | 
| 292 | | collect_vars i (Abs (_, _, t)) vs = collect_vars (i+1) t vs | |
| 293 | | collect_vars i (t $ u) vs = collect_vars i u (collect_vars i t vs); | |
| 294 | ||
| 43278 | 295 | (* FIXME proper SUBGOAL/CSUBGOAL instead of cprems_of etc. *) | 
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
46219diff
changeset | 296 | fun finite_guess_tac_i tactical ctxt i st = | 
| 42364 | 297 | let val goal = nth (cprems_of st) (i - 1) | 
| 19151 | 298 | in | 
| 59582 | 299 | case Envir.eta_contract (Logic.strip_assums_concl (Thm.term_of goal)) of | 
| 69597 | 300 | _ $ (Const (\<^const_name>\<open>finite\<close>, _) $ (Const (\<^const_name>\<open>Nominal.supp\<close>, T) $ x)) => | 
| 19151 | 301 | let | 
| 59582 | 302 | val ps = Logic.strip_params (Thm.term_of goal); | 
| 19151 | 303 | val Ts = rev (map snd ps); | 
| 304 | val vs = collect_vars 0 x []; | |
| 33244 | 305 | val s = fold_rev (fn v => fn s => | 
| 19151 | 306 | HOLogic.pair_const (fastype_of1 (Ts, v)) (fastype_of1 (Ts, s)) $ v $ s) | 
| 33244 | 307 | vs HOLogic.unit; | 
| 46219 
426ed18eba43
discontinued old-style Term.list_abs in favour of plain Term.abs;
 wenzelm parents: 
45620diff
changeset | 308 | val s' = fold_rev Term.abs ps | 
| 69597 | 309 | (Const (\<^const_name>\<open>Nominal.supp\<close>, fastype_of1 (Ts, s) --> | 
| 44692 
ccfc7c193d2b
modify nominal packages to better respect set/pred distinction
 huffman parents: 
43278diff
changeset | 310 | Term.range_type T) $ s); | 
| 19151 | 311 | val supports_rule' = Thm.lift_rule goal supports_rule; | 
| 312 | val _ $ (_ $ S $ _) = | |
| 59582 | 313 | Logic.strip_assums_concl (hd (Thm.prems_of supports_rule')); | 
| 60787 | 314 | val supports_rule'' = | 
| 315 | infer_instantiate ctxt | |
| 316 | [(#1 (dest_Var (head_of S)), Thm.cterm_of ctxt s')] supports_rule'; | |
| 60359 | 317 | val fin_supp = Proof_Context.get_thms ctxt "fin_supp" | 
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
46219diff
changeset | 318 | val ctxt' = ctxt addsimps [supp_prod,supp_unit,finite_Un,finite_emptyI,conj_absorb]@fin_supp | 
| 19151 | 319 | in | 
| 56491 | 320 |             (tactical ctxt ("guessing of the right supports-set",
 | 
| 58956 
a816aa3ff391
proper context for compose_tac, Splitter.split_tac (relevant for unify trace options);
 wenzelm parents: 
56492diff
changeset | 321 | EVERY [compose_tac ctxt (false, supports_rule'', 2) i, | 
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
46219diff
changeset | 322 | asm_full_simp_tac ctxt' (i+1), | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
46219diff
changeset | 323 | supports_tac_i tactical ctxt i])) st | 
| 19151 | 324 | end | 
| 325 | | _ => Seq.empty | |
| 326 | end | |
| 43278 | 327 | handle General.Subscript => Seq.empty | 
| 328 | (* FIXME proper SUBGOAL/CSUBGOAL instead of cprems_of etc. *) | |
| 19151 | 329 | |
| 22595 
293934e41dfd
make fresh_guess fail if it does not solve the subgoal
 narboux parents: 
22578diff
changeset | 330 | |
| 22418 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 331 | (* tactic that guesses whether an atom is fresh for an expression *) | 
| 61144 | 332 | (* it first collects all free variables and tries to show that the *) | 
| 22418 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 333 | (* support of these free variables (op supports) the goal *) | 
| 43278 | 334 | (* FIXME proper SUBGOAL/CSUBGOAL instead of cprems_of etc. *) | 
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
46219diff
changeset | 335 | fun fresh_guess_tac_i tactical ctxt i st = | 
| 61144 | 336 | let | 
| 42364 | 337 | val goal = nth (cprems_of st) (i - 1) | 
| 60359 | 338 | val fin_supp = Proof_Context.get_thms ctxt "fin_supp" | 
| 339 | val fresh_atm = Proof_Context.get_thms ctxt "fresh_atm" | |
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
46219diff
changeset | 340 | val ctxt1 = ctxt addsimps [Thm.symmetric fresh_def,fresh_prod,fresh_unit,conj_absorb,not_false]@fresh_atm | 
| 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
46219diff
changeset | 341 | val ctxt2 = ctxt addsimps [supp_prod,supp_unit,finite_Un,finite_emptyI,conj_absorb]@fin_supp | 
| 19857 | 342 | in | 
| 59582 | 343 | case Logic.strip_assums_concl (Thm.term_of goal) of | 
| 69597 | 344 |           _ $ (Const (\<^const_name>\<open>Nominal.fresh\<close>, Type ("fun", [T, _])) $ _ $ t) =>
 | 
| 19857 | 345 | let | 
| 59582 | 346 | val ps = Logic.strip_params (Thm.term_of goal); | 
| 19857 | 347 | val Ts = rev (map snd ps); | 
| 348 | val vs = collect_vars 0 t []; | |
| 33244 | 349 | val s = fold_rev (fn v => fn s => | 
| 19857 | 350 | HOLogic.pair_const (fastype_of1 (Ts, v)) (fastype_of1 (Ts, s)) $ v $ s) | 
| 33244 | 351 | vs HOLogic.unit; | 
| 46219 
426ed18eba43
discontinued old-style Term.list_abs in favour of plain Term.abs;
 wenzelm parents: 
45620diff
changeset | 352 | val s' = | 
| 
426ed18eba43
discontinued old-style Term.list_abs in favour of plain Term.abs;
 wenzelm parents: 
45620diff
changeset | 353 | fold_rev Term.abs ps | 
| 69597 | 354 | (Const (\<^const_name>\<open>Nominal.supp\<close>, fastype_of1 (Ts, s) --> HOLogic.mk_setT T) $ s); | 
| 19857 | 355 | val supports_fresh_rule' = Thm.lift_rule goal supports_fresh_rule; | 
| 356 | val _ $ (_ $ S $ _) = | |
| 59582 | 357 | Logic.strip_assums_concl (hd (Thm.prems_of supports_fresh_rule')); | 
| 60787 | 358 | val supports_fresh_rule'' = | 
| 359 | infer_instantiate ctxt | |
| 360 | [(#1 (dest_Var (head_of S)), Thm.cterm_of ctxt s')] supports_fresh_rule'; | |
| 19857 | 361 | in | 
| 61144 | 362 |             (tactical ctxt ("guessing of the right set that supports the goal",
 | 
| 58956 
a816aa3ff391
proper context for compose_tac, Splitter.split_tac (relevant for unify trace options);
 wenzelm parents: 
56492diff
changeset | 363 | (EVERY [compose_tac ctxt (false, supports_fresh_rule'', 3) i, | 
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
46219diff
changeset | 364 | asm_full_simp_tac ctxt1 (i+2), | 
| 61144 | 365 | asm_full_simp_tac ctxt2 (i+1), | 
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
46219diff
changeset | 366 | supports_tac_i tactical ctxt i]))) st | 
| 19857 | 367 | end | 
| 61144 | 368 | (* when a term-constructor contains more than one binder, it is useful *) | 
| 22418 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 369 | (* in nominal_primrecs to try whether the goal can be solved by an hammer *) | 
| 61144 | 370 |         | _ => (tactical ctxt ("if it is not of the form _\<sharp>_, then try the simplifier",
 | 
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
46219diff
changeset | 371 | (asm_full_simp_tac (put_simpset HOL_ss ctxt addsimps [fresh_prod]@fresh_atm) i))) st | 
| 19857 | 372 | end | 
| 43278 | 373 | handle General.Subscript => Seq.empty; | 
| 374 | (* FIXME proper SUBGOAL/CSUBGOAL instead of cprems_of etc. *) | |
| 22418 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 375 | |
| 56492 | 376 | val eqvt_simp_tac = eqvt_asm_full_simp_tac_i NO_DEBUG; | 
| 28322 
6f4cf302c798
made the perm_simp tactic to understand options such as (no_asm)
 urbanc parents: 
28262diff
changeset | 377 | |
| 56492 | 378 | val perm_simp_tac = perm_asm_full_simp_tac_i NO_DEBUG; | 
| 379 | val perm_extend_simp_tac = perm_extend_simp_tac_i NO_DEBUG; | |
| 380 | val supports_tac = supports_tac_i NO_DEBUG; | |
| 381 | val finite_guess_tac = finite_guess_tac_i NO_DEBUG; | |
| 382 | val fresh_guess_tac = fresh_guess_tac_i NO_DEBUG; | |
| 28322 
6f4cf302c798
made the perm_simp tactic to understand options such as (no_asm)
 urbanc parents: 
28262diff
changeset | 383 | |
| 56492 | 384 | val dperm_simp_tac = perm_asm_full_simp_tac_i DEBUG; | 
| 385 | val dperm_extend_simp_tac = perm_extend_simp_tac_i DEBUG; | |
| 386 | val dsupports_tac = supports_tac_i DEBUG; | |
| 387 | val dfinite_guess_tac = finite_guess_tac_i DEBUG; | |
| 388 | val dfresh_guess_tac = fresh_guess_tac_i DEBUG; | |
| 28322 
6f4cf302c798
made the perm_simp tactic to understand options such as (no_asm)
 urbanc parents: 
28262diff
changeset | 389 | |
| 
6f4cf302c798
made the perm_simp tactic to understand options such as (no_asm)
 urbanc parents: 
28262diff
changeset | 390 | (* Code opied from the Simplifer for setting up the perm_simp method *) | 
| 
6f4cf302c798
made the perm_simp tactic to understand options such as (no_asm)
 urbanc parents: 
28262diff
changeset | 391 | (* behaves nearly identical to the simp-method, for example can handle *) | 
| 61144 | 392 | (* options like (no_asm) etc. *) | 
| 28322 
6f4cf302c798
made the perm_simp tactic to understand options such as (no_asm)
 urbanc parents: 
28262diff
changeset | 393 | val no_asmN = "no_asm"; | 
| 
6f4cf302c798
made the perm_simp tactic to understand options such as (no_asm)
 urbanc parents: 
28262diff
changeset | 394 | val no_asm_useN = "no_asm_use"; | 
| 
6f4cf302c798
made the perm_simp tactic to understand options such as (no_asm)
 urbanc parents: 
28262diff
changeset | 395 | val no_asm_simpN = "no_asm_simp"; | 
| 
6f4cf302c798
made the perm_simp tactic to understand options such as (no_asm)
 urbanc parents: 
28262diff
changeset | 396 | val asm_lrN = "asm_lr"; | 
| 
6f4cf302c798
made the perm_simp tactic to understand options such as (no_asm)
 urbanc parents: 
28262diff
changeset | 397 | |
| 
6f4cf302c798
made the perm_simp tactic to understand options such as (no_asm)
 urbanc parents: 
28262diff
changeset | 398 | val perm_simp_options = | 
| 56492 | 399 | (Args.parens (Args.$$$ no_asmN) >> K (perm_simp_tac_i NO_DEBUG) || | 
| 400 | Args.parens (Args.$$$ no_asm_simpN) >> K (perm_asm_simp_tac_i NO_DEBUG) || | |
| 401 | Args.parens (Args.$$$ no_asm_useN) >> K (perm_full_simp_tac_i NO_DEBUG) || | |
| 402 | Args.parens (Args.$$$ asm_lrN) >> K (perm_asm_lr_simp_tac_i NO_DEBUG) || | |
| 403 | Scan.succeed (perm_asm_full_simp_tac_i NO_DEBUG)); | |
| 28322 
6f4cf302c798
made the perm_simp tactic to understand options such as (no_asm)
 urbanc parents: 
28262diff
changeset | 404 | |
| 30549 | 405 | val perm_simp_meth = | 
| 33554 | 406 | Scan.lift perm_simp_options --| Method.sections (Simplifier.simp_modifiers') >> | 
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
46219diff
changeset | 407 | (fn tac => fn ctxt => SIMPLE_METHOD' (CHANGED_PROP o tac ctxt)); | 
| 28322 
6f4cf302c798
made the perm_simp tactic to understand options such as (no_asm)
 urbanc parents: 
28262diff
changeset | 408 | |
| 22418 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 409 | (* setup so that the simpset is used which is active at the moment when the tactic is called *) | 
| 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 410 | fun local_simp_meth_setup tac = | 
| 30549 | 411 | Method.sections (Simplifier.simp_modifiers' @ Splitter.split_modifiers) >> | 
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
46219diff
changeset | 412 | (K (SIMPLE_METHOD' o tac)); | 
| 17870 | 413 | |
| 22595 
293934e41dfd
make fresh_guess fail if it does not solve the subgoal
 narboux parents: 
22578diff
changeset | 414 | (* uses HOL_basic_ss only and fails if the tactic does not solve the subgoal *) | 
| 
293934e41dfd
make fresh_guess fail if it does not solve the subgoal
 narboux parents: 
22578diff
changeset | 415 | |
| 22656 
13302b2d0948
debug versions of finite_guess and fresh_guess do not fail if they can not solve the goal
 narboux parents: 
22610diff
changeset | 416 | fun basic_simp_meth_setup debug tac = | 
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
46219diff
changeset | 417 | Scan.depend (fn context => Scan.succeed (Simplifier.map_ss (put_simpset HOL_basic_ss) context, ())) -- | 
| 30549 | 418 | Method.sections (Simplifier.simp_modifiers' @ Splitter.split_modifiers) >> | 
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
46219diff
changeset | 419 | (K (SIMPLE_METHOD' o (if debug then tac else SOLVED' o tac))); | 
| 22418 
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
 urbanc parents: 
22274diff
changeset | 420 | |
| 28322 
6f4cf302c798
made the perm_simp tactic to understand options such as (no_asm)
 urbanc parents: 
28262diff
changeset | 421 | val perm_simp_meth_debug = local_simp_meth_setup dperm_simp_tac; | 
| 
6f4cf302c798
made the perm_simp tactic to understand options such as (no_asm)
 urbanc parents: 
28262diff
changeset | 422 | val perm_extend_simp_meth = local_simp_meth_setup perm_extend_simp_tac; | 
| 
6f4cf302c798
made the perm_simp tactic to understand options such as (no_asm)
 urbanc parents: 
28262diff
changeset | 423 | val perm_extend_simp_meth_debug = local_simp_meth_setup dperm_extend_simp_tac; | 
| 
6f4cf302c798
made the perm_simp tactic to understand options such as (no_asm)
 urbanc parents: 
28262diff
changeset | 424 | val supports_meth = local_simp_meth_setup supports_tac; | 
| 
6f4cf302c798
made the perm_simp tactic to understand options such as (no_asm)
 urbanc parents: 
28262diff
changeset | 425 | val supports_meth_debug = local_simp_meth_setup dsupports_tac; | 
| 24571 | 426 | |
| 28322 
6f4cf302c798
made the perm_simp tactic to understand options such as (no_asm)
 urbanc parents: 
28262diff
changeset | 427 | val finite_guess_meth = basic_simp_meth_setup false finite_guess_tac; | 
| 
6f4cf302c798
made the perm_simp tactic to understand options such as (no_asm)
 urbanc parents: 
28262diff
changeset | 428 | val finite_guess_meth_debug = basic_simp_meth_setup true dfinite_guess_tac; | 
| 
6f4cf302c798
made the perm_simp tactic to understand options such as (no_asm)
 urbanc parents: 
28262diff
changeset | 429 | val fresh_guess_meth = basic_simp_meth_setup false fresh_guess_tac; | 
| 
6f4cf302c798
made the perm_simp tactic to understand options such as (no_asm)
 urbanc parents: 
28262diff
changeset | 430 | val fresh_guess_meth_debug = basic_simp_meth_setup true dfresh_guess_tac; | 
| 17870 | 431 | |
| 20289 | 432 | end |