author | wenzelm |
Wed, 25 Aug 2010 18:36:22 +0200 | |
changeset 38715 | 6513ea67d95d |
parent 38558 | 32ad17fe2b9c |
child 38795 | 848be46708dc |
permissions | -rw-r--r-- |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
1 |
(* Title: HOL/Nominal/nominal_inductive2.ML |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
2 |
Author: Stefan Berghofer, TU Muenchen |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
3 |
|
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
4 |
Infrastructure for proving equivariance and strong induction theorems |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
5 |
for inductive predicates involving nominal datatypes. |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
6 |
Experimental version that allows to avoid lists of atoms. |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
7 |
*) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
8 |
|
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
9 |
signature NOMINAL_INDUCTIVE2 = |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
10 |
sig |
38715
6513ea67d95d
renamed Simplifier.simproc(_i) to Simplifier.simproc_global(_i) to emphasize that this is not the real thing;
wenzelm
parents:
38558
diff
changeset
|
11 |
val prove_strong_ind: string -> string option -> (string * string list) list -> |
6513ea67d95d
renamed Simplifier.simproc(_i) to Simplifier.simproc_global(_i) to emphasize that this is not the real thing;
wenzelm
parents:
38558
diff
changeset
|
12 |
local_theory -> Proof.state |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
13 |
end |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
14 |
|
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
15 |
structure NominalInductive2 : NOMINAL_INDUCTIVE2 = |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
16 |
struct |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
17 |
|
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
18 |
val inductive_forall_name = "HOL.induct_forall"; |
33772
b6a1feca2ac2
use of thm-antiquotation
Christian Urban <urbanc@in.tum.de>
parents:
33671
diff
changeset
|
19 |
val inductive_forall_def = @{thm induct_forall_def}; |
b6a1feca2ac2
use of thm-antiquotation
Christian Urban <urbanc@in.tum.de>
parents:
33671
diff
changeset
|
20 |
val inductive_atomize = @{thms induct_atomize}; |
b6a1feca2ac2
use of thm-antiquotation
Christian Urban <urbanc@in.tum.de>
parents:
33671
diff
changeset
|
21 |
val inductive_rulify = @{thms induct_rulify}; |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
22 |
|
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
23 |
fun rulify_term thy = MetaSimplifier.rewrite_term thy inductive_rulify []; |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
24 |
|
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
25 |
val atomize_conv = |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
26 |
MetaSimplifier.rewrite_cterm (true, false, false) (K (K NONE)) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
27 |
(HOL_basic_ss addsimps inductive_atomize); |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
28 |
val atomize_intr = Conv.fconv_rule (Conv.prems_conv ~1 atomize_conv); |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
29 |
fun atomize_induct ctxt = Conv.fconv_rule (Conv.prems_conv ~1 |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
30 |
(Conv.params_conv ~1 (K (Conv.prems_conv ~1 atomize_conv)) ctxt)); |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
31 |
|
30108 | 32 |
val fresh_postprocess = |
33 |
Simplifier.full_simplify (HOL_basic_ss addsimps |
|
34 |
[@{thm fresh_star_set_eq}, @{thm fresh_star_Un_elim}, |
|
35 |
@{thm fresh_star_insert_elim}, @{thm fresh_star_empty_elim}]); |
|
36 |
||
33049
c38f02fdf35d
curried inter as canonical list operation (beware of argument order)
haftmann
parents:
33040
diff
changeset
|
37 |
fun preds_of ps t = inter (op = o apfst dest_Free) (Term.add_frees t []) ps; |
30087
a780642a9c9c
nominal_inductive and equivariance now work on local_theory.
berghofe
parents:
29585
diff
changeset
|
38 |
|
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
39 |
val perm_bool = mk_meta_eq (thm "perm_bool"); |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
40 |
val perm_boolI = thm "perm_boolI"; |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
41 |
val (_, [perm_boolI_pi, _]) = Drule.strip_comb (snd (Thm.dest_comb |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
42 |
(Drule.strip_imp_concl (cprop_of perm_boolI)))); |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
43 |
|
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
44 |
fun mk_perm_bool pi th = th RS Drule.cterm_instantiate |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
45 |
[(perm_boolI_pi, pi)] perm_boolI; |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
46 |
|
38715
6513ea67d95d
renamed Simplifier.simproc(_i) to Simplifier.simproc_global(_i) to emphasize that this is not the real thing;
wenzelm
parents:
38558
diff
changeset
|
47 |
fun mk_perm_bool_simproc names = Simplifier.simproc_global_i |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
48 |
(theory_of_thm perm_bool) "perm_bool" [@{term "perm pi x"}] (fn thy => fn ss => |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
49 |
fn Const ("Nominal.perm", _) $ _ $ t => |
36692
54b64d4ad524
farewell to old-style mem infixes -- type inference in situations with mem_int and mem_string should provide enough information to resolve the type of (op =)
haftmann
parents:
36428
diff
changeset
|
50 |
if member (op =) names (the_default "" (try (head_of #> dest_Const #> fst) t)) |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
51 |
then SOME perm_bool else NONE |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
52 |
| _ => NONE); |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
53 |
|
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
54 |
fun transp ([] :: _) = [] |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
55 |
| transp xs = map hd xs :: transp (map tl xs); |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
56 |
|
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
57 |
fun add_binders thy i (t as (_ $ _)) bs = (case strip_comb t of |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
58 |
(Const (s, T), ts) => (case strip_type T of |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
59 |
(Ts, Type (tname, _)) => |
31938 | 60 |
(case NominalDatatype.get_nominal_datatype thy tname of |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
61 |
NONE => fold (add_binders thy i) ts bs |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
62 |
| SOME {descr, index, ...} => (case AList.lookup op = |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
63 |
(#3 (the (AList.lookup op = descr index))) s of |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
64 |
NONE => fold (add_binders thy i) ts bs |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
65 |
| SOME cargs => fst (fold (fn (xs, x) => fn (bs', cargs') => |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
66 |
let val (cargs1, (u, _) :: cargs2) = chop (length xs) cargs' |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
67 |
in (add_binders thy i u |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
68 |
(fold (fn (u, T) => |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
69 |
if exists (fn j => j < i) (loose_bnos u) then I |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
70 |
else AList.map_default op = (T, []) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
71 |
(insert op aconv (incr_boundvars (~i) u))) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
72 |
cargs1 bs'), cargs2) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
73 |
end) cargs (bs, ts ~~ Ts)))) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
74 |
| _ => fold (add_binders thy i) ts bs) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
75 |
| (u, ts) => add_binders thy i u (fold (add_binders thy i) ts bs)) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
76 |
| add_binders thy i (Abs (_, _, t)) bs = add_binders thy (i + 1) t bs |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
77 |
| add_binders thy i _ bs = bs; |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
78 |
|
38549
d0385f2764d8
use antiquotations for remaining unqualified constants in HOL
haftmann
parents:
36960
diff
changeset
|
79 |
fun split_conj f names (Const (@{const_name "op &"}, _) $ p $ q) _ = (case head_of p of |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
80 |
Const (name, _) => |
36692
54b64d4ad524
farewell to old-style mem infixes -- type inference in situations with mem_int and mem_string should provide enough information to resolve the type of (op =)
haftmann
parents:
36428
diff
changeset
|
81 |
if member (op =) names name then SOME (f p q) else NONE |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
82 |
| _ => NONE) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
83 |
| split_conj _ _ _ _ = NONE; |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
84 |
|
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
85 |
fun strip_all [] t = t |
38558 | 86 |
| strip_all (_ :: xs) (Const (@{const_name All}, _) $ Abs (s, T, t)) = strip_all xs t; |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
87 |
|
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
88 |
(*********************************************************************) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
89 |
(* maps R ... & (ALL pi_1 ... pi_n z. P z (pi_1 o ... o pi_n o t)) *) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
90 |
(* or ALL pi_1 ... pi_n z. P z (pi_1 o ... o pi_n o t) *) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
91 |
(* to R ... & id (ALL z. P z (pi_1 o ... o pi_n o t)) *) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
92 |
(* or id (ALL z. P z (pi_1 o ... o pi_n o t)) *) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
93 |
(* *) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
94 |
(* where "id" protects the subformula from simplification *) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
95 |
(*********************************************************************) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
96 |
|
38549
d0385f2764d8
use antiquotations for remaining unqualified constants in HOL
haftmann
parents:
36960
diff
changeset
|
97 |
fun inst_conj_all names ps pis (Const (@{const_name "op &"}, _) $ p $ q) _ = |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
98 |
(case head_of p of |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
99 |
Const (name, _) => |
36692
54b64d4ad524
farewell to old-style mem infixes -- type inference in situations with mem_int and mem_string should provide enough information to resolve the type of (op =)
haftmann
parents:
36428
diff
changeset
|
100 |
if member (op =) names name then SOME (HOLogic.mk_conj (p, |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
101 |
Const ("Fun.id", HOLogic.boolT --> HOLogic.boolT) $ |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
102 |
(subst_bounds (pis, strip_all pis q)))) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
103 |
else NONE |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
104 |
| _ => NONE) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
105 |
| inst_conj_all names ps pis t u = |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
106 |
if member (op aconv) ps (head_of u) then |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
107 |
SOME (Const ("Fun.id", HOLogic.boolT --> HOLogic.boolT) $ |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
108 |
(subst_bounds (pis, strip_all pis t))) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
109 |
else NONE |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
110 |
| inst_conj_all _ _ _ _ _ = NONE; |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
111 |
|
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
112 |
fun inst_conj_all_tac k = EVERY |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
113 |
[TRY (EVERY [etac conjE 1, rtac conjI 1, atac 1]), |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
114 |
REPEAT_DETERM_N k (etac allE 1), |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
115 |
simp_tac (HOL_basic_ss addsimps [@{thm id_apply}]) 1]; |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
116 |
|
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
117 |
fun map_term f t u = (case f t u of |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
118 |
NONE => map_term' f t u | x => x) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
119 |
and map_term' f (t $ u) (t' $ u') = (case (map_term f t t', map_term f u u') of |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
120 |
(NONE, NONE) => NONE |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
121 |
| (SOME t'', NONE) => SOME (t'' $ u) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
122 |
| (NONE, SOME u'') => SOME (t $ u'') |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
123 |
| (SOME t'', SOME u'') => SOME (t'' $ u'')) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
124 |
| map_term' f (Abs (s, T, t)) (Abs (s', T', t')) = (case map_term f t t' of |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
125 |
NONE => NONE |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
126 |
| SOME t'' => SOME (Abs (s, T, t''))) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
127 |
| map_term' _ _ _ = NONE; |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
128 |
|
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
129 |
(*********************************************************************) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
130 |
(* Prove F[f t] from F[t], where F is monotone *) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
131 |
(*********************************************************************) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
132 |
|
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
133 |
fun map_thm ctxt f tac monos opt th = |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
134 |
let |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
135 |
val prop = prop_of th; |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
136 |
fun prove t = |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
137 |
Goal.prove ctxt [] [] t (fn _ => |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
138 |
EVERY [cut_facts_tac [th] 1, etac rev_mp 1, |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
139 |
REPEAT_DETERM (FIRSTGOAL (resolve_tac monos)), |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
140 |
REPEAT_DETERM (rtac impI 1 THEN (atac 1 ORELSE tac))]) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
141 |
in Option.map prove (map_term f prop (the_default prop opt)) end; |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
142 |
|
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
143 |
fun abs_params params t = |
29276 | 144 |
let val vs = map (Var o apfst (rpair 0)) (Term.rename_wrt_term t params) |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
145 |
in (list_all (params, t), (rev vs, subst_bounds (vs, t))) end; |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
146 |
|
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
147 |
fun inst_params thy (vs, p) th cts = |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
148 |
let val env = Pattern.first_order_match thy (p, prop_of th) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
149 |
(Vartab.empty, Vartab.empty) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
150 |
in Thm.instantiate ([], |
32035 | 151 |
map (Envir.subst_term env #> cterm_of thy) vs ~~ cts) th |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
152 |
end; |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
153 |
|
32304 | 154 |
fun prove_strong_ind s alt_name avoids ctxt = |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
155 |
let |
30087
a780642a9c9c
nominal_inductive and equivariance now work on local_theory.
berghofe
parents:
29585
diff
changeset
|
156 |
val thy = ProofContext.theory_of ctxt; |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
157 |
val ({names, ...}, {raw_induct, intrs, elims, ...}) = |
31723
f5cafe803b55
discontinued ancient tradition to suffix certain ML module names with "_package"
haftmann
parents:
31177
diff
changeset
|
158 |
Inductive.the_inductive ctxt (Sign.intern_const thy s); |
f5cafe803b55
discontinued ancient tradition to suffix certain ML module names with "_package"
haftmann
parents:
31177
diff
changeset
|
159 |
val ind_params = Inductive.params_of raw_induct; |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
160 |
val raw_induct = atomize_induct ctxt raw_induct; |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
161 |
val elims = map (atomize_induct ctxt) elims; |
31723
f5cafe803b55
discontinued ancient tradition to suffix certain ML module names with "_package"
haftmann
parents:
31177
diff
changeset
|
162 |
val monos = Inductive.get_monos ctxt; |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
163 |
val eqvt_thms = NominalThmDecls.get_eqvt_thms ctxt; |
33040 | 164 |
val _ = (case subtract (op =) (fold (Term.add_const_names o Thm.prop_of) eqvt_thms []) names of |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
165 |
[] => () |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
166 |
| xs => error ("Missing equivariance theorem for predicate(s): " ^ |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
167 |
commas_quote xs)); |
33368 | 168 |
val induct_cases = map fst (fst (Rule_Cases.get (the |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
169 |
(Induct.lookup_inductP ctxt (hd names))))); |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
170 |
val induct_cases' = if null induct_cases then replicate (length intrs) "" |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
171 |
else induct_cases; |
30087
a780642a9c9c
nominal_inductive and equivariance now work on local_theory.
berghofe
parents:
29585
diff
changeset
|
172 |
val ([raw_induct'], ctxt') = Variable.import_terms false [prop_of raw_induct] ctxt; |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
173 |
val concls = raw_induct' |> Logic.strip_imp_concl |> HOLogic.dest_Trueprop |> |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
174 |
HOLogic.dest_conj |> map (HOLogic.dest_imp ##> strip_comb); |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
175 |
val ps = map (fst o snd) concls; |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
176 |
|
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
177 |
val _ = (case duplicates (op = o pairself fst) avoids of |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
178 |
[] => () |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
179 |
| xs => error ("Duplicate case names: " ^ commas_quote (map fst xs))); |
33040 | 180 |
val _ = (case subtract (op =) induct_cases (map fst avoids) of |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
181 |
[] => () |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
182 |
| xs => error ("No such case(s) in inductive definition: " ^ commas_quote xs)); |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
183 |
fun mk_avoids params name sets = |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
184 |
let |
30763
6976521b4263
renamed ProofContext.add_fixes_i to ProofContext.add_fixes, eliminated obsolete external version;
wenzelm
parents:
30450
diff
changeset
|
185 |
val (_, ctxt') = ProofContext.add_fixes |
28965 | 186 |
(map (fn (s, T) => (Binding.name s, SOME T, NoSyn)) params) ctxt; |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
187 |
fun mk s = |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
188 |
let |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
189 |
val t = Syntax.read_term ctxt' s; |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
190 |
val t' = list_abs_free (params, t) |> |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
191 |
funpow (length params) (fn Abs (_, _, t) => t) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
192 |
in (t', HOLogic.dest_setT (fastype_of t)) end |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
193 |
handle TERM _ => |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
194 |
error ("Expression " ^ quote s ^ " to be avoided in case " ^ |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
195 |
quote name ^ " is not a set type"); |
30108 | 196 |
fun add_set p [] = [p] |
197 |
| add_set (t, T) ((u, U) :: ps) = |
|
198 |
if T = U then |
|
199 |
let val S = HOLogic.mk_setT T |
|
34918 | 200 |
in (Const (@{const_name sup}, S --> S --> S) $ u $ t, T) :: ps |
30108 | 201 |
end |
202 |
else (u, U) :: add_set (t, T) ps |
|
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
203 |
in |
30108 | 204 |
fold (mk #> add_set) sets [] |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
205 |
end; |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
206 |
|
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
207 |
val prems = map (fn (prem, name) => |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
208 |
let |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
209 |
val prems = map (incr_boundvars 1) (Logic.strip_assums_hyp prem); |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
210 |
val concl = incr_boundvars 1 (Logic.strip_assums_concl prem); |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
211 |
val params = Logic.strip_params prem |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
212 |
in |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
213 |
(params, |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
214 |
if null avoids then |
30450 | 215 |
map (fn (T, ts) => (HOLogic.mk_set T ts, T)) |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
216 |
(fold (add_binders thy 0) (prems @ [concl]) []) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
217 |
else case AList.lookup op = avoids name of |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
218 |
NONE => [] |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
219 |
| SOME sets => |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
220 |
map (apfst (incr_boundvars 1)) (mk_avoids params name sets), |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
221 |
prems, strip_comb (HOLogic.dest_Trueprop concl)) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
222 |
end) (Logic.strip_imp_prems raw_induct' ~~ induct_cases'); |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
223 |
|
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
224 |
val atomTs = distinct op = (maps (map snd o #2) prems); |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
225 |
val atoms = map (fst o dest_Type) atomTs; |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
226 |
val ind_sort = if null atomTs then HOLogic.typeS |
36428
874843c1e96e
really minimize sorts after certification -- looks like this is intended here;
wenzelm
parents:
36323
diff
changeset
|
227 |
else Sign.minimize_sort thy (Sign.certify_sort thy (map (fn a => Sign.intern_class thy |
874843c1e96e
really minimize sorts after certification -- looks like this is intended here;
wenzelm
parents:
36323
diff
changeset
|
228 |
("fs_" ^ Long_Name.base_name a)) atoms)); |
30087
a780642a9c9c
nominal_inductive and equivariance now work on local_theory.
berghofe
parents:
29585
diff
changeset
|
229 |
val ([fs_ctxt_tyname], _) = Name.variants ["'n"] (Variable.names_of ctxt'); |
a780642a9c9c
nominal_inductive and equivariance now work on local_theory.
berghofe
parents:
29585
diff
changeset
|
230 |
val ([fs_ctxt_name], ctxt'') = Variable.variant_fixes ["z"] ctxt'; |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
231 |
val fsT = TFree (fs_ctxt_tyname, ind_sort); |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
232 |
|
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
233 |
val inductive_forall_def' = Drule.instantiate' |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
234 |
[SOME (ctyp_of thy fsT)] [] inductive_forall_def; |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
235 |
|
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
236 |
fun lift_pred' t (Free (s, T)) ts = |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
237 |
list_comb (Free (s, fsT --> T), t :: ts); |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
238 |
val lift_pred = lift_pred' (Bound 0); |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
239 |
|
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
240 |
fun lift_prem (t as (f $ u)) = |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
241 |
let val (p, ts) = strip_comb t |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
242 |
in |
36692
54b64d4ad524
farewell to old-style mem infixes -- type inference in situations with mem_int and mem_string should provide enough information to resolve the type of (op =)
haftmann
parents:
36428
diff
changeset
|
243 |
if member (op =) ps p then |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
244 |
Const (inductive_forall_name, |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
245 |
(fsT --> HOLogic.boolT) --> HOLogic.boolT) $ |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
246 |
Abs ("z", fsT, lift_pred p (map (incr_boundvars 1) ts)) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
247 |
else lift_prem f $ lift_prem u |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
248 |
end |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
249 |
| lift_prem (Abs (s, T, t)) = Abs (s, T, lift_prem t) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
250 |
| lift_prem t = t; |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
251 |
|
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
252 |
fun mk_fresh (x, T) = HOLogic.mk_Trueprop |
31938 | 253 |
(NominalDatatype.fresh_star_const T fsT $ x $ Bound 0); |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
254 |
|
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
255 |
val (prems', prems'') = split_list (map (fn (params, sets, prems, (p, ts)) => |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
256 |
let |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
257 |
val params' = params @ [("y", fsT)]; |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
258 |
val prem = Logic.list_implies |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
259 |
(map mk_fresh sets @ |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
260 |
map (fn prem => |
30087
a780642a9c9c
nominal_inductive and equivariance now work on local_theory.
berghofe
parents:
29585
diff
changeset
|
261 |
if null (preds_of ps prem) then prem |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
262 |
else lift_prem prem) prems, |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
263 |
HOLogic.mk_Trueprop (lift_pred p ts)); |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
264 |
in abs_params params' prem end) prems); |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
265 |
|
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
266 |
val ind_vars = |
33968
f94fb13ecbb3
modernized structures and tuned headers of datatype package modules; joined former datatype.ML and datatype_rep_proofs.ML
haftmann
parents:
33772
diff
changeset
|
267 |
(Datatype_Prop.indexify_names (replicate (length atomTs) "pi") ~~ |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
268 |
map NominalAtoms.mk_permT atomTs) @ [("z", fsT)]; |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
269 |
val ind_Ts = rev (map snd ind_vars); |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
270 |
|
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
271 |
val concl = HOLogic.mk_Trueprop (foldr1 HOLogic.mk_conj |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
272 |
(map (fn (prem, (p, ts)) => HOLogic.mk_imp (prem, |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
273 |
HOLogic.list_all (ind_vars, lift_pred p |
31938 | 274 |
(map (fold_rev (NominalDatatype.mk_perm ind_Ts) |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
275 |
(map Bound (length atomTs downto 1))) ts)))) concls)); |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
276 |
|
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
277 |
val concl' = HOLogic.mk_Trueprop (foldr1 HOLogic.mk_conj |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
278 |
(map (fn (prem, (p, ts)) => HOLogic.mk_imp (prem, |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
279 |
lift_pred' (Free (fs_ctxt_name, fsT)) p ts)) concls)); |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
280 |
|
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
281 |
val (vc_compat, vc_compat') = map (fn (params, sets, prems, (p, ts)) => |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
282 |
map (fn q => abs_params params (incr_boundvars ~1 (Logic.list_implies |
32952 | 283 |
(map_filter (fn prem => |
30087
a780642a9c9c
nominal_inductive and equivariance now work on local_theory.
berghofe
parents:
29585
diff
changeset
|
284 |
if null (preds_of ps prem) then SOME prem |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
285 |
else map_term (split_conj (K o I) names) prem prem) prems, q)))) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
286 |
(maps (fn (t, T) => map (fn (u, U) => HOLogic.mk_Trueprop |
31938 | 287 |
(NominalDatatype.fresh_star_const U T $ u $ t)) sets) |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
288 |
(ts ~~ binder_types (fastype_of p)) @ |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
289 |
map (fn (u, U) => HOLogic.mk_Trueprop (Const (@{const_name finite}, |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
290 |
HOLogic.mk_setT U --> HOLogic.boolT) $ u)) sets) |> |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
291 |
split_list) prems |> split_list; |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
292 |
|
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
293 |
val perm_pi_simp = PureThy.get_thms thy "perm_pi_simp"; |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
294 |
val pt2_atoms = map (fn a => PureThy.get_thm thy |
30364
577edc39b501
moved basic algebra of long names from structure NameSpace to Long_Name;
wenzelm
parents:
30307
diff
changeset
|
295 |
("pt_" ^ Long_Name.base_name a ^ "2")) atoms; |
35232
f588e1169c8b
renamed Simplifier.theory_context to Simplifier.global_context to emphasize that this is not the real thing;
wenzelm
parents:
34918
diff
changeset
|
296 |
val eqvt_ss = Simplifier.global_context thy HOL_basic_ss |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
297 |
addsimps (eqvt_thms @ perm_pi_simp @ pt2_atoms) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
298 |
addsimprocs [mk_perm_bool_simproc ["Fun.id"], |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
299 |
NominalPermeq.perm_simproc_app, NominalPermeq.perm_simproc_fun]; |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
300 |
val fresh_star_bij = PureThy.get_thms thy "fresh_star_bij"; |
28730
71c946ce7eb9
Streamlined functions for accessing information about atoms.
berghofe
parents:
28653
diff
changeset
|
301 |
val pt_insts = map (NominalAtoms.pt_inst_of thy) atoms; |
71c946ce7eb9
Streamlined functions for accessing information about atoms.
berghofe
parents:
28653
diff
changeset
|
302 |
val at_insts = map (NominalAtoms.at_inst_of thy) atoms; |
71c946ce7eb9
Streamlined functions for accessing information about atoms.
berghofe
parents:
28653
diff
changeset
|
303 |
val dj_thms = maps (fn a => |
33040 | 304 |
map (NominalAtoms.dj_thm_of thy a) (remove (op =) a atoms)) atoms; |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
305 |
val finite_ineq = map2 (fn th => fn th' => th' RS (th RS |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
306 |
@{thm pt_set_finite_ineq})) pt_insts at_insts; |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
307 |
val perm_set_forget = |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
308 |
map (fn th => th RS @{thm dj_perm_set_forget}) dj_thms; |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
309 |
val perm_freshs_freshs = atomTs ~~ map2 (fn th => fn th' => th' RS (th RS |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
310 |
@{thm pt_freshs_freshs})) pt_insts at_insts; |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
311 |
|
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
312 |
fun obtain_fresh_name ts sets (T, fin) (freshs, ths1, ths2, ths3, ctxt) = |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
313 |
let |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
314 |
val thy = ProofContext.theory_of ctxt; |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
315 |
(** protect terms to avoid that fresh_star_prod_set interferes with **) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
316 |
(** pairs used in introduction rules of inductive predicate **) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
317 |
fun protect t = |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
318 |
let val T = fastype_of t in Const ("Fun.id", T --> T) $ t end; |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
319 |
val p = foldr1 HOLogic.mk_prod (map protect ts); |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
320 |
val atom = fst (dest_Type T); |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
321 |
val {at_inst, ...} = NominalAtoms.the_atom_info thy atom; |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
322 |
val fs_atom = PureThy.get_thm thy |
30364
577edc39b501
moved basic algebra of long names from structure NameSpace to Long_Name;
wenzelm
parents:
30307
diff
changeset
|
323 |
("fs_" ^ Long_Name.base_name atom ^ "1"); |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
324 |
val avoid_th = Drule.instantiate' |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
325 |
[SOME (ctyp_of thy (fastype_of p))] [SOME (cterm_of thy p)] |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
326 |
([at_inst, fin, fs_atom] MRS @{thm at_set_avoiding}); |
32202 | 327 |
val (([(_, cx)], th1 :: th2 :: ths), ctxt') = Obtain.result |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
328 |
(fn _ => EVERY |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
329 |
[rtac avoid_th 1, |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
330 |
full_simp_tac (HOL_ss addsimps [@{thm fresh_star_prod_set}]) 1, |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
331 |
full_simp_tac (HOL_basic_ss addsimps [@{thm id_apply}]) 1, |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
332 |
rotate_tac 1 1, |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
333 |
REPEAT (etac conjE 1)]) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
334 |
[] ctxt; |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
335 |
val (Ts1, _ :: Ts2) = take_prefix (not o equal T) (map snd sets); |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
336 |
val pTs = map NominalAtoms.mk_permT (Ts1 @ Ts2); |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
337 |
val (pis1, pis2) = chop (length Ts1) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
338 |
(map Bound (length pTs - 1 downto 0)); |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
339 |
val _ $ (f $ (_ $ pi $ l) $ r) = prop_of th2 |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
340 |
val th2' = |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
341 |
Goal.prove ctxt [] [] |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
342 |
(list_all (map (pair "pi") pTs, HOLogic.mk_Trueprop |
31938 | 343 |
(f $ fold_rev (NominalDatatype.mk_perm (rev pTs)) |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
344 |
(pis1 @ pi :: pis2) l $ r))) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
345 |
(fn _ => cut_facts_tac [th2] 1 THEN |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
346 |
full_simp_tac (HOL_basic_ss addsimps perm_set_forget) 1) |> |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
347 |
Simplifier.simplify eqvt_ss |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
348 |
in |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
349 |
(freshs @ [term_of cx], |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
350 |
ths1 @ ths, ths2 @ [th1], ths3 @ [th2'], ctxt') |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
351 |
end; |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
352 |
|
30087
a780642a9c9c
nominal_inductive and equivariance now work on local_theory.
berghofe
parents:
29585
diff
changeset
|
353 |
fun mk_ind_proof ctxt' thss = |
a780642a9c9c
nominal_inductive and equivariance now work on local_theory.
berghofe
parents:
29585
diff
changeset
|
354 |
Goal.prove ctxt' [] prems' concl' (fn {prems = ihyps, context = ctxt} => |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
355 |
let val th = Goal.prove ctxt [] [] concl (fn {context, ...} => |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
356 |
rtac raw_induct 1 THEN |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
357 |
EVERY (maps (fn (((((_, sets, oprems, _), |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
358 |
vc_compat_ths), vc_compat_vs), ihyp), vs_ihypt) => |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
359 |
[REPEAT (rtac allI 1), simp_tac eqvt_ss 1, |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
360 |
SUBPROOF (fn {prems = gprems, params, concl, context = ctxt', ...} => |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
361 |
let |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
362 |
val (cparams', (pis, z)) = |
32202 | 363 |
chop (length params - length atomTs - 1) (map #2 params) ||> |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
364 |
(map term_of #> split_last); |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
365 |
val params' = map term_of cparams' |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
366 |
val sets' = map (apfst (curry subst_bounds (rev params'))) sets; |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
367 |
val pi_sets = map (fn (t, _) => |
31938 | 368 |
fold_rev (NominalDatatype.mk_perm []) pis t) sets'; |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
369 |
val (P, ts) = strip_comb (HOLogic.dest_Trueprop (term_of concl)); |
32952 | 370 |
val gprems1 = map_filter (fn (th, t) => |
30087
a780642a9c9c
nominal_inductive and equivariance now work on local_theory.
berghofe
parents:
29585
diff
changeset
|
371 |
if null (preds_of ps t) then SOME th |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
372 |
else |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
373 |
map_thm ctxt' (split_conj (K o I) names) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
374 |
(etac conjunct1 1) monos NONE th) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
375 |
(gprems ~~ oprems); |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
376 |
val vc_compat_ths' = map2 (fn th => fn p => |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
377 |
let |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
378 |
val th' = gprems1 MRS inst_params thy p th cparams'; |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
379 |
val (h, ts) = |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
380 |
strip_comb (HOLogic.dest_Trueprop (concl_of th')) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
381 |
in |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
382 |
Goal.prove ctxt' [] [] |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
383 |
(HOLogic.mk_Trueprop (list_comb (h, |
31938 | 384 |
map (fold_rev (NominalDatatype.mk_perm []) pis) ts))) |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
385 |
(fn _ => simp_tac (HOL_basic_ss addsimps |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
386 |
(fresh_star_bij @ finite_ineq)) 1 THEN rtac th' 1) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
387 |
end) vc_compat_ths vc_compat_vs; |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
388 |
val (vc_compat_ths1, vc_compat_ths2) = |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
389 |
chop (length vc_compat_ths - length sets) vc_compat_ths'; |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
390 |
val vc_compat_ths1' = map |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
391 |
(Conv.fconv_rule (Conv.arg_conv (Conv.arg_conv |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
392 |
(Simplifier.rewrite eqvt_ss)))) vc_compat_ths1; |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
393 |
val (pis', fresh_ths1, fresh_ths2, fresh_ths3, ctxt'') = fold |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
394 |
(obtain_fresh_name ts sets) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
395 |
(map snd sets' ~~ vc_compat_ths2) ([], [], [], [], ctxt'); |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
396 |
fun concat_perm pi1 pi2 = |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
397 |
let val T = fastype_of pi1 |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
398 |
in if T = fastype_of pi2 then |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
399 |
Const ("List.append", T --> T --> T) $ pi1 $ pi2 |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
400 |
else pi2 |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
401 |
end; |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
402 |
val pis'' = fold_rev (concat_perm #> map) pis' pis; |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
403 |
val ihyp' = inst_params thy vs_ihypt ihyp |
31938 | 404 |
(map (fold_rev (NominalDatatype.mk_perm []) |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
405 |
(pis' @ pis) #> cterm_of thy) params' @ [cterm_of thy z]); |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
406 |
fun mk_pi th = |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
407 |
Simplifier.simplify (HOL_basic_ss addsimps [@{thm id_apply}] |
31938 | 408 |
addsimprocs [NominalDatatype.perm_simproc]) |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
409 |
(Simplifier.simplify eqvt_ss |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
410 |
(fold_rev (mk_perm_bool o cterm_of thy) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
411 |
(pis' @ pis) th)); |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
412 |
val gprems2 = map (fn (th, t) => |
30087
a780642a9c9c
nominal_inductive and equivariance now work on local_theory.
berghofe
parents:
29585
diff
changeset
|
413 |
if null (preds_of ps t) then mk_pi th |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
414 |
else |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
415 |
mk_pi (the (map_thm ctxt (inst_conj_all names ps (rev pis'')) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
416 |
(inst_conj_all_tac (length pis'')) monos (SOME t) th))) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
417 |
(gprems ~~ oprems); |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
418 |
val perm_freshs_freshs' = map (fn (th, (_, T)) => |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
419 |
th RS the (AList.lookup op = perm_freshs_freshs T)) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
420 |
(fresh_ths2 ~~ sets); |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
421 |
val th = Goal.prove ctxt'' [] [] |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
422 |
(HOLogic.mk_Trueprop (list_comb (P $ hd ts, |
31938 | 423 |
map (fold_rev (NominalDatatype.mk_perm []) pis') (tl ts)))) |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
424 |
(fn _ => EVERY ([simp_tac eqvt_ss 1, rtac ihyp' 1] @ |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
425 |
map (fn th => rtac th 1) fresh_ths3 @ |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
426 |
[REPEAT_DETERM_N (length gprems) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
427 |
(simp_tac (HOL_basic_ss |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
428 |
addsimps [inductive_forall_def'] |
31938 | 429 |
addsimprocs [NominalDatatype.perm_simproc]) 1 THEN |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
430 |
resolve_tac gprems2 1)])); |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
431 |
val final = Goal.prove ctxt'' [] [] (term_of concl) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
432 |
(fn _ => cut_facts_tac [th] 1 THEN full_simp_tac (HOL_ss |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
433 |
addsimps vc_compat_ths1' @ fresh_ths1 @ |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
434 |
perm_freshs_freshs') 1); |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
435 |
val final' = ProofContext.export ctxt'' ctxt' [final]; |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
436 |
in resolve_tac final' 1 end) context 1]) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
437 |
(prems ~~ thss ~~ vc_compat' ~~ ihyps ~~ prems''))) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
438 |
in |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
439 |
cut_facts_tac [th] 1 THEN REPEAT (etac conjE 1) THEN |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
440 |
REPEAT (REPEAT (resolve_tac [conjI, impI] 1) THEN |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
441 |
etac impE 1 THEN atac 1 THEN REPEAT (etac @{thm allE_Nil} 1) THEN |
32149
ef59550a55d3
renamed simpset_of to global_simpset_of, and local_simpset_of to simpset_of -- same for claset and clasimpset;
wenzelm
parents:
32134
diff
changeset
|
442 |
asm_full_simp_tac (simpset_of ctxt) 1) |
30108 | 443 |
end) |> |
444 |
fresh_postprocess |> |
|
445 |
singleton (ProofContext.export ctxt' ctxt); |
|
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
446 |
|
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
447 |
in |
30087
a780642a9c9c
nominal_inductive and equivariance now work on local_theory.
berghofe
parents:
29585
diff
changeset
|
448 |
ctxt'' |> |
36323
655e2d74de3a
modernized naming conventions of main Isar proof elements;
wenzelm
parents:
35232
diff
changeset
|
449 |
Proof.theorem NONE (fn thss => fn ctxt => |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
450 |
let |
30364
577edc39b501
moved basic algebra of long names from structure NameSpace to Long_Name;
wenzelm
parents:
30307
diff
changeset
|
451 |
val rec_name = space_implode "_" (map Long_Name.base_name names); |
30223
24d975352879
renamed Binding.name_pos to Binding.make, renamed Binding.base_name to Binding.name_of, renamed Binding.map_base to Binding.map_name, added mandatory flag to Binding.qualify;
wenzelm
parents:
30108
diff
changeset
|
452 |
val rec_qualified = Binding.qualify false rec_name; |
33368 | 453 |
val ind_case_names = Rule_Cases.case_names induct_cases; |
31723
f5cafe803b55
discontinued ancient tradition to suffix certain ML module names with "_package"
haftmann
parents:
31177
diff
changeset
|
454 |
val induct_cases' = Inductive.partition_rules' raw_induct |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
455 |
(intrs ~~ induct_cases); |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
456 |
val thss' = map (map atomize_intr) thss; |
31723
f5cafe803b55
discontinued ancient tradition to suffix certain ML module names with "_package"
haftmann
parents:
31177
diff
changeset
|
457 |
val thsss = Inductive.partition_rules' raw_induct (intrs ~~ thss'); |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
458 |
val strong_raw_induct = |
31723
f5cafe803b55
discontinued ancient tradition to suffix certain ML module names with "_package"
haftmann
parents:
31177
diff
changeset
|
459 |
mk_ind_proof ctxt thss' |> Inductive.rulify; |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
460 |
val strong_induct = |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
461 |
if length names > 1 then |
33368 | 462 |
(strong_raw_induct, [ind_case_names, Rule_Cases.consumes 0]) |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
463 |
else (strong_raw_induct RSN (2, rev_mp), |
33368 | 464 |
[ind_case_names, Rule_Cases.consumes 1]); |
32304 | 465 |
val (induct_name, inducts_name) = |
466 |
case alt_name of |
|
32303
ba59e95a5d2b
the derived induction principles can be given an explicit name
Christian Urban <urbanc@in.tum.de>
parents:
32202
diff
changeset
|
467 |
NONE => (rec_qualified (Binding.name "strong_induct"), |
ba59e95a5d2b
the derived induction principles can be given an explicit name
Christian Urban <urbanc@in.tum.de>
parents:
32202
diff
changeset
|
468 |
rec_qualified (Binding.name "strong_inducts")) |
32304 | 469 |
| SOME s => (Binding.name s, Binding.name (s ^ "s")); |
33671 | 470 |
val ((_, [strong_induct']), ctxt') = ctxt |> Local_Theory.note |
32304 | 471 |
((induct_name, |
33670
02b7738aef6a
eliminated slightly odd kind argument of LocalTheory.note(s);
wenzelm
parents:
33666
diff
changeset
|
472 |
map (Attrib.internal o K) (#2 strong_induct)), [#1 strong_induct]); |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
473 |
val strong_inducts = |
32172 | 474 |
Project_Rule.projects ctxt' (1 upto length names) strong_induct' |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
475 |
in |
30087
a780642a9c9c
nominal_inductive and equivariance now work on local_theory.
berghofe
parents:
29585
diff
changeset
|
476 |
ctxt' |> |
33671 | 477 |
Local_Theory.note |
32304 | 478 |
((inducts_name, |
30087
a780642a9c9c
nominal_inductive and equivariance now work on local_theory.
berghofe
parents:
29585
diff
changeset
|
479 |
[Attrib.internal (K ind_case_names), |
33368 | 480 |
Attrib.internal (K (Rule_Cases.consumes 1))]), |
30087
a780642a9c9c
nominal_inductive and equivariance now work on local_theory.
berghofe
parents:
29585
diff
changeset
|
481 |
strong_inducts) |> snd |
a780642a9c9c
nominal_inductive and equivariance now work on local_theory.
berghofe
parents:
29585
diff
changeset
|
482 |
end) |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
483 |
(map (map (rulify_term thy #> rpair [])) vc_compat) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
484 |
end; |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
485 |
|
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
486 |
|
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
487 |
(* outer syntax *) |
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
488 |
|
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
489 |
val _ = |
36960
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents:
36692
diff
changeset
|
490 |
Outer_Syntax.local_theory_to_proof "nominal_inductive2" |
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents:
36692
diff
changeset
|
491 |
"prove strong induction theorem for inductive predicate involving nominal datatypes" |
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents:
36692
diff
changeset
|
492 |
Keyword.thy_goal |
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents:
36692
diff
changeset
|
493 |
(Parse.xname -- |
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents:
36692
diff
changeset
|
494 |
Scan.option (Parse.$$$ "(" |-- Parse.!!! (Parse.name --| Parse.$$$ ")")) -- |
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents:
36692
diff
changeset
|
495 |
(Scan.optional (Parse.$$$ "avoids" |-- Parse.enum1 "|" (Parse.name -- |
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents:
36692
diff
changeset
|
496 |
(Parse.$$$ ":" |-- Parse.and_list1 Parse.term))) []) >> (fn ((name, rule_name), avoids) => |
32303
ba59e95a5d2b
the derived induction principles can be given an explicit name
Christian Urban <urbanc@in.tum.de>
parents:
32202
diff
changeset
|
497 |
prove_strong_ind name rule_name avoids)); |
28653
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
498 |
|
4593c70e228e
More general, still experimental version of nominal_inductive for
berghofe
parents:
diff
changeset
|
499 |
end |