| author | nipkow |
| Mon, 05 Nov 2007 08:31:12 +0100 | |
| changeset 25277 | 95128fcdd7e8 |
| parent 24571 | a6d0428dea8e |
| child 25997 | 0c0f5d990d7d |
| permissions | -rw-r--r-- |
| 19494 | 1 |
(* Title: HOL/Nominal/nominal_permeq.ML |
2 |
ID: $Id$ |
|
|
22418
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
3 |
Authors: Christian Urban, Julien Narboux, TU Muenchen |
| 17870 | 4 |
|
| 19494 | 5 |
Methods for simplifying permutations and |
6 |
for analysing equations involving permutations. |
|
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 |
||
21 |
rather it tries to permute pi1 over pi2, which |
|
22 |
results in a failure when used with the |
|
23 |
perm_(full)_simp tactics |
|
24 |
||
25 |
*) |
|
26 |
||
27 |
||
|
19987
b97607d4d9a5
- put declarations inside a structure (NominalPermeq)
berghofe
parents:
19858
diff
changeset
|
28 |
signature NOMINAL_PERMEQ = |
|
b97607d4d9a5
- put declarations inside a structure (NominalPermeq)
berghofe
parents:
19858
diff
changeset
|
29 |
sig |
|
b97607d4d9a5
- put declarations inside a structure (NominalPermeq)
berghofe
parents:
19858
diff
changeset
|
30 |
val perm_simp_tac : simpset -> int -> tactic |
|
b97607d4d9a5
- put declarations inside a structure (NominalPermeq)
berghofe
parents:
19858
diff
changeset
|
31 |
val perm_full_simp_tac : simpset -> int -> tactic |
|
b97607d4d9a5
- put declarations inside a structure (NominalPermeq)
berghofe
parents:
19858
diff
changeset
|
32 |
val supports_tac : simpset -> int -> tactic |
|
b97607d4d9a5
- put declarations inside a structure (NominalPermeq)
berghofe
parents:
19858
diff
changeset
|
33 |
val finite_guess_tac : simpset -> int -> tactic |
|
b97607d4d9a5
- put declarations inside a structure (NominalPermeq)
berghofe
parents:
19858
diff
changeset
|
34 |
val fresh_guess_tac : simpset -> int -> tactic |
| 17870 | 35 |
|
|
22418
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
36 |
val perm_simp_meth : Method.src -> Proof.context -> Proof.method |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
37 |
val perm_simp_meth_debug : Method.src -> Proof.context -> Proof.method |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
38 |
val perm_full_simp_meth : Method.src -> Proof.context -> Proof.method |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
39 |
val perm_full_simp_meth_debug : Method.src -> Proof.context -> Proof.method |
| 20289 | 40 |
val supports_meth : Method.src -> Proof.context -> Proof.method |
41 |
val supports_meth_debug : Method.src -> Proof.context -> Proof.method |
|
|
22418
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
42 |
val finite_guess_meth : Method.src -> Proof.context -> Proof.method |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
43 |
val finite_guess_meth_debug : Method.src -> Proof.context -> Proof.method |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
44 |
val fresh_guess_meth : Method.src -> Proof.context -> Proof.method |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
45 |
val fresh_guess_meth_debug : Method.src -> Proof.context -> Proof.method |
|
19987
b97607d4d9a5
- put declarations inside a structure (NominalPermeq)
berghofe
parents:
19858
diff
changeset
|
46 |
end |
|
b97607d4d9a5
- put declarations inside a structure (NominalPermeq)
berghofe
parents:
19858
diff
changeset
|
47 |
|
|
b97607d4d9a5
- put declarations inside a structure (NominalPermeq)
berghofe
parents:
19858
diff
changeset
|
48 |
structure NominalPermeq : NOMINAL_PERMEQ = |
|
b97607d4d9a5
- put declarations inside a structure (NominalPermeq)
berghofe
parents:
19858
diff
changeset
|
49 |
struct |
|
b97607d4d9a5
- put declarations inside a structure (NominalPermeq)
berghofe
parents:
19858
diff
changeset
|
50 |
|
|
22418
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
51 |
(* some lemmas needed below *) |
| 24519 | 52 |
val finite_emptyI = @{thm "finite.emptyI"};
|
53 |
val finite_Un = @{thm "finite_Un"};
|
|
54 |
val conj_absorb = @{thm "conj_absorb"};
|
|
55 |
val not_false = @{thm "not_False_eq_True"}
|
|
56 |
val perm_fun_def = @{thm "Nominal.perm_fun_def"};
|
|
57 |
val perm_eq_app = @{thm "Nominal.pt_fun_app_eq"};
|
|
58 |
val supports_def = @{thm "Nominal.supports_def"};
|
|
59 |
val fresh_def = @{thm "Nominal.fresh_def"};
|
|
60 |
val fresh_prod = @{thm "Nominal.fresh_prod"};
|
|
61 |
val fresh_unit = @{thm "Nominal.fresh_unit"};
|
|
62 |
val supports_rule = @{thm "supports_finite"};
|
|
63 |
val supp_prod = @{thm "supp_prod"};
|
|
64 |
val supp_unit = @{thm "supp_unit"};
|
|
65 |
val pt_perm_compose_aux = @{thm "pt_perm_compose_aux"};
|
|
66 |
val cp1_aux = @{thm "cp1_aux"};
|
|
67 |
val perm_aux_fold = @{thm "perm_aux_fold"};
|
|
68 |
val supports_fresh_rule = @{thm "supports_fresh"};
|
|
| 21669 | 69 |
|
|
19987
b97607d4d9a5
- put declarations inside a structure (NominalPermeq)
berghofe
parents:
19858
diff
changeset
|
70 |
(* pulls out dynamically a thm via the proof state *) |
|
b97607d4d9a5
- put declarations inside a structure (NominalPermeq)
berghofe
parents:
19858
diff
changeset
|
71 |
fun dynamic_thms st name = PureThy.get_thms (theory_of_thm st) (Name name); |
|
22418
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
72 |
fun dynamic_thm st name = PureThy.get_thm (theory_of_thm st) (Name name); |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
73 |
|
| 18012 | 74 |
|
|
22418
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
75 |
(* needed in the process of fully simplifying permutations *) |
| 24519 | 76 |
val strong_congs = [@{thm "if_cong"}]
|
|
22418
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
77 |
(* needed to avoid warnings about overwritten congs *) |
| 24519 | 78 |
val weak_congs = [@{thm "if_weak_cong"}]
|
|
22418
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
79 |
|
| 24519 | 80 |
(* FIXME comment *) |
|
22595
293934e41dfd
make fresh_guess fail if it does not solve the subgoal
narboux
parents:
22578
diff
changeset
|
81 |
(* a tactical which fails if the tactic taken as an argument generates does not solve the sub goal i *) |
|
293934e41dfd
make fresh_guess fail if it does not solve the subgoal
narboux
parents:
22578
diff
changeset
|
82 |
fun SOLVEI t = t THEN_ALL_NEW (fn i => no_tac); |
|
22418
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
83 |
|
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
84 |
(* debugging *) |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
85 |
fun DEBUG_tac (msg,tac) = |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
86 |
CHANGED (EVERY [print_tac ("before "^msg), tac, print_tac ("after "^msg)]);
|
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
87 |
fun NO_DEBUG_tac (_,tac) = CHANGED tac; |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
88 |
|
| 19477 | 89 |
|
|
22418
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
90 |
(* simproc that deals with instances of permutations in front *) |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
91 |
(* of applications; just adding this rule to the simplifier *) |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
92 |
(* would loop; it also needs careful tuning with the simproc *) |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
93 |
(* for functions to avoid further possibilities for looping *) |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
94 |
fun perm_simproc_app st sg ss redex = |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
95 |
let |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
96 |
(* 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:
22274
diff
changeset
|
97 |
(* constant or when (f x) is a permuation with two or more arguments *) |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
98 |
fun applicable_app t = |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
99 |
(case (strip_comb t) of |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
100 |
(Const ("Nominal.perm",_),ts) => (length ts) >= 2
|
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
101 |
| (Const _,_) => false |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
102 |
| _ => true) |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
103 |
in |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
104 |
case redex of |
|
19169
20a73345dd6e
fixed a problem where a permutation is not analysed
urbanc
parents:
19163
diff
changeset
|
105 |
(* case pi o (f x) == (pi o f) (pi o x) *) |
| 19494 | 106 |
(Const("Nominal.perm",
|
|
19169
20a73345dd6e
fixed a problem where a permutation is not analysed
urbanc
parents:
19163
diff
changeset
|
107 |
Type("fun",[Type("List.list",[Type("*",[Type(n,_),_])]),_])) $ pi $ (f $ x)) =>
|
|
22418
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
108 |
(if (applicable_app f) then |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
109 |
let |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
110 |
val name = Sign.base_name n |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
111 |
val at_inst = dynamic_thm st ("at_"^name^"_inst")
|
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
112 |
val pt_inst = dynamic_thm st ("pt_"^name^"_inst")
|
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
113 |
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:
22274
diff
changeset
|
114 |
else NONE) |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
115 |
| _ => NONE |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
116 |
end |
| 19139 | 117 |
|
| 24519 | 118 |
(* a simproc that deals with permutation instances in front of functions *) |
|
22418
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
119 |
fun perm_simproc_fun st sg ss redex = |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
120 |
let |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
121 |
fun applicable_fun t = |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
122 |
(case (strip_comb t) of |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
123 |
(Abs _ ,[]) => true |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
124 |
| (Const ("Nominal.perm",_),_) => false
|
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
125 |
| (Const _, _) => true |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
126 |
| _ => false) |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
127 |
in |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
128 |
case redex of |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
129 |
(* case pi o f == (%x. pi o (f ((rev pi)o x))) *) |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
130 |
(Const("Nominal.perm",_) $ pi $ f) =>
|
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
131 |
(if (applicable_fun f) then SOME (perm_fun_def) else NONE) |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
132 |
| _ => NONE |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
133 |
end |
| 19139 | 134 |
|
|
22418
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
135 |
(* function for simplyfying permutations *) |
| 24571 | 136 |
fun perm_simp_gen dyn_thms eqvt_thms ss i = |
|
22418
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
137 |
("general simplification of permutations", fn st =>
|
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
138 |
let |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
139 |
|
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
140 |
val perm_sp_fun = Simplifier.simproc (theory_of_thm st) "perm_simproc_fun" |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
141 |
["Nominal.perm pi x"] (perm_simproc_fun st); |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
142 |
|
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
143 |
val perm_sp_app = Simplifier.simproc (theory_of_thm st) "perm_simproc_app" |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
144 |
["Nominal.perm pi x"] (perm_simproc_app st); |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
145 |
|
| 24571 | 146 |
val ss' = ss addsimps ((List.concat (map (dynamic_thms st) dyn_thms))@eqvt_thms) |
|
22418
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
147 |
delcongs weak_congs |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
148 |
addcongs strong_congs |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
149 |
addsimprocs [perm_sp_fun, perm_sp_app] |
| 19477 | 150 |
in |
|
22418
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
151 |
asm_full_simp_tac ss' i st |
|
19987
b97607d4d9a5
- put declarations inside a structure (NominalPermeq)
berghofe
parents:
19858
diff
changeset
|
152 |
end); |
| 19477 | 153 |
|
|
22418
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
154 |
(* general simplification of permutations and permutation that arose from eqvt-problems *) |
| 24571 | 155 |
fun perm_simp ss = |
| 22610 | 156 |
let val simps = ["perm_swap","perm_fresh_fresh","perm_bij","perm_pi_simp","swap_simps"] |
157 |
in |
|
| 24571 | 158 |
perm_simp_gen simps [] ss |
| 22610 | 159 |
end; |
160 |
||
| 24571 | 161 |
fun eqvt_simp ss = |
| 22610 | 162 |
let val simps = ["perm_swap","perm_fresh_fresh","perm_pi_simp"] |
| 24571 | 163 |
val eqvts_thms = NominalThmDecls.get_eqvt_thms (Simplifier.the_context ss); |
| 22610 | 164 |
in |
| 24571 | 165 |
perm_simp_gen simps eqvts_thms ss |
| 22610 | 166 |
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:
22541
diff
changeset
|
167 |
|
|
22418
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
168 |
|
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
169 |
(* main simplification tactics for permutations *) |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
170 |
fun perm_simp_tac tactical ss i = DETERM (tactical (perm_simp ss i)); |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
171 |
fun eqvt_simp_tac tactical ss i = DETERM (tactical (eqvt_simp ss i)); |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
172 |
|
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
173 |
|
| 19477 | 174 |
(* applies the perm_compose rule such that *) |
175 |
(* pi o (pi' o lhs) = rhs *) |
|
176 |
(* is transformed to *) |
|
177 |
(* (pi o pi') o (pi' o lhs) = rhs *) |
|
178 |
(* *) |
|
179 |
(* this rule would loop in the simplifier, so some trick is used with *) |
|
180 |
(* generating perm_aux'es for the outermost permutation and then un- *) |
|
181 |
(* folding the definition *) |
|
182 |
fun perm_compose_tac ss i = |
|
183 |
let |
|
184 |
fun perm_compose_simproc sg ss redex = |
|
185 |
(case redex of |
|
| 19494 | 186 |
(Const ("Nominal.perm", Type ("fun", [Type ("List.list",
|
187 |
[Type ("*", [T as Type (tname,_),_])]),_])) $ pi1 $ (Const ("Nominal.perm",
|
|
| 19477 | 188 |
Type ("fun", [Type ("List.list", [Type ("*", [U as Type (uname,_),_])]),_])) $
|
189 |
pi2 $ t)) => |
|
| 19350 | 190 |
let |
191 |
val tname' = Sign.base_name tname |
|
| 19477 | 192 |
val uname' = Sign.base_name uname |
| 19350 | 193 |
in |
| 19477 | 194 |
if pi1 <> pi2 then (* only apply the composition rule in this case *) |
195 |
if T = U then |
|
| 19350 | 196 |
SOME (Drule.instantiate' |
197 |
[SOME (ctyp_of sg (fastype_of t))] |
|
198 |
[SOME (cterm_of sg pi1), SOME (cterm_of sg pi2), SOME (cterm_of sg t)] |
|
199 |
(mk_meta_eq ([PureThy.get_thm sg (Name ("pt_"^tname'^"_inst")),
|
|
| 19477 | 200 |
PureThy.get_thm sg (Name ("at_"^tname'^"_inst"))] MRS pt_perm_compose_aux)))
|
201 |
else |
|
202 |
SOME (Drule.instantiate' |
|
203 |
[SOME (ctyp_of sg (fastype_of t))] |
|
204 |
[SOME (cterm_of sg pi1), SOME (cterm_of sg pi2), SOME (cterm_of sg t)] |
|
205 |
(mk_meta_eq (PureThy.get_thm sg (Name ("cp_"^tname'^"_"^uname'^"_inst")) RS
|
|
206 |
cp1_aux))) |
|
| 19350 | 207 |
else NONE |
208 |
end |
|
209 |
| _ => NONE); |
|
| 19477 | 210 |
|
211 |
val perm_compose = |
|
| 19350 | 212 |
Simplifier.simproc (the_context()) "perm_compose" |
| 19494 | 213 |
["Nominal.perm pi1 (Nominal.perm pi2 t)"] perm_compose_simproc; |
| 19477 | 214 |
|
|
22418
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
215 |
val ss' = Simplifier.theory_context (the_context ()) empty_ss (* FIXME: get rid of the_context *) |
| 19477 | 216 |
|
| 18012 | 217 |
in |
| 19477 | 218 |
("analysing permutation compositions on the lhs",
|
219 |
EVERY [rtac trans i, |
|
220 |
asm_full_simp_tac (ss' addsimprocs [perm_compose]) i, |
|
221 |
asm_full_simp_tac (HOL_basic_ss addsimps [perm_aux_fold]) i]) |
|
| 18012 | 222 |
end |
223 |
||
|
22418
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
224 |
|
| 18012 | 225 |
(* applying Stefan's smart congruence tac *) |
226 |
fun apply_cong_tac i = |
|
227 |
("application of congruence",
|
|
| 19477 | 228 |
(fn st => DatatypeAux.cong_tac i st handle Subscript => no_tac st)); |
| 17870 | 229 |
|
|
22418
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
230 |
|
| 19477 | 231 |
(* unfolds the definition of permutations *) |
232 |
(* applied to functions such that *) |
|
|
22418
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
233 |
(* pi o f = rhs *) |
| 19477 | 234 |
(* is transformed to *) |
|
22418
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
235 |
(* %x. pi o (f ((rev pi) o x)) = rhs *) |
| 24519 | 236 |
fun unfold_perm_fun_def_tac i = |
237 |
("unfolding of permutations on functions",
|
|
238 |
rtac (perm_fun_def RS meta_eq_to_obj_eq RS trans) i) |
|
| 17870 | 239 |
|
| 19477 | 240 |
(* applies the ext-rule such that *) |
241 |
(* *) |
|
|
22418
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
242 |
(* f = g goes to /\x. f x = g x *) |
| 19477 | 243 |
fun ext_fun_tac i = ("extensionality expansion of functions", rtac ext i);
|
| 17870 | 244 |
|
245 |
||
|
22418
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
246 |
(* perm_full_simp_tac is perm_simp plus additional tactics *) |
| 19477 | 247 |
(* to decide equation that come from support problems *) |
248 |
(* since it contains looping rules the "recursion" - depth is set *) |
|
249 |
(* to 10 - this seems to be sufficient in most cases *) |
|
250 |
fun perm_full_simp_tac tactical ss = |
|
251 |
let fun perm_full_simp_tac_aux tactical ss n = |
|
252 |
if n=0 then K all_tac |
|
253 |
else DETERM o |
|
254 |
(FIRST'[fn i => tactical ("splitting conjunctions on the rhs", rtac conjI i),
|
|
|
22418
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
255 |
fn i => tactical (perm_simp ss i), |
| 19477 | 256 |
fn i => tactical (perm_compose_tac ss i), |
257 |
fn i => tactical (apply_cong_tac i), |
|
258 |
fn i => tactical (unfold_perm_fun_def_tac i), |
|
|
22418
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
259 |
fn i => tactical (ext_fun_tac i)] |
| 19477 | 260 |
THEN_ALL_NEW (TRY o (perm_full_simp_tac_aux tactical ss (n-1)))) |
261 |
in perm_full_simp_tac_aux tactical ss 10 end; |
|
| 19151 | 262 |
|
|
22418
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
263 |
|
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
264 |
(* tactic that tries to solve "supports"-goals; first it *) |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
265 |
(* unfolds the support definition and strips off the *) |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
266 |
(* intros, then applies eqvt_simp_tac *) |
| 18012 | 267 |
fun supports_tac tactical ss i = |
268 |
let |
|
|
22418
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
269 |
val simps = [supports_def,symmetric fresh_def,fresh_prod] |
| 17870 | 270 |
in |
| 19477 | 271 |
EVERY [tactical ("unfolding of supports ", simp_tac (HOL_basic_ss addsimps simps) i),
|
272 |
tactical ("stripping of foralls ", REPEAT_DETERM (rtac allI i)),
|
|
273 |
tactical ("geting rid of the imps ", rtac impI i),
|
|
274 |
tactical ("eliminating conjuncts ", REPEAT_DETERM (etac conjE i)),
|
|
|
22418
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
275 |
tactical ("applying eqvt_simp ", eqvt_simp_tac tactical ss i )]
|
| 17870 | 276 |
end; |
277 |
||
| 19151 | 278 |
|
|
22418
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
279 |
(* tactic that guesses the finite-support of a goal *) |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
280 |
(* it first collects all free variables and tries to show *) |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
281 |
(* that the support of these free variables (op supports) *) |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
282 |
(* the goal *) |
| 20854 | 283 |
fun collect_vars i (Bound j) vs = if j < i then vs else insert (op =) (Bound (j - i)) vs |
284 |
| collect_vars i (v as Free _) vs = insert (op =) v vs |
|
285 |
| collect_vars i (v as Var _) vs = insert (op =) v vs |
|
| 19151 | 286 |
| collect_vars i (Const _) vs = vs |
287 |
| collect_vars i (Abs (_, _, t)) vs = collect_vars (i+1) t vs |
|
288 |
| collect_vars i (t $ u) vs = collect_vars i u (collect_vars i t vs); |
|
289 |
||
290 |
fun finite_guess_tac tactical ss i st = |
|
291 |
let val goal = List.nth(cprems_of st, i-1) |
|
292 |
in |
|
293 |
case Logic.strip_assums_concl (term_of goal) of |
|
| 22274 | 294 |
_ $ (Const ("Finite_Set.finite", _) $ (Const ("Nominal.supp", T) $ x)) =>
|
| 19151 | 295 |
let |
| 22578 | 296 |
val cert = Thm.cterm_of (Thm.theory_of_thm st); |
| 19151 | 297 |
val ps = Logic.strip_params (term_of goal); |
298 |
val Ts = rev (map snd ps); |
|
299 |
val vs = collect_vars 0 x []; |
|
| 21078 | 300 |
val s = Library.foldr (fn (v, s) => |
| 19151 | 301 |
HOLogic.pair_const (fastype_of1 (Ts, v)) (fastype_of1 (Ts, s)) $ v $ s) |
| 21078 | 302 |
(vs, HOLogic.unit); |
| 19151 | 303 |
val s' = list_abs (ps, |
| 19494 | 304 |
Const ("Nominal.supp", fastype_of1 (Ts, s) --> body_type T) $ s);
|
| 19151 | 305 |
val supports_rule' = Thm.lift_rule goal supports_rule; |
306 |
val _ $ (_ $ S $ _) = |
|
307 |
Logic.strip_assums_concl (hd (prems_of supports_rule')); |
|
308 |
val supports_rule'' = Drule.cterm_instantiate |
|
309 |
[(cert (head_of S), cert s')] supports_rule' |
|
|
22418
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
310 |
val fin_supp = dynamic_thms st ("fin_supp")
|
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
311 |
val ss' = ss addsimps [supp_prod,supp_unit,finite_Un,finite_emptyI,conj_absorb]@fin_supp |
| 19151 | 312 |
in |
313 |
(tactical ("guessing of the right supports-set",
|
|
314 |
EVERY [compose_tac (false, supports_rule'', 2) i, |
|
|
19987
b97607d4d9a5
- put declarations inside a structure (NominalPermeq)
berghofe
parents:
19858
diff
changeset
|
315 |
asm_full_simp_tac ss' (i+1), |
| 19151 | 316 |
supports_tac tactical ss i])) st |
317 |
end |
|
318 |
| _ => Seq.empty |
|
319 |
end |
|
320 |
handle Subscript => Seq.empty |
|
321 |
||
|
22595
293934e41dfd
make fresh_guess fail if it does not solve the subgoal
narboux
parents:
22578
diff
changeset
|
322 |
|
|
22418
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
323 |
(* tactic that guesses whether an atom is fresh for an expression *) |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
324 |
(* it first collects all free variables and tries to show that the *) |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
325 |
(* support of these free variables (op supports) the goal *) |
| 19857 | 326 |
fun fresh_guess_tac tactical ss i st = |
327 |
let |
|
328 |
val goal = List.nth(cprems_of st, i-1) |
|
|
22418
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
329 |
val fin_supp = dynamic_thms st ("fin_supp")
|
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
330 |
val fresh_atm = dynamic_thms st ("fresh_atm")
|
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
331 |
val ss1 = ss addsimps [symmetric fresh_def,fresh_prod,fresh_unit,conj_absorb,not_false]@fresh_atm |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
332 |
val ss2 = ss addsimps [supp_prod,supp_unit,finite_Un,finite_emptyI,conj_absorb]@fin_supp |
| 19857 | 333 |
in |
334 |
case Logic.strip_assums_concl (term_of goal) of |
|
335 |
_ $ (Const ("Nominal.fresh", Type ("fun", [T, _])) $ _ $ t) =>
|
|
336 |
let |
|
| 22578 | 337 |
val cert = Thm.cterm_of (Thm.theory_of_thm st); |
| 19857 | 338 |
val ps = Logic.strip_params (term_of goal); |
339 |
val Ts = rev (map snd ps); |
|
340 |
val vs = collect_vars 0 t []; |
|
| 21078 | 341 |
val s = Library.foldr (fn (v, s) => |
| 19857 | 342 |
HOLogic.pair_const (fastype_of1 (Ts, v)) (fastype_of1 (Ts, s)) $ v $ s) |
| 21078 | 343 |
(vs, HOLogic.unit); |
| 19857 | 344 |
val s' = list_abs (ps, |
345 |
Const ("Nominal.supp", fastype_of1 (Ts, s) --> (HOLogic.mk_setT T)) $ s);
|
|
346 |
val supports_fresh_rule' = Thm.lift_rule goal supports_fresh_rule; |
|
347 |
val _ $ (_ $ S $ _) = |
|
348 |
Logic.strip_assums_concl (hd (prems_of supports_fresh_rule')); |
|
349 |
val supports_fresh_rule'' = Drule.cterm_instantiate |
|
350 |
[(cert (head_of S), cert s')] supports_fresh_rule' |
|
351 |
in |
|
|
22418
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
352 |
(tactical ("guessing of the right set that supports the goal",
|
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
353 |
(EVERY [compose_tac (false, supports_fresh_rule'', 3) i, |
|
19993
e0a5783d708f
added simplification rules to the fresh_guess tactic
urbanc
parents:
19987
diff
changeset
|
354 |
asm_full_simp_tac ss1 (i+2), |
|
e0a5783d708f
added simplification rules to the fresh_guess tactic
urbanc
parents:
19987
diff
changeset
|
355 |
asm_full_simp_tac ss2 (i+1), |
|
22418
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
356 |
supports_tac tactical ss i]))) st |
| 19857 | 357 |
end |
|
22418
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
358 |
(* when a term-constructor contains more than one binder, it is useful *) |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
359 |
(* in nominal_primrecs to try whether the goal can be solved by an hammer *) |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
360 |
| _ => (tactical ("if it is not of the form _\<sharp>_, then try the simplifier",
|
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
361 |
(asm_full_simp_tac (HOL_ss addsimps [fresh_prod]@fresh_atm) i))) st |
| 19857 | 362 |
end |
|
22418
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
363 |
handle Subscript => Seq.empty; |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
364 |
|
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
365 |
(* 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:
22274
diff
changeset
|
366 |
fun local_simp_meth_setup tac = |
|
18046
b7389981170b
Changed Simplifier.simp_modifiers to Simplifier.simp_modifiers'.
urbanc
parents:
18012
diff
changeset
|
367 |
Method.only_sectioned_args (Simplifier.simp_modifiers' @ Splitter.split_modifiers) |
|
22418
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
368 |
(Method.SIMPLE_METHOD' o tac o local_simpset_of) ; |
| 17870 | 369 |
|
|
22595
293934e41dfd
make fresh_guess fail if it does not solve the subgoal
narboux
parents:
22578
diff
changeset
|
370 |
(* 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:
22578
diff
changeset
|
371 |
|
|
22656
13302b2d0948
debug versions of finite_guess and fresh_guess do not fail if they can not solve the goal
narboux
parents:
22610
diff
changeset
|
372 |
fun basic_simp_meth_setup debug tac = |
|
22418
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
373 |
Method.sectioned_args |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
374 |
(fn (ctxt,l) => ((),((Simplifier.map_ss (fn _ => HOL_basic_ss) ctxt),l))) |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
375 |
(Simplifier.simp_modifiers' @ Splitter.split_modifiers) |
|
22656
13302b2d0948
debug versions of finite_guess and fresh_guess do not fail if they can not solve the goal
narboux
parents:
22610
diff
changeset
|
376 |
(fn _ => Method.SIMPLE_METHOD' o (fn ss => if debug then (tac ss) else SOLVEI (tac ss)) o local_simpset_of); |
|
22418
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
377 |
|
| 17870 | 378 |
|
|
22418
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
379 |
val perm_simp_meth = local_simp_meth_setup (perm_simp_tac NO_DEBUG_tac); |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
380 |
val perm_simp_meth_debug = local_simp_meth_setup (perm_simp_tac DEBUG_tac); |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
381 |
val perm_full_simp_meth = local_simp_meth_setup (perm_full_simp_tac NO_DEBUG_tac); |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
382 |
val perm_full_simp_meth_debug = local_simp_meth_setup (perm_full_simp_tac DEBUG_tac); |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
383 |
val supports_meth = local_simp_meth_setup (supports_tac NO_DEBUG_tac); |
|
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
384 |
val supports_meth_debug = local_simp_meth_setup (supports_tac DEBUG_tac); |
| 24571 | 385 |
|
|
22656
13302b2d0948
debug versions of finite_guess and fresh_guess do not fail if they can not solve the goal
narboux
parents:
22610
diff
changeset
|
386 |
val finite_guess_meth = basic_simp_meth_setup false (finite_guess_tac NO_DEBUG_tac); |
|
13302b2d0948
debug versions of finite_guess and fresh_guess do not fail if they can not solve the goal
narboux
parents:
22610
diff
changeset
|
387 |
val finite_guess_meth_debug = basic_simp_meth_setup true (finite_guess_tac DEBUG_tac); |
|
13302b2d0948
debug versions of finite_guess and fresh_guess do not fail if they can not solve the goal
narboux
parents:
22610
diff
changeset
|
388 |
val fresh_guess_meth = basic_simp_meth_setup false (fresh_guess_tac NO_DEBUG_tac); |
|
13302b2d0948
debug versions of finite_guess and fresh_guess do not fail if they can not solve the goal
narboux
parents:
22610
diff
changeset
|
389 |
val fresh_guess_meth_debug = basic_simp_meth_setup true (fresh_guess_tac DEBUG_tac); |
|
22418
49e2d9744ae1
major update of the nominal package; there is now an infrastructure
urbanc
parents:
22274
diff
changeset
|
390 |
|
|
19987
b97607d4d9a5
- put declarations inside a structure (NominalPermeq)
berghofe
parents:
19858
diff
changeset
|
391 |
val perm_simp_tac = perm_simp_tac NO_DEBUG_tac; |
|
b97607d4d9a5
- put declarations inside a structure (NominalPermeq)
berghofe
parents:
19858
diff
changeset
|
392 |
val perm_full_simp_tac = perm_full_simp_tac NO_DEBUG_tac; |
|
b97607d4d9a5
- put declarations inside a structure (NominalPermeq)
berghofe
parents:
19858
diff
changeset
|
393 |
val supports_tac = supports_tac NO_DEBUG_tac; |
|
b97607d4d9a5
- put declarations inside a structure (NominalPermeq)
berghofe
parents:
19858
diff
changeset
|
394 |
val finite_guess_tac = finite_guess_tac NO_DEBUG_tac; |
|
b97607d4d9a5
- put declarations inside a structure (NominalPermeq)
berghofe
parents:
19858
diff
changeset
|
395 |
val fresh_guess_tac = fresh_guess_tac NO_DEBUG_tac; |
| 17870 | 396 |
|
| 20289 | 397 |
end |