| author | blanchet |
| Thu, 18 Sep 2014 16:47:40 +0200 | |
| changeset 58377 | c6f93b8d2d8e |
| parent 57983 | 6edc3529bb4e |
| child 58445 | 86b5b02ef33a |
| permissions | -rw-r--r-- |
| 55061 | 1 |
(* Title: HOL/Tools/BNF/bnf_gfp_tactics.ML |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
2 |
Author: Dmitriy Traytel, TU Muenchen |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
3 |
Author: Andrei Popescu, TU Muenchen |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
4 |
Author: Jasmin Blanchette, TU Muenchen |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
5 |
Copyright 2012 |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
6 |
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
7 |
Tactics for the codatatype construction. |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
8 |
*) |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
9 |
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
10 |
signature BNF_GFP_TACTICS = |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
11 |
sig |
| 55197 | 12 |
val mk_bis_Gr_tac: Proof.context -> thm -> thm list -> thm list -> thm list -> thm list -> tactic |
| 51798 | 13 |
val mk_bis_O_tac: Proof.context -> int -> thm -> thm list -> thm list -> tactic |
| 55197 | 14 |
val mk_bis_Union_tac: Proof.context -> thm -> thm list -> tactic |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
15 |
val mk_bis_converse_tac: int -> thm -> thm list -> thm list -> tactic |
| 56017 | 16 |
val mk_bis_rel_tac: int -> thm -> thm list -> thm list -> thm list -> |
| 51798 | 17 |
thm list list -> tactic |
| 55197 | 18 |
val mk_coalgT_tac: Proof.context -> int -> thm list -> thm list -> thm list list -> tactic |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
19 |
val mk_coalg_final_tac: int -> thm -> thm list -> thm list -> thm list list -> thm list list -> |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
20 |
tactic |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
21 |
val mk_coalg_set_tac: thm -> tactic |
| 55197 | 22 |
val mk_coind_wit_tac: Proof.context -> thm -> thm list -> thm list -> thm list -> tactic |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
23 |
val mk_col_bd_tac: int -> int -> cterm option list -> thm list -> thm list -> thm -> thm -> |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
24 |
thm list list -> tactic |
| 55197 | 25 |
val mk_col_natural_tac: Proof.context -> cterm option list -> thm list -> thm list -> thm list -> |
26 |
thm list list -> tactic |
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
27 |
val mk_congruent_str_final_tac: int -> thm -> thm -> thm -> thm list -> tactic |
| 55197 | 28 |
val mk_corec_tac: Proof.context -> int -> thm list -> thm -> thm -> thm list -> tactic |
29 |
val mk_corec_unique_mor_tac: Proof.context -> thm list -> thm list -> thm -> tactic |
|
|
51893
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51850
diff
changeset
|
30 |
val mk_dtor_coinduct_tac: int -> thm -> thm -> thm list -> tactic |
|
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51850
diff
changeset
|
31 |
val mk_dtor_rel_tac: Proof.context -> thm list -> int -> thm -> thm -> thm -> thm -> thm list -> |
| 51798 | 32 |
thm -> thm -> thm list -> thm list -> thm list list -> tactic |
| 55197 | 33 |
val mk_dtor_o_ctor_tac: Proof.context -> thm -> thm -> thm -> thm -> thm list -> tactic |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
34 |
val mk_equiv_lsbis_tac: thm -> thm -> thm -> thm -> thm -> thm -> tactic |
| 56179 | 35 |
val mk_Jset_minimal_tac: Proof.context -> int -> thm -> tactic |
| 56113 | 36 |
val mk_col_minimal_tac: Proof.context -> int -> cterm option list -> thm list -> thm list -> |
| 55197 | 37 |
tactic |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
38 |
val mk_incl_lsbis_tac: int -> int -> thm -> tactic |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
39 |
val mk_length_Lev'_tac: thm -> tactic |
| 51798 | 40 |
val mk_length_Lev_tac: Proof.context -> cterm option list -> thm list -> thm list -> tactic |
|
54841
af71b753c459
express weak pullback property of bnfs only in terms of the relator
traytel
parents:
54793
diff
changeset
|
41 |
val mk_map_comp0_tac: thm list -> thm list -> thm -> tactic |
| 51798 | 42 |
val mk_mcong_tac: Proof.context -> int -> (int -> tactic) -> thm list -> thm list -> thm list -> |
| 55644 | 43 |
thm list list -> thm list list -> thm list list list -> thm list -> tactic |
| 53270 | 44 |
val mk_map_id0_tac: thm list -> thm -> thm -> tactic |
| 55602 | 45 |
val mk_map_tac: int -> int -> thm -> thm -> thm -> thm -> tactic |
| 55197 | 46 |
val mk_dtor_map_unique_tac: Proof.context -> thm -> thm list -> tactic |
47 |
val mk_mor_Abs_tac: Proof.context -> thm list -> thm list -> tactic |
|
|
55541
fd9ea8ae28f6
syntactic simplifications of internal (co)datatype constructions
traytel
parents:
55414
diff
changeset
|
48 |
val mk_mor_Rep_tac: Proof.context -> thm list -> thm list -> thm list -> thm list list -> |
| 55197 | 49 |
thm list -> thm list -> tactic |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
50 |
val mk_mor_T_final_tac: thm -> thm list -> thm list -> tactic |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
51 |
val mk_mor_UNIV_tac: thm list -> thm -> tactic |
| 55197 | 52 |
val mk_mor_beh_tac: Proof.context -> int -> thm -> thm -> thm list -> thm list -> thm list -> |
53 |
thm list -> thm list list -> thm list list -> thm list -> thm list -> thm list -> thm list -> |
|
|
55577
a6c2379078c8
simplifications of internal codatatype construction
traytel
parents:
55541
diff
changeset
|
54 |
thm list -> thm list -> thm list list -> thm list list list -> thm list list list -> |
|
a6c2379078c8
simplifications of internal codatatype construction
traytel
parents:
55541
diff
changeset
|
55 |
thm list list -> thm list -> thm list -> tactic |
|
55414
eab03e9cee8a
renamed '{prod,sum,bool,unit}_case' to 'case_...'
blanchet
parents:
55393
diff
changeset
|
56 |
val mk_mor_case_sum_tac: 'a list -> thm -> tactic |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
57 |
val mk_mor_comp_tac: thm -> thm list -> thm list -> thm list -> tactic |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
58 |
val mk_mor_elim_tac: thm -> tactic |
| 56113 | 59 |
val mk_mor_col_tac: int -> int -> cterm option list -> int -> thm list -> thm list -> |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
60 |
thm list -> thm list list -> thm list list -> tactic |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
61 |
val mk_mor_incl_tac: thm -> thm list -> tactic |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
62 |
val mk_mor_str_tac: 'a list -> thm -> tactic |
|
49504
df9b897fb254
renamed "iter"/"coiter" to "fold"/"unfold" (cf. Wadler)
blanchet
parents:
49501
diff
changeset
|
63 |
val mk_mor_unfold_tac: int -> thm -> thm list -> thm list -> thm list -> thm list -> thm list -> |
|
df9b897fb254
renamed "iter"/"coiter" to "fold"/"unfold" (cf. Wadler)
blanchet
parents:
49501
diff
changeset
|
64 |
thm list -> tactic |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
65 |
val mk_raw_coind_tac: thm -> thm -> thm -> thm -> thm -> thm -> thm -> thm -> thm -> thm list -> |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
66 |
thm list -> thm list -> thm -> thm list -> tactic |
| 55197 | 67 |
val mk_rel_coinduct_tac: Proof.context -> thm list -> thm list -> thm list -> thm list list -> |
68 |
thm list -> thm list -> tactic |
|
| 55644 | 69 |
val mk_rel_coinduct_coind_tac: Proof.context -> bool -> int -> thm -> int list -> thm list -> |
70 |
thm list -> thm list -> thm list list -> thm list -> thm list -> thm list -> tactic |
|
| 55197 | 71 |
val mk_rel_coinduct_ind_tac: Proof.context -> int -> int list -> thm list -> thm list list -> |
72 |
int -> thm -> tactic |
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
73 |
val mk_rv_last_tac: ctyp option list -> cterm option list -> thm list -> thm list -> tactic |
| 51798 | 74 |
val mk_sbis_lsbis_tac: Proof.context -> thm list -> thm -> thm -> tactic |
75 |
val mk_set_Lev_tac: Proof.context -> cterm option list -> thm list -> thm list -> thm list -> |
|
76 |
thm list -> thm list list -> tactic |
|
| 56113 | 77 |
val mk_set_bd_tac: thm -> thm -> tactic |
| 56179 | 78 |
val mk_set_Jset_incl_Jset_tac: int -> thm -> int -> tactic |
| 51798 | 79 |
val mk_set_image_Lev_tac: Proof.context -> cterm option list -> thm list -> thm list -> |
80 |
thm list -> thm list -> thm list list -> thm list list -> tactic |
|
| 56179 | 81 |
val mk_set_incl_Jset_tac: thm -> tactic |
|
54841
af71b753c459
express weak pullback property of bnfs only in terms of the relator
traytel
parents:
54793
diff
changeset
|
82 |
val mk_set_ge_tac: int -> thm -> thm list -> tactic |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
83 |
val mk_set_le_tac: int -> thm -> thm list -> thm list list -> tactic |
| 56113 | 84 |
val mk_set_map0_tac: thm -> tactic |
|
49504
df9b897fb254
renamed "iter"/"coiter" to "fold"/"unfold" (cf. Wadler)
blanchet
parents:
49501
diff
changeset
|
85 |
val mk_unfold_unique_mor_tac: thm list -> thm -> thm -> thm list -> tactic |
| 55197 | 86 |
val mk_unfold_transfer_tac: Proof.context -> int -> thm -> thm list -> thm list -> tactic |
87 |
val mk_wit_tac: Proof.context -> int -> thm list -> thm list -> thm list -> thm list -> tactic |
|
|
54841
af71b753c459
express weak pullback property of bnfs only in terms of the relator
traytel
parents:
54793
diff
changeset
|
88 |
val mk_le_rel_OO_tac: thm -> thm list -> thm list -> tactic |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
89 |
end; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
90 |
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
91 |
structure BNF_GFP_Tactics : BNF_GFP_TACTICS = |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
92 |
struct |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
93 |
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
94 |
open BNF_Tactics |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
95 |
open BNF_Util |
|
51850
106afdf5806c
renamed a few FP-related files, to make it clear that these are not the sum of LFP + GFP but rather shared basic libraries
blanchet
parents:
51798
diff
changeset
|
96 |
open BNF_FP_Util |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
97 |
open BNF_GFP_Util |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
98 |
|
| 55644 | 99 |
val fst_convol_fun_cong_sym = @{thm fst_convol[unfolded convol_def]} RS fun_cong RS sym;
|
|
49488
02eb07152998
use iffD* instead of (s)subst instantiated with identity; tuned antiquotations;
traytel
parents:
49463
diff
changeset
|
100 |
val list_inject_iffD1 = @{thm list.inject[THEN iffD1]};
|
| 49305 | 101 |
val nat_induct = @{thm nat_induct};
|
102 |
val o_apply_trans_sym = o_apply RS trans RS sym; |
|
103 |
val ord_eq_le_trans = @{thm ord_eq_le_trans};
|
|
104 |
val ordIso_ordLeq_trans = @{thm ordIso_ordLeq_trans};
|
|
| 55644 | 105 |
val snd_convol_fun_cong_sym = @{thm snd_convol[unfolded convol_def]} RS fun_cong RS sym;
|
|
57983
6edc3529bb4e
reordered some (co)datatype property names for more consistency
blanchet
parents:
57806
diff
changeset
|
106 |
val sum_case_cong_weak = @{thm sum.case_cong_weak};
|
| 49305 | 107 |
val trans_fun_cong_image_id_id_apply = @{thm trans[OF fun_cong[OF image_id] id_apply]};
|
|
52659
58b87aa4dc3b
eliminate duplicated theorems (thanks to "Auto solve_direct" in jEdit)
traytel
parents:
52635
diff
changeset
|
108 |
val Collect_splitD_set_mp = @{thm Collect_splitD[OF set_mp]};
|
|
58b87aa4dc3b
eliminate duplicated theorems (thanks to "Auto solve_direct" in jEdit)
traytel
parents:
52635
diff
changeset
|
109 |
val rev_bspec = Drule.rotate_prems 1 bspec; |
| 52749 | 110 |
val Un_cong = @{thm arg_cong2[of _ _ _ _ "op \<union>"]};
|
111 |
val converse_shift = @{thm converse_subset_swap} RS iffD1;
|
|
| 49305 | 112 |
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
113 |
fun mk_coalg_set_tac coalg_def = |
|
49488
02eb07152998
use iffD* instead of (s)subst instantiated with identity; tuned antiquotations;
traytel
parents:
49463
diff
changeset
|
114 |
dtac (coalg_def RS iffD1) 1 THEN |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
115 |
REPEAT_DETERM (etac conjE 1) THEN |
|
52659
58b87aa4dc3b
eliminate duplicated theorems (thanks to "Auto solve_direct" in jEdit)
traytel
parents:
52635
diff
changeset
|
116 |
EVERY' [dtac rev_bspec, atac] 1 THEN |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
117 |
REPEAT_DETERM (eresolve_tac [CollectE, conjE] 1) THEN atac 1; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
118 |
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
119 |
fun mk_mor_elim_tac mor_def = |
| 56114 | 120 |
(dtac (mor_def RS iffD1) THEN' |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
121 |
REPEAT o etac conjE THEN' |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
122 |
TRY o rtac @{thm image_subsetI} THEN'
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
123 |
etac bspec THEN' |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
124 |
atac) 1; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
125 |
|
| 53285 | 126 |
fun mk_mor_incl_tac mor_def map_ids = |
| 56114 | 127 |
(rtac (mor_def RS iffD2) THEN' |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
128 |
rtac conjI THEN' |
| 56114 | 129 |
CONJ_WRAP' (K (EVERY' [rtac ballI, etac set_mp, etac (id_apply RS @{thm ssubst_mem})]))
|
130 |
map_ids THEN' |
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
131 |
CONJ_WRAP' (fn thm => |
| 56114 | 132 |
(EVERY' [rtac ballI, rtac (thm RS trans), rtac sym, rtac (id_apply RS arg_cong)])) map_ids) 1; |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
133 |
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
134 |
fun mk_mor_comp_tac mor_def mor_images morEs map_comp_ids = |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
135 |
let |
| 56114 | 136 |
fun fbetw_tac image = EVERY' [rtac ballI, rtac (o_apply RS @{thm ssubst_mem}), etac image,
|
137 |
etac image, atac]; |
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
138 |
fun mor_tac ((mor_image, morE), map_comp_id) = |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
139 |
EVERY' [rtac ballI, stac o_apply, rtac trans, rtac (map_comp_id RS sym), rtac trans, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
140 |
etac (morE RS arg_cong), atac, etac morE, etac mor_image, atac]; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
141 |
in |
| 56114 | 142 |
(rtac (mor_def RS iffD2) THEN' rtac conjI THEN' |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
143 |
CONJ_WRAP' fbetw_tac mor_images THEN' |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
144 |
CONJ_WRAP' mor_tac ((mor_images ~~ morEs) ~~ map_comp_ids)) 1 |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
145 |
end; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
146 |
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
147 |
fun mk_mor_UNIV_tac morEs mor_def = |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
148 |
let |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
149 |
val n = length morEs; |
| 55990 | 150 |
fun mor_tac morE = EVERY' [rtac @{thm ext}, rtac trans, rtac o_apply, rtac trans, etac morE,
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
151 |
rtac UNIV_I, rtac sym, rtac o_apply]; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
152 |
in |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
153 |
EVERY' [rtac iffI, CONJ_WRAP' mor_tac morEs, |
| 56114 | 154 |
rtac (mor_def RS iffD2), rtac conjI, CONJ_WRAP' (K (rtac ballI THEN' rtac UNIV_I)) morEs, |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
155 |
CONJ_WRAP' (fn i => |
|
52659
58b87aa4dc3b
eliminate duplicated theorems (thanks to "Auto solve_direct" in jEdit)
traytel
parents:
52635
diff
changeset
|
156 |
EVERY' [dtac (mk_conjunctN n i), rtac ballI, etac @{thm comp_eq_dest}]) (1 upto n)] 1
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
157 |
end; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
158 |
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
159 |
fun mk_mor_str_tac ks mor_UNIV = |
| 56114 | 160 |
(rtac (mor_UNIV RS iffD2) THEN' CONJ_WRAP' (K (rtac refl)) ks) 1; |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
161 |
|
|
55414
eab03e9cee8a
renamed '{prod,sum,bool,unit}_case' to 'case_...'
blanchet
parents:
55393
diff
changeset
|
162 |
fun mk_mor_case_sum_tac ks mor_UNIV = |
| 56114 | 163 |
(rtac (mor_UNIV RS iffD2) THEN' CONJ_WRAP' (K (rtac @{thm case_sum_o_inj(1)[symmetric]})) ks) 1;
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
164 |
|
| 56179 | 165 |
fun mk_set_incl_Jset_tac rec_Suc = |
| 56113 | 166 |
EVERY' (map rtac [@{thm SUP_upper2}, UNIV_I, @{thm ord_le_eq_trans}, @{thm Un_upper1}, sym,
|
167 |
rec_Suc]) 1; |
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
168 |
|
| 56179 | 169 |
fun mk_set_Jset_incl_Jset_tac n rec_Suc i = |
| 56113 | 170 |
EVERY' (map rtac [@{thm UN_least}, subsetI, @{thm UN_I}, UNIV_I, set_mp, equalityD2, rec_Suc,
|
171 |
UnI2, mk_UnIN n i] @ [etac @{thm UN_I}, atac]) 1;
|
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
172 |
|
| 56113 | 173 |
fun mk_col_minimal_tac ctxt m cts rec_0s rec_Sucs = |
| 49305 | 174 |
EVERY' [rtac (Drule.instantiate' [] cts nat_induct), |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
175 |
REPEAT_DETERM o rtac allI, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
176 |
CONJ_WRAP' (fn thm => EVERY' |
| 49305 | 177 |
[rtac ord_eq_le_trans, rtac thm, rtac @{thm empty_subsetI}]) rec_0s,
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
178 |
REPEAT_DETERM o rtac allI, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
179 |
CONJ_WRAP' (fn rec_Suc => EVERY' |
| 49305 | 180 |
[rtac ord_eq_le_trans, rtac rec_Suc, |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
181 |
if m = 0 then K all_tac |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
182 |
else (rtac @{thm Un_least} THEN' Goal.assume_rule_tac ctxt),
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
183 |
CONJ_WRAP_GEN' (rtac (Thm.permute_prems 0 1 @{thm Un_least}))
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
184 |
(K (EVERY' [rtac @{thm UN_least}, REPEAT_DETERM o eresolve_tac [allE, conjE],
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
185 |
rtac subset_trans, atac, Goal.assume_rule_tac ctxt])) rec_0s]) |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
186 |
rec_Sucs] 1; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
187 |
|
| 56179 | 188 |
fun mk_Jset_minimal_tac ctxt n col_minimal = |
| 56113 | 189 |
(CONJ_WRAP' (K (EVERY' [rtac @{thm UN_least}, rtac rev_mp, rtac col_minimal,
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
190 |
EVERY' (replicate ((n + 1) * n) (Goal.assume_rule_tac ctxt)), rtac impI, |
| 56113 | 191 |
REPEAT_DETERM o eresolve_tac [allE, conjE], atac])) (1 upto n)) 1 |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
192 |
|
| 56113 | 193 |
fun mk_mor_col_tac m n cts j rec_0s rec_Sucs morEs set_map0ss coalg_setss = |
| 49305 | 194 |
EVERY' [rtac (Drule.instantiate' [] cts nat_induct), |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
195 |
REPEAT_DETERM o rtac allI, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
196 |
CONJ_WRAP' (fn thm => EVERY' (map rtac [impI, thm RS trans, thm RS sym])) rec_0s, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
197 |
REPEAT_DETERM o rtac allI, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
198 |
CONJ_WRAP' |
| 53289 | 199 |
(fn (rec_Suc, (morE, ((passive_set_map0s, active_set_map0s), coalg_sets))) => |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
200 |
EVERY' [rtac impI, rtac (rec_Suc RS trans), rtac (rec_Suc RS trans RS sym), |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
201 |
if m = 0 then K all_tac |
| 55990 | 202 |
else EVERY' [rtac Un_cong, rtac @{thm box_equals},
|
| 53289 | 203 |
rtac (nth passive_set_map0s (j - 1) RS sym), |
| 49305 | 204 |
rtac trans_fun_cong_image_id_id_apply, etac (morE RS arg_cong), atac], |
|
52659
58b87aa4dc3b
eliminate duplicated theorems (thanks to "Auto solve_direct" in jEdit)
traytel
parents:
52635
diff
changeset
|
205 |
CONJ_WRAP_GEN' (rtac (Thm.permute_prems 0 1 Un_cong)) |
| 53289 | 206 |
(fn (i, (set_map0, coalg_set)) => |
|
56248
67dc9549fa15
generalized and strengthened cong rules on compound operators, similar to 1ed737a98198
haftmann
parents:
56179
diff
changeset
|
207 |
EVERY' [rtac sym, rtac trans, rtac (refl RSN (2, @{thm SUP_cong})),
|
| 53289 | 208 |
etac (morE RS sym RS arg_cong RS trans), atac, rtac set_map0, |
|
56248
67dc9549fa15
generalized and strengthened cong rules on compound operators, similar to 1ed737a98198
haftmann
parents:
56179
diff
changeset
|
209 |
rtac (@{thm UN_simps(10)} RS trans), rtac (refl RS @{thm SUP_cong}),
|
| 49305 | 210 |
ftac coalg_set, atac, dtac set_mp, atac, rtac mp, rtac (mk_conjunctN n i), |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
211 |
REPEAT_DETERM o etac allE, atac, atac]) |
| 53289 | 212 |
(rev ((1 upto n) ~~ (active_set_map0s ~~ coalg_sets)))]) |
213 |
(rec_Sucs ~~ (morEs ~~ (map (chop m) set_map0ss ~~ map (drop m) coalg_setss)))] 1; |
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
214 |
|
| 56017 | 215 |
fun mk_bis_rel_tac m bis_def in_rels map_comp0s map_cong0s set_map0ss = |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
216 |
let |
| 56017 | 217 |
val n = length in_rels; |
218 |
val thms = ((1 upto n) ~~ map_comp0s ~~ map_cong0s ~~ set_map0ss ~~ in_rels); |
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
219 |
|
| 56017 | 220 |
fun mk_if_tac ((((i, map_comp0), map_cong0), set_map0s), in_rel) = |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
221 |
EVERY' [rtac allI, rtac allI, rtac impI, dtac (mk_conjunctN n i), |
| 56017 | 222 |
etac allE, etac allE, etac impE, atac, etac bexE, |
223 |
REPEAT_DETERM o eresolve_tac [CollectE, conjE], |
|
224 |
rtac (in_rel RS iffD2), rtac exI, rtac (Drule.rotate_prems 1 conjI), |
|
225 |
CONJ_WRAP' (fn thm => EVERY' [rtac trans, rtac trans, rtac map_comp0, rtac map_cong0, |
|
226 |
REPEAT_DETERM_N m o rtac thm, REPEAT_DETERM_N n o rtac (@{thm comp_id} RS fun_cong),
|
|
227 |
atac]) |
|
228 |
@{thms fst_diag_id snd_diag_id},
|
|
229 |
rtac CollectI, |
|
230 |
CONJ_WRAP' (fn (i, thm) => |
|
231 |
if i <= m |
|
232 |
then EVERY' [rtac ord_eq_le_trans, rtac thm, rtac subset_trans, |
|
233 |
etac @{thm image_mono}, rtac @{thm image_subsetI}, rtac CollectI,
|
|
234 |
rtac @{thm case_prodI}, rtac refl]
|
|
235 |
else EVERY' [rtac ord_eq_le_trans, rtac trans, rtac thm, |
|
236 |
rtac trans_fun_cong_image_id_id_apply, etac @{thm Collect_split_in_rel_leI}])
|
|
237 |
(1 upto (m + n) ~~ set_map0s)]; |
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
238 |
|
| 56017 | 239 |
fun mk_only_if_tac ((((i, map_comp0), map_cong0), set_map0s), in_rel) = |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
240 |
EVERY' [dtac (mk_conjunctN n i), rtac allI, rtac allI, rtac impI, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
241 |
etac allE, etac allE, etac impE, atac, |
| 56017 | 242 |
dtac (in_rel RS @{thm iffD1}),
|
|
51893
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51850
diff
changeset
|
243 |
REPEAT_DETERM o eresolve_tac ([CollectE, conjE, exE] @ |
| 56017 | 244 |
@{thms CollectE Collect_split_in_rel_leE}),
|
| 53287 | 245 |
rtac bexI, rtac conjI, rtac trans, rtac map_comp0, rtac trans, rtac map_cong0, |
| 55067 | 246 |
REPEAT_DETERM_N m o rtac (@{thm id_comp} RS fun_cong),
|
247 |
REPEAT_DETERM_N n o rtac (@{thm comp_id} RS fun_cong),
|
|
| 53287 | 248 |
atac, rtac trans, rtac map_comp0, rtac trans, rtac map_cong0, |
| 55067 | 249 |
REPEAT_DETERM_N m o rtac (@{thm id_comp} RS fun_cong),
|
250 |
REPEAT_DETERM_N n o rtac (@{thm comp_id} RS fun_cong),
|
|
|
51761
4c9f08836d87
renamed "map_cong" axiom to "map_cong0" in preparation for real "map_cong"
blanchet
parents:
51739
diff
changeset
|
251 |
rtac trans, rtac map_cong0, |
|
55541
fd9ea8ae28f6
syntactic simplifications of internal (co)datatype constructions
traytel
parents:
55414
diff
changeset
|
252 |
REPEAT_DETERM_N m o EVERY' [rtac @{thm Collect_splitD}, etac set_mp, atac],
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
253 |
REPEAT_DETERM_N n o rtac refl, |
|
51893
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51850
diff
changeset
|
254 |
atac, rtac CollectI, |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
255 |
CONJ_WRAP' (fn (i, thm) => |
|
55541
fd9ea8ae28f6
syntactic simplifications of internal (co)datatype constructions
traytel
parents:
55414
diff
changeset
|
256 |
if i <= m then rtac subset_UNIV |
| 49305 | 257 |
else EVERY' [rtac ord_eq_le_trans, rtac trans, rtac thm, |
258 |
rtac trans_fun_cong_image_id_id_apply, atac]) |
|
| 53289 | 259 |
(1 upto (m + n) ~~ set_map0s)]; |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
260 |
in |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
261 |
EVERY' [rtac (bis_def RS trans), |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
262 |
rtac iffI, etac conjE, etac conjI, CONJ_WRAP' mk_if_tac thms, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
263 |
etac conjE, etac conjI, CONJ_WRAP' mk_only_if_tac thms] 1 |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
264 |
end; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
265 |
|
|
51893
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51850
diff
changeset
|
266 |
fun mk_bis_converse_tac m bis_rel rel_congs rel_converseps = |
| 56114 | 267 |
EVERY' [rtac (bis_rel RS iffD2), dtac (bis_rel RS iffD1), |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
268 |
REPEAT_DETERM o etac conjE, rtac conjI, |
| 52749 | 269 |
CONJ_WRAP' (K (EVERY' [rtac converse_shift, etac subset_trans, |
|
51893
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51850
diff
changeset
|
270 |
rtac equalityD2, rtac @{thm converse_Times}])) rel_congs,
|
|
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51850
diff
changeset
|
271 |
CONJ_WRAP' (fn (rel_cong, rel_conversep) => |
|
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51850
diff
changeset
|
272 |
EVERY' [rtac allI, rtac allI, rtac impI, |
|
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51850
diff
changeset
|
273 |
rtac (rel_cong RS @{thm eq_refl} RS @{thm predicate2D}),
|
|
55541
fd9ea8ae28f6
syntactic simplifications of internal (co)datatype constructions
traytel
parents:
55414
diff
changeset
|
274 |
REPEAT_DETERM_N m o rtac @{thm conversep_eq},
|
|
51893
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51850
diff
changeset
|
275 |
REPEAT_DETERM_N (length rel_congs) o rtac @{thm conversep_in_rel},
|
|
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51850
diff
changeset
|
276 |
rtac (rel_conversep RS sym RS @{thm eq_refl} RS @{thm predicate2D}),
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
277 |
REPEAT_DETERM o etac allE, |
|
51893
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51850
diff
changeset
|
278 |
rtac @{thm conversepI}, etac mp, etac @{thm converseD}]) (rel_congs ~~ rel_converseps)] 1;
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
279 |
|
| 57726 | 280 |
fun mk_bis_O_tac ctxt m bis_rel rel_congs le_rel_OOs = |
| 56114 | 281 |
EVERY' [rtac (bis_rel RS iffD2), REPEAT_DETERM o dtac (bis_rel RS iffD1), |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
282 |
REPEAT_DETERM o etac conjE, rtac conjI, |
|
51893
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51850
diff
changeset
|
283 |
CONJ_WRAP' (K (EVERY' [etac @{thm relcomp_subset_Sigma}, atac])) rel_congs,
|
| 57726 | 284 |
CONJ_WRAP' (fn (rel_cong, le_rel_OO) => |
|
51893
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51850
diff
changeset
|
285 |
EVERY' [rtac allI, rtac allI, rtac impI, |
|
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51850
diff
changeset
|
286 |
rtac (rel_cong RS @{thm eq_refl} RS @{thm predicate2D}),
|
|
55541
fd9ea8ae28f6
syntactic simplifications of internal (co)datatype constructions
traytel
parents:
55414
diff
changeset
|
287 |
REPEAT_DETERM_N m o rtac @{thm eq_OO},
|
|
51893
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51850
diff
changeset
|
288 |
REPEAT_DETERM_N (length rel_congs) o rtac @{thm relcompp_in_rel},
|
| 57726 | 289 |
rtac (le_rel_OO RS @{thm predicate2D}),
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
290 |
etac @{thm relcompE},
|
| 56765 | 291 |
REPEAT_DETERM o dtac prod_injectD, |
| 51798 | 292 |
etac conjE, hyp_subst_tac ctxt, |
|
51893
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51850
diff
changeset
|
293 |
REPEAT_DETERM o etac allE, rtac @{thm relcomppI},
|
| 57726 | 294 |
etac mp, atac, etac mp, atac]) (rel_congs ~~ le_rel_OOs)] 1; |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
295 |
|
| 55197 | 296 |
fun mk_bis_Gr_tac ctxt bis_rel rel_Grps mor_images morEs coalg_ins = |
|
55541
fd9ea8ae28f6
syntactic simplifications of internal (co)datatype constructions
traytel
parents:
55414
diff
changeset
|
297 |
unfold_thms_tac ctxt (bis_rel :: @{thm eq_alt} :: @{thm in_rel_Gr} :: rel_Grps) THEN
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
298 |
EVERY' [rtac conjI, |
| 56114 | 299 |
CONJ_WRAP' (fn thm => rtac (@{thm Gr_incl} RS iffD2) THEN' etac thm) mor_images,
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
300 |
CONJ_WRAP' (fn (coalg_in, morE) => |
|
51893
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51850
diff
changeset
|
301 |
EVERY' [rtac allI, rtac allI, rtac impI, rtac @{thm GrpI}, etac (morE RS trans),
|
|
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51850
diff
changeset
|
302 |
etac @{thm GrD1}, etac (@{thm GrD2} RS arg_cong), etac coalg_in, etac @{thm GrD1}])
|
|
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51850
diff
changeset
|
303 |
(coalg_ins ~~ morEs)] 1; |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
304 |
|
| 55197 | 305 |
fun mk_bis_Union_tac ctxt bis_def in_monos = |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
306 |
let |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
307 |
val n = length in_monos; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
308 |
val ks = 1 upto n; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
309 |
in |
|
49504
df9b897fb254
renamed "iter"/"coiter" to "fold"/"unfold" (cf. Wadler)
blanchet
parents:
49501
diff
changeset
|
310 |
unfold_thms_tac ctxt [bis_def] THEN |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
311 |
EVERY' [rtac conjI, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
312 |
CONJ_WRAP' (fn i => |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
313 |
EVERY' [rtac @{thm UN_least}, dtac bspec, atac,
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
314 |
dtac conjunct1, etac (mk_conjunctN n i)]) ks, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
315 |
CONJ_WRAP' (fn (i, in_mono) => |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
316 |
EVERY' [rtac allI, rtac allI, rtac impI, etac @{thm UN_E}, dtac bspec, atac,
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
317 |
dtac conjunct2, dtac (mk_conjunctN n i), etac allE, etac allE, dtac mp, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
318 |
atac, etac bexE, rtac bexI, atac, rtac in_mono, |
|
52659
58b87aa4dc3b
eliminate duplicated theorems (thanks to "Auto solve_direct" in jEdit)
traytel
parents:
52635
diff
changeset
|
319 |
REPEAT_DETERM_N n o etac @{thm SUP_upper2[OF _ subset_refl]},
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
320 |
atac]) (ks ~~ in_monos)] 1 |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
321 |
end; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
322 |
|
| 51798 | 323 |
fun mk_sbis_lsbis_tac ctxt lsbis_defs bis_Union bis_cong = |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
324 |
let |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
325 |
val n = length lsbis_defs; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
326 |
in |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
327 |
EVERY' [rtac (Thm.permute_prems 0 1 bis_cong), EVERY' (map rtac lsbis_defs), |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
328 |
rtac bis_Union, rtac ballI, REPEAT_DETERM o eresolve_tac [CollectE, conjE, exE], |
| 51798 | 329 |
hyp_subst_tac ctxt, etac bis_cong, EVERY' (map (rtac o mk_nth_conv n) (1 upto n))] 1 |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
330 |
end; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
331 |
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
332 |
fun mk_incl_lsbis_tac n i lsbis_def = |
|
52659
58b87aa4dc3b
eliminate duplicated theorems (thanks to "Auto solve_direct" in jEdit)
traytel
parents:
52635
diff
changeset
|
333 |
EVERY' [rtac @{thm xt1(3)}, rtac lsbis_def, rtac @{thm SUP_upper2}, rtac CollectI,
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
334 |
REPEAT_DETERM_N n o rtac exI, rtac conjI, rtac refl, atac, rtac equalityD2, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
335 |
rtac (mk_nth_conv n i)] 1; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
336 |
|
| 51447 | 337 |
fun mk_equiv_lsbis_tac sbis_lsbis lsbis_incl incl_lsbis bis_Id_on bis_converse bis_O = |
|
49488
02eb07152998
use iffD* instead of (s)subst instantiated with identity; tuned antiquotations;
traytel
parents:
49463
diff
changeset
|
338 |
EVERY' [rtac (@{thm equiv_def} RS iffD2),
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
339 |
|
|
49488
02eb07152998
use iffD* instead of (s)subst instantiated with identity; tuned antiquotations;
traytel
parents:
49463
diff
changeset
|
340 |
rtac conjI, rtac (@{thm refl_on_def} RS iffD2),
|
| 49305 | 341 |
rtac conjI, rtac lsbis_incl, rtac ballI, rtac set_mp, |
| 51447 | 342 |
rtac incl_lsbis, rtac bis_Id_on, atac, etac @{thm Id_onI},
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
343 |
|
|
49488
02eb07152998
use iffD* instead of (s)subst instantiated with identity; tuned antiquotations;
traytel
parents:
49463
diff
changeset
|
344 |
rtac conjI, rtac (@{thm sym_def} RS iffD2),
|
| 49305 | 345 |
rtac allI, rtac allI, rtac impI, rtac set_mp, |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
346 |
rtac incl_lsbis, rtac bis_converse, rtac sbis_lsbis, etac @{thm converseI},
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
347 |
|
|
49488
02eb07152998
use iffD* instead of (s)subst instantiated with identity; tuned antiquotations;
traytel
parents:
49463
diff
changeset
|
348 |
rtac (@{thm trans_def} RS iffD2),
|
| 49305 | 349 |
rtac allI, rtac allI, rtac allI, rtac impI, rtac impI, rtac set_mp, |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
350 |
rtac incl_lsbis, rtac bis_O, rtac sbis_lsbis, rtac sbis_lsbis, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
351 |
etac @{thm relcompI}, atac] 1;
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
352 |
|
| 55197 | 353 |
fun mk_coalgT_tac ctxt m defs strT_defs set_map0ss = |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
354 |
let |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
355 |
val n = length strT_defs; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
356 |
val ks = 1 upto n; |
|
55541
fd9ea8ae28f6
syntactic simplifications of internal (co)datatype constructions
traytel
parents:
55414
diff
changeset
|
357 |
fun coalg_tac (i, (active_sets, def)) = |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
358 |
EVERY' [rtac ballI, REPEAT_DETERM o eresolve_tac [CollectE, exE, conjE], |
| 51798 | 359 |
hyp_subst_tac ctxt, rtac (def RS trans RS @{thm ssubst_mem}), etac (arg_cong RS trans),
|
|
55414
eab03e9cee8a
renamed '{prod,sum,bool,unit}_case' to 'case_...'
blanchet
parents:
55393
diff
changeset
|
360 |
rtac (mk_sum_caseN n i), rtac CollectI, |
|
55541
fd9ea8ae28f6
syntactic simplifications of internal (co)datatype constructions
traytel
parents:
55414
diff
changeset
|
361 |
REPEAT_DETERM_N m o EVERY' [rtac conjI, rtac subset_UNIV], |
| 49305 | 362 |
CONJ_WRAP' (fn (i, thm) => EVERY' [rtac (thm RS ord_eq_le_trans), |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
363 |
rtac @{thm image_subsetI}, rtac CollectI, rtac exI, rtac exI, rtac conjI, rtac refl,
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
364 |
rtac conjI, |
| 49305 | 365 |
rtac conjI, etac @{thm empty_Shift}, dtac set_rev_mp,
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
366 |
etac equalityD1, etac CollectD, |
|
55577
a6c2379078c8
simplifications of internal codatatype construction
traytel
parents:
55541
diff
changeset
|
367 |
rtac ballI, |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
368 |
CONJ_WRAP' (fn i => EVERY' [rtac ballI, etac CollectE, dtac @{thm ShiftD},
|
|
55581
d1c228753d76
another simplification of internal codatatype construction
traytel
parents:
55577
diff
changeset
|
369 |
dtac bspec, etac thin_rl, atac, dtac (mk_conjunctN n i), |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
370 |
dtac bspec, rtac CollectI, etac @{thm set_mp[OF equalityD1[OF Succ_Shift]]},
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
371 |
REPEAT_DETERM o eresolve_tac [exE, conjE], rtac exI, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
372 |
rtac conjI, rtac (@{thm shift_def} RS fun_cong RS trans),
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
373 |
rtac (@{thm append_Cons} RS sym RS arg_cong RS trans), atac,
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
374 |
CONJ_WRAP' (K (EVERY' [etac trans, rtac @{thm Collect_cong},
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
375 |
rtac @{thm eqset_imp_iff}, rtac sym, rtac trans, rtac @{thm Succ_Shift},
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
376 |
rtac (@{thm append_Cons} RS sym RS arg_cong)])) ks]) ks,
|
|
55581
d1c228753d76
another simplification of internal codatatype construction
traytel
parents:
55577
diff
changeset
|
377 |
dtac bspec, atac, dtac (mk_conjunctN n i), dtac bspec, |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
378 |
etac @{thm set_mp[OF equalityD1]}, atac,
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
379 |
REPEAT_DETERM o eresolve_tac [exE, conjE], rtac exI, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
380 |
rtac conjI, rtac (@{thm shift_def} RS fun_cong RS trans),
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
381 |
etac (@{thm append_Nil} RS sym RS arg_cong RS trans),
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
382 |
REPEAT_DETERM_N m o (rtac conjI THEN' atac), |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
383 |
CONJ_WRAP' (K (EVERY' [etac trans, rtac @{thm Collect_cong},
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
384 |
rtac @{thm eqset_imp_iff}, rtac sym, rtac trans, rtac @{thm Succ_Shift},
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
385 |
rtac (@{thm append_Nil} RS sym RS arg_cong)])) ks]) (ks ~~ active_sets)];
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
386 |
in |
|
49504
df9b897fb254
renamed "iter"/"coiter" to "fold"/"unfold" (cf. Wadler)
blanchet
parents:
49501
diff
changeset
|
387 |
unfold_thms_tac ctxt defs THEN |
|
55541
fd9ea8ae28f6
syntactic simplifications of internal (co)datatype constructions
traytel
parents:
55414
diff
changeset
|
388 |
CONJ_WRAP' coalg_tac (ks ~~ (map (drop m) set_map0ss ~~ strT_defs)) 1 |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
389 |
end; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
390 |
|
| 51798 | 391 |
fun mk_length_Lev_tac ctxt cts Lev_0s Lev_Sucs = |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
392 |
let |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
393 |
val n = length Lev_0s; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
394 |
val ks = n downto 1; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
395 |
in |
| 49305 | 396 |
EVERY' [rtac (Drule.instantiate' [] cts nat_induct), |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
397 |
REPEAT_DETERM o rtac allI, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
398 |
CONJ_WRAP' (fn Lev_0 => |
| 49305 | 399 |
EVERY' [rtac impI, dtac (Lev_0 RS equalityD1 RS set_mp), |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
400 |
etac @{thm singletonE}, etac ssubst, rtac @{thm list.size(3)}]) Lev_0s,
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
401 |
REPEAT_DETERM o rtac allI, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
402 |
CONJ_WRAP' (fn Lev_Suc => |
| 49305 | 403 |
EVERY' [rtac impI, dtac (Lev_Suc RS equalityD1 RS set_mp), |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
404 |
CONJ_WRAP_GEN' (etac (Thm.permute_prems 1 1 UnE)) |
| 51798 | 405 |
(fn i => |
406 |
EVERY' [REPEAT_DETERM o eresolve_tac [CollectE, exE, conjE], hyp_subst_tac ctxt, |
|
407 |
rtac trans, rtac @{thm length_Cons}, rtac @{thm arg_cong[of _ _ Suc]},
|
|
408 |
REPEAT_DETERM o etac allE, dtac (mk_conjunctN n i), etac mp, atac]) ks]) |
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
409 |
Lev_Sucs] 1 |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
410 |
end; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
411 |
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
412 |
fun mk_length_Lev'_tac length_Lev = |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
413 |
EVERY' [ftac length_Lev, etac ssubst, atac] 1; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
414 |
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
415 |
fun mk_rv_last_tac cTs cts rv_Nils rv_Conss = |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
416 |
let |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
417 |
val n = length rv_Nils; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
418 |
val ks = 1 upto n; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
419 |
in |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
420 |
EVERY' [rtac (Drule.instantiate' cTs cts @{thm list.induct}),
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
421 |
REPEAT_DETERM o rtac allI, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
422 |
CONJ_WRAP' (fn rv_Cons => |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
423 |
CONJ_WRAP' (fn (i, rv_Nil) => (EVERY' [rtac exI, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
424 |
rtac (@{thm append_Nil} RS arg_cong RS trans),
|
| 55606 | 425 |
rtac (rv_Cons RS trans), rtac (mk_sum_caseN n i RS trans), rtac rv_Nil])) |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
426 |
(ks ~~ rv_Nils)) |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
427 |
rv_Conss, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
428 |
REPEAT_DETERM o rtac allI, rtac (mk_sumEN n), |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
429 |
EVERY' (map (fn i => |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
430 |
CONJ_WRAP' (fn rv_Cons => EVERY' [REPEAT_DETERM o etac allE, dtac (mk_conjunctN n i), |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
431 |
CONJ_WRAP' (fn i' => EVERY' [dtac (mk_conjunctN n i'), etac exE, rtac exI, |
| 55606 | 432 |
rtac (@{thm append_Cons} RS arg_cong RS trans), rtac (rv_Cons RS trans),
|
|
57983
6edc3529bb4e
reordered some (co)datatype property names for more consistency
blanchet
parents:
57806
diff
changeset
|
433 |
if n = 1 then K all_tac else etac (sum_case_cong_weak RS trans), |
| 55606 | 434 |
rtac (mk_sum_caseN n i RS trans), atac]) |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
435 |
ks]) |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
436 |
rv_Conss) |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
437 |
ks)] 1 |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
438 |
end; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
439 |
|
| 51798 | 440 |
fun mk_set_Lev_tac ctxt cts Lev_0s Lev_Sucs rv_Nils rv_Conss from_to_sbdss = |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
441 |
let |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
442 |
val n = length Lev_0s; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
443 |
val ks = 1 upto n; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
444 |
in |
| 49305 | 445 |
EVERY' [rtac (Drule.instantiate' [] cts nat_induct), |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
446 |
REPEAT_DETERM o rtac allI, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
447 |
CONJ_WRAP' (fn ((i, (Lev_0, Lev_Suc)), rv_Nil) => |
| 49305 | 448 |
EVERY' [rtac impI, dtac (Lev_0 RS equalityD1 RS set_mp), |
| 51798 | 449 |
etac @{thm singletonE}, hyp_subst_tac ctxt,
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
450 |
CONJ_WRAP' (fn i' => rtac impI THEN' dtac (sym RS trans) THEN' rtac rv_Nil THEN' |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
451 |
(if i = i' |
| 51798 | 452 |
then EVERY' [dtac (mk_InN_inject n i), hyp_subst_tac ctxt, |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
453 |
CONJ_WRAP' (fn (i'', Lev_0'') => |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
454 |
EVERY' [rtac impI, rtac @{thm ssubst_mem[OF append_Nil]},
|
| 49366 | 455 |
rtac (Lev_Suc RS equalityD2 RS set_mp), rtac (mk_UnIN n i''), |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
456 |
rtac CollectI, REPEAT_DETERM o rtac exI, rtac conjI, rtac refl, |
| 49305 | 457 |
etac conjI, rtac (Lev_0'' RS equalityD2 RS set_mp), |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
458 |
rtac @{thm singletonI}])
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
459 |
(ks ~~ Lev_0s)] |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
460 |
else etac (mk_InN_not_InM i' i RS notE))) |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
461 |
ks]) |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
462 |
((ks ~~ (Lev_0s ~~ Lev_Sucs)) ~~ rv_Nils), |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
463 |
REPEAT_DETERM o rtac allI, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
464 |
CONJ_WRAP' (fn ((Lev_Suc, rv_Cons), from_to_sbds) => |
| 49305 | 465 |
EVERY' [rtac impI, dtac (Lev_Suc RS equalityD1 RS set_mp), |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
466 |
CONJ_WRAP_GEN' (etac (Thm.permute_prems 1 1 UnE)) |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
467 |
(fn (i, from_to_sbd) => |
| 51798 | 468 |
EVERY' [REPEAT_DETERM o eresolve_tac [CollectE, exE, conjE], hyp_subst_tac ctxt, |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
469 |
CONJ_WRAP' (fn i' => rtac impI THEN' |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
470 |
CONJ_WRAP' (fn i'' => |
| 49305 | 471 |
EVERY' [rtac impI, rtac (Lev_Suc RS equalityD2 RS set_mp), |
| 49366 | 472 |
rtac @{thm ssubst_mem[OF append_Cons]}, rtac (mk_UnIN n i),
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
473 |
rtac CollectI, REPEAT_DETERM o rtac exI, rtac conjI, rtac refl, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
474 |
rtac conjI, atac, dtac (sym RS trans RS sym), |
|
55414
eab03e9cee8a
renamed '{prod,sum,bool,unit}_case' to 'case_...'
blanchet
parents:
55393
diff
changeset
|
475 |
rtac (rv_Cons RS trans), rtac (mk_sum_caseN n i RS trans), |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
476 |
etac (from_to_sbd RS arg_cong), REPEAT_DETERM o etac allE, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
477 |
dtac (mk_conjunctN n i), dtac mp, atac, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
478 |
dtac (mk_conjunctN n i'), dtac mp, atac, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
479 |
dtac (mk_conjunctN n i''), etac mp, atac]) |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
480 |
ks) |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
481 |
ks]) |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
482 |
(rev (ks ~~ from_to_sbds))]) |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
483 |
((Lev_Sucs ~~ rv_Conss) ~~ from_to_sbdss)] 1 |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
484 |
end; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
485 |
|
| 51798 | 486 |
fun mk_set_image_Lev_tac ctxt cts Lev_0s Lev_Sucs rv_Nils rv_Conss from_to_sbdss to_sbd_injss = |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
487 |
let |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
488 |
val n = length Lev_0s; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
489 |
val ks = 1 upto n; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
490 |
in |
| 49305 | 491 |
EVERY' [rtac (Drule.instantiate' [] cts nat_induct), |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
492 |
REPEAT_DETERM o rtac allI, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
493 |
CONJ_WRAP' (fn ((i, (Lev_0, Lev_Suc)), rv_Nil) => |
| 49305 | 494 |
EVERY' [rtac impI, dtac (Lev_0 RS equalityD1 RS set_mp), |
| 51798 | 495 |
etac @{thm singletonE}, hyp_subst_tac ctxt,
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
496 |
CONJ_WRAP' (fn i' => rtac impI THEN' |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
497 |
CONJ_WRAP' (fn i'' => rtac impI THEN' dtac (sym RS trans) THEN' rtac rv_Nil THEN' |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
498 |
(if i = i'' |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
499 |
then EVERY' [dtac @{thm ssubst_mem[OF sym[OF append_Nil]]},
|
| 49305 | 500 |
dtac (Lev_Suc RS equalityD1 RS set_mp), dtac (mk_InN_inject n i), |
| 51798 | 501 |
hyp_subst_tac ctxt, |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
502 |
CONJ_WRAP_GEN' (etac (Thm.permute_prems 1 1 UnE)) |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
503 |
(fn k => REPEAT_DETERM o eresolve_tac [CollectE, exE, conjE] THEN' |
|
49488
02eb07152998
use iffD* instead of (s)subst instantiated with identity; tuned antiquotations;
traytel
parents:
49463
diff
changeset
|
504 |
dtac list_inject_iffD1 THEN' etac conjE THEN' |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
505 |
(if k = i' |
| 51798 | 506 |
then EVERY' [dtac (mk_InN_inject n k), hyp_subst_tac ctxt, etac imageI] |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
507 |
else etac (mk_InN_not_InM i' k RS notE))) |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
508 |
(rev ks)] |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
509 |
else etac (mk_InN_not_InM i'' i RS notE))) |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
510 |
ks) |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
511 |
ks]) |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
512 |
((ks ~~ (Lev_0s ~~ Lev_Sucs)) ~~ rv_Nils), |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
513 |
REPEAT_DETERM o rtac allI, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
514 |
CONJ_WRAP' (fn ((Lev_Suc, rv_Cons), (from_to_sbds, to_sbd_injs)) => |
| 49305 | 515 |
EVERY' [rtac impI, dtac (Lev_Suc RS equalityD1 RS set_mp), |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
516 |
CONJ_WRAP_GEN' (etac (Thm.permute_prems 1 1 UnE)) |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
517 |
(fn (i, (from_to_sbd, to_sbd_inj)) => |
| 51798 | 518 |
REPEAT_DETERM o eresolve_tac [CollectE, exE, conjE] THEN' hyp_subst_tac ctxt THEN' |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
519 |
CONJ_WRAP' (fn i' => rtac impI THEN' |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
520 |
dtac @{thm ssubst_mem[OF sym[OF append_Cons]]} THEN'
|
| 49305 | 521 |
dtac (Lev_Suc RS equalityD1 RS set_mp) THEN' |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
522 |
CONJ_WRAP_GEN' (etac (Thm.permute_prems 1 1 UnE)) (fn k => |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
523 |
REPEAT_DETERM o eresolve_tac [CollectE, exE, conjE] THEN' |
|
49488
02eb07152998
use iffD* instead of (s)subst instantiated with identity; tuned antiquotations;
traytel
parents:
49463
diff
changeset
|
524 |
dtac list_inject_iffD1 THEN' etac conjE THEN' |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
525 |
(if k = i |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
526 |
then EVERY' [dtac (mk_InN_inject n i), |
|
49488
02eb07152998
use iffD* instead of (s)subst instantiated with identity; tuned antiquotations;
traytel
parents:
49463
diff
changeset
|
527 |
dtac (Thm.permute_prems 0 2 (to_sbd_inj RS iffD1)), |
| 51798 | 528 |
atac, atac, hyp_subst_tac ctxt] THEN' |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
529 |
CONJ_WRAP' (fn i'' => |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
530 |
EVERY' [rtac impI, dtac (sym RS trans), |
|
55414
eab03e9cee8a
renamed '{prod,sum,bool,unit}_case' to 'case_...'
blanchet
parents:
55393
diff
changeset
|
531 |
rtac (rv_Cons RS trans), rtac (mk_sum_caseN n i RS arg_cong RS trans), |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
532 |
etac (from_to_sbd RS arg_cong), |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
533 |
REPEAT_DETERM o etac allE, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
534 |
dtac (mk_conjunctN n i), dtac mp, atac, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
535 |
dtac (mk_conjunctN n i'), dtac mp, atac, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
536 |
dtac (mk_conjunctN n i''), etac mp, etac sym]) |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
537 |
ks |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
538 |
else etac (mk_InN_not_InM i k RS notE))) |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
539 |
(rev ks)) |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
540 |
ks) |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
541 |
(rev (ks ~~ (from_to_sbds ~~ to_sbd_injs)))]) |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
542 |
((Lev_Sucs ~~ rv_Conss) ~~ (from_to_sbdss ~~ to_sbd_injss))] 1 |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
543 |
end; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
544 |
|
|
55577
a6c2379078c8
simplifications of internal codatatype construction
traytel
parents:
55541
diff
changeset
|
545 |
fun mk_mor_beh_tac ctxt m mor_def mor_cong beh_defs carT_defs strT_defs isNode_defs to_sbd_injss |
|
a6c2379078c8
simplifications of internal codatatype construction
traytel
parents:
55541
diff
changeset
|
546 |
from_to_sbdss Lev_0s Lev_Sucs rv_Nils rv_Conss length_Levs length_Lev's rv_lastss set_Levsss |
|
a6c2379078c8
simplifications of internal codatatype construction
traytel
parents:
55541
diff
changeset
|
547 |
set_image_Levsss set_map0ss map_comp_ids map_cong0s = |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
548 |
let |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
549 |
val n = length beh_defs; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
550 |
val ks = 1 upto n; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
551 |
|
|
55577
a6c2379078c8
simplifications of internal codatatype construction
traytel
parents:
55541
diff
changeset
|
552 |
fun fbetw_tac (i, (carT_def, (isNode_def, (Lev_0, (rv_Nil, ((length_Lev, length_Lev'), |
|
a6c2379078c8
simplifications of internal codatatype construction
traytel
parents:
55541
diff
changeset
|
553 |
(rv_lasts, (set_map0s, (set_Levss, set_image_Levss))))))))) = |
| 49305 | 554 |
EVERY' [rtac ballI, rtac (carT_def RS equalityD2 RS set_mp), |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
555 |
rtac CollectI, REPEAT_DETERM o rtac exI, rtac conjI, rtac refl, rtac conjI, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
556 |
rtac conjI, |
| 49305 | 557 |
rtac @{thm UN_I}, rtac UNIV_I, rtac (Lev_0 RS equalityD2 RS set_mp),
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
558 |
rtac @{thm singletonI},
|
|
55577
a6c2379078c8
simplifications of internal codatatype construction
traytel
parents:
55541
diff
changeset
|
559 |
(**) |
|
55581
d1c228753d76
another simplification of internal codatatype construction
traytel
parents:
55577
diff
changeset
|
560 |
rtac ballI, etac @{thm UN_E},
|
| 53289 | 561 |
CONJ_WRAP' (fn (i, (rv_last, (isNode_def, (set_map0s, |
|
55541
fd9ea8ae28f6
syntactic simplifications of internal (co)datatype constructions
traytel
parents:
55414
diff
changeset
|
562 |
(set_Levs, set_image_Levs))))) => |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
563 |
EVERY' [rtac ballI, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
564 |
REPEAT_DETERM o eresolve_tac [CollectE, @{thm SuccE}, @{thm UN_E}],
|
| 56114 | 565 |
rtac (rev_mp OF [rv_last, impI]), etac exE, rtac (isNode_def RS iffD2), |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
566 |
rtac exI, rtac conjI, |
|
55577
a6c2379078c8
simplifications of internal codatatype construction
traytel
parents:
55541
diff
changeset
|
567 |
if n = 1 then rtac refl |
|
57983
6edc3529bb4e
reordered some (co)datatype property names for more consistency
blanchet
parents:
57806
diff
changeset
|
568 |
else etac (sum_case_cong_weak RS trans) THEN' rtac (mk_sum_caseN n i), |
| 53289 | 569 |
CONJ_WRAP' (fn (set_map0, (set_Lev, set_image_Lev)) => |
570 |
EVERY' [rtac (set_map0 RS trans), rtac equalityI, rtac @{thm image_subsetI},
|
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
571 |
rtac CollectI, rtac @{thm SuccI}, rtac @{thm UN_I}, rtac UNIV_I, etac set_Lev,
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
572 |
if n = 1 then rtac refl else atac, atac, rtac subsetI, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
573 |
REPEAT_DETERM o eresolve_tac [CollectE, @{thm SuccE}, @{thm UN_E}],
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
574 |
REPEAT_DETERM_N 4 o etac thin_rl, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
575 |
rtac set_image_Lev, |
| 51798 | 576 |
atac, dtac length_Lev, hyp_subst_tac ctxt, dtac length_Lev', |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
577 |
etac @{thm set_mp[OF equalityD1[OF arg_cong[OF length_append_singleton]]]},
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
578 |
if n = 1 then rtac refl else atac]) |
| 53289 | 579 |
(drop m set_map0s ~~ (set_Levs ~~ set_image_Levs))]) |
580 |
(ks ~~ (rv_lasts ~~ (isNode_defs ~~ (set_map0ss ~~ |
|
|
55541
fd9ea8ae28f6
syntactic simplifications of internal (co)datatype constructions
traytel
parents:
55414
diff
changeset
|
581 |
(set_Levss ~~ set_image_Levss))))), |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
582 |
(*root isNode*) |
| 56114 | 583 |
rtac (isNode_def RS iffD2), rtac exI, rtac conjI, |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
584 |
CONVERSION (Conv.top_conv |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
585 |
(K (Conv.try_conv (Conv.rewr_conv (rv_Nil RS eq_reflection)))) ctxt), |
|
55414
eab03e9cee8a
renamed '{prod,sum,bool,unit}_case' to 'case_...'
blanchet
parents:
55393
diff
changeset
|
586 |
if n = 1 then rtac refl else rtac (mk_sum_caseN n i), |
| 53289 | 587 |
CONJ_WRAP' (fn (set_map0, (set_Lev, set_image_Lev)) => |
588 |
EVERY' [rtac (set_map0 RS trans), rtac equalityI, rtac @{thm image_subsetI},
|
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
589 |
rtac CollectI, rtac @{thm SuccI}, rtac @{thm UN_I}, rtac UNIV_I, rtac set_Lev,
|
| 49305 | 590 |
rtac (Lev_0 RS equalityD2 RS set_mp), rtac @{thm singletonI}, rtac rv_Nil,
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
591 |
atac, rtac subsetI, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
592 |
REPEAT_DETERM o eresolve_tac [CollectE, @{thm SuccE}, @{thm UN_E}],
|
| 49305 | 593 |
rtac set_image_Lev, rtac (Lev_0 RS equalityD2 RS set_mp), |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
594 |
rtac @{thm singletonI}, dtac length_Lev',
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
595 |
etac @{thm set_mp[OF equalityD1[OF arg_cong[OF
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
596 |
trans[OF length_append_singleton arg_cong[of _ _ Suc, OF list.size(3)]]]]]}, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
597 |
rtac rv_Nil]) |
| 53289 | 598 |
(drop m set_map0s ~~ (nth set_Levss (i - 1) ~~ nth set_image_Levss (i - 1)))]; |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
599 |
|
|
55577
a6c2379078c8
simplifications of internal codatatype construction
traytel
parents:
55541
diff
changeset
|
600 |
fun mor_tac (i, (strT_def, ((Lev_Suc, (rv_Nil, rv_Cons)), |
|
a6c2379078c8
simplifications of internal codatatype construction
traytel
parents:
55541
diff
changeset
|
601 |
((map_comp_id, map_cong0), (length_Lev', (from_to_sbds, to_sbd_injs)))))) = |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
602 |
EVERY' [rtac ballI, rtac sym, rtac trans, rtac strT_def, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
603 |
CONVERSION (Conv.top_conv |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
604 |
(K (Conv.try_conv (Conv.rewr_conv (rv_Nil RS eq_reflection)))) ctxt), |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
605 |
if n = 1 then K all_tac |
|
57983
6edc3529bb4e
reordered some (co)datatype property names for more consistency
blanchet
parents:
57806
diff
changeset
|
606 |
else (rtac (sum_case_cong_weak RS trans) THEN' |
|
55414
eab03e9cee8a
renamed '{prod,sum,bool,unit}_case' to 'case_...'
blanchet
parents:
55393
diff
changeset
|
607 |
rtac (mk_sum_caseN n i) THEN' rtac (mk_sum_caseN n i RS trans)), |
|
51761
4c9f08836d87
renamed "map_cong" axiom to "map_cong0" in preparation for real "map_cong"
blanchet
parents:
51739
diff
changeset
|
608 |
rtac (map_comp_id RS trans), rtac (map_cong0 OF replicate m refl), |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
609 |
EVERY' (map3 (fn i' => fn to_sbd_inj => fn from_to_sbd => |
| 56765 | 610 |
DETERM o EVERY' [rtac trans, rtac o_apply, rtac prod_injectI, rtac conjI, |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
611 |
rtac trans, rtac @{thm Shift_def},
|
|
55541
fd9ea8ae28f6
syntactic simplifications of internal (co)datatype constructions
traytel
parents:
55414
diff
changeset
|
612 |
rtac equalityI, rtac subsetI, etac thin_rl, |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
613 |
REPEAT_DETERM o eresolve_tac [CollectE, @{thm UN_E}], dtac length_Lev', dtac asm_rl,
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
614 |
etac thin_rl, dtac @{thm set_rev_mp[OF _ equalityD1]},
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
615 |
rtac (@{thm length_Cons} RS arg_cong RS trans), rtac Lev_Suc,
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
616 |
CONJ_WRAP_GEN' (etac (Thm.permute_prems 1 1 UnE)) (fn i'' => |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
617 |
EVERY' [REPEAT_DETERM o eresolve_tac [CollectE, exE, conjE], |
|
49488
02eb07152998
use iffD* instead of (s)subst instantiated with identity; tuned antiquotations;
traytel
parents:
49463
diff
changeset
|
618 |
dtac list_inject_iffD1, etac conjE, |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
619 |
if i' = i'' then EVERY' [dtac (mk_InN_inject n i'), |
|
49488
02eb07152998
use iffD* instead of (s)subst instantiated with identity; tuned antiquotations;
traytel
parents:
49463
diff
changeset
|
620 |
dtac (Thm.permute_prems 0 2 (to_sbd_inj RS iffD1)), |
| 51798 | 621 |
atac, atac, hyp_subst_tac ctxt, etac @{thm UN_I[OF UNIV_I]}]
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
622 |
else etac (mk_InN_not_InM i' i'' RS notE)]) |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
623 |
(rev ks), |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
624 |
rtac @{thm UN_least}, rtac subsetI, rtac CollectI, rtac @{thm UN_I[OF UNIV_I]},
|
| 49366 | 625 |
rtac (Lev_Suc RS equalityD2 RS set_mp), rtac (mk_UnIN n i'), rtac CollectI, |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
626 |
REPEAT_DETERM o rtac exI, rtac conjI, rtac refl, etac conjI, atac, |
| 56114 | 627 |
rtac trans, rtac @{thm shift_def}, rtac iffD2, rtac @{thm fun_eq_iff}, rtac allI,
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
628 |
CONVERSION (Conv.top_conv |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
629 |
(K (Conv.try_conv (Conv.rewr_conv (rv_Cons RS eq_reflection)))) ctxt), |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
630 |
if n = 1 then K all_tac |
|
57983
6edc3529bb4e
reordered some (co)datatype property names for more consistency
blanchet
parents:
57806
diff
changeset
|
631 |
else rtac sum_case_cong_weak THEN' rtac (mk_sum_caseN n i' RS trans), |
|
55577
a6c2379078c8
simplifications of internal codatatype construction
traytel
parents:
55541
diff
changeset
|
632 |
SELECT_GOAL (unfold_thms_tac ctxt [from_to_sbd]), rtac refl]) |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
633 |
ks to_sbd_injs from_to_sbds)]; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
634 |
in |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
635 |
(rtac mor_cong THEN' |
| 55990 | 636 |
EVERY' (map (fn thm => rtac (thm RS @{thm ext})) beh_defs) THEN'
|
| 56114 | 637 |
rtac (mor_def RS iffD2) THEN' rtac conjI THEN' |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
638 |
CONJ_WRAP' fbetw_tac |
|
55577
a6c2379078c8
simplifications of internal codatatype construction
traytel
parents:
55541
diff
changeset
|
639 |
(ks ~~ (carT_defs ~~ (isNode_defs ~~ (Lev_0s ~~ (rv_Nils ~~ ((length_Levs ~~ length_Lev's) ~~ |
|
a6c2379078c8
simplifications of internal codatatype construction
traytel
parents:
55541
diff
changeset
|
640 |
(rv_lastss ~~ (set_map0ss ~~ (set_Levsss ~~ set_image_Levsss))))))))) THEN' |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
641 |
CONJ_WRAP' mor_tac |
|
55577
a6c2379078c8
simplifications of internal codatatype construction
traytel
parents:
55541
diff
changeset
|
642 |
(ks ~~ (strT_defs ~~ ((Lev_Sucs ~~ (rv_Nils ~~ rv_Conss)) ~~ |
|
a6c2379078c8
simplifications of internal codatatype construction
traytel
parents:
55541
diff
changeset
|
643 |
((map_comp_ids ~~ map_cong0s) ~~ |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
644 |
(length_Lev's ~~ (from_to_sbdss ~~ to_sbd_injss))))))) 1 |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
645 |
end; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
646 |
|
|
51761
4c9f08836d87
renamed "map_cong" axiom to "map_cong0" in preparation for real "map_cong"
blanchet
parents:
51739
diff
changeset
|
647 |
fun mk_congruent_str_final_tac m lsbisE map_comp_id map_cong0 equiv_LSBISs = |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
648 |
EVERY' [rtac @{thm congruentI}, dtac lsbisE,
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
649 |
REPEAT_DETERM o eresolve_tac [CollectE, conjE, bexE], rtac (o_apply RS trans), |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
650 |
etac (sym RS arg_cong RS trans), rtac (map_comp_id RS trans), |
|
51761
4c9f08836d87
renamed "map_cong" axiom to "map_cong0" in preparation for real "map_cong"
blanchet
parents:
51739
diff
changeset
|
651 |
rtac (map_cong0 RS trans), REPEAT_DETERM_N m o rtac refl, |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
652 |
EVERY' (map (fn equiv_LSBIS => |
| 49305 | 653 |
EVERY' [rtac @{thm equiv_proj}, rtac equiv_LSBIS, etac set_mp, atac])
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
654 |
equiv_LSBISs), rtac sym, rtac (o_apply RS trans), |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
655 |
etac (sym RS arg_cong RS trans), rtac map_comp_id] 1; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
656 |
|
| 53289 | 657 |
fun mk_coalg_final_tac m coalg_def congruent_str_finals equiv_LSBISs set_map0ss coalgT_setss = |
| 56114 | 658 |
EVERY' [rtac (coalg_def RS iffD2), |
| 53289 | 659 |
CONJ_WRAP' (fn ((set_map0s, coalgT_sets), (equiv_LSBIS, congruent_str_final)) => |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
660 |
EVERY' [rtac @{thm univ_preserves}, rtac equiv_LSBIS, rtac congruent_str_final,
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
661 |
rtac ballI, rtac @{thm ssubst_mem}, rtac o_apply, rtac CollectI,
|
|
55541
fd9ea8ae28f6
syntactic simplifications of internal (co)datatype constructions
traytel
parents:
55414
diff
changeset
|
662 |
REPEAT_DETERM_N m o EVERY' [rtac conjI, rtac subset_UNIV], |
| 53289 | 663 |
CONJ_WRAP' (fn (equiv_LSBIS, (set_map0, coalgT_set)) => |
664 |
EVERY' [rtac (set_map0 RS ord_eq_le_trans), |
|
| 56114 | 665 |
rtac @{thm image_subsetI}, rtac iffD2, rtac @{thm proj_in_iff},
|
| 49305 | 666 |
rtac equiv_LSBIS, etac set_rev_mp, etac coalgT_set]) |
|
55541
fd9ea8ae28f6
syntactic simplifications of internal (co)datatype constructions
traytel
parents:
55414
diff
changeset
|
667 |
(equiv_LSBISs ~~ (drop m set_map0s ~~ coalgT_sets))]) |
| 53289 | 668 |
((set_map0ss ~~ coalgT_setss) ~~ (equiv_LSBISs ~~ congruent_str_finals))] 1; |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
669 |
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
670 |
fun mk_mor_T_final_tac mor_def congruent_str_finals equiv_LSBISs = |
| 56114 | 671 |
EVERY' [rtac (mor_def RS iffD2), rtac conjI, |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
672 |
CONJ_WRAP' (fn equiv_LSBIS => |
| 56114 | 673 |
EVERY' [rtac ballI, rtac iffD2, rtac @{thm proj_in_iff}, rtac equiv_LSBIS, atac])
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
674 |
equiv_LSBISs, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
675 |
CONJ_WRAP' (fn (equiv_LSBIS, congruent_str_final) => |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
676 |
EVERY' [rtac ballI, rtac sym, rtac trans, rtac @{thm univ_commute}, rtac equiv_LSBIS,
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
677 |
rtac congruent_str_final, atac, rtac o_apply]) |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
678 |
(equiv_LSBISs ~~ congruent_str_finals)] 1; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
679 |
|
|
55541
fd9ea8ae28f6
syntactic simplifications of internal (co)datatype constructions
traytel
parents:
55414
diff
changeset
|
680 |
fun mk_mor_Rep_tac ctxt defs Reps Abs_inverses coalg_final_setss map_comp_ids map_cong0Ls = |
|
49504
df9b897fb254
renamed "iter"/"coiter" to "fold"/"unfold" (cf. Wadler)
blanchet
parents:
49501
diff
changeset
|
681 |
unfold_thms_tac ctxt defs THEN |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
682 |
EVERY' [rtac conjI, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
683 |
CONJ_WRAP' (fn thm => rtac ballI THEN' rtac thm) Reps, |
|
51761
4c9f08836d87
renamed "map_cong" axiom to "map_cong0" in preparation for real "map_cong"
blanchet
parents:
51739
diff
changeset
|
684 |
CONJ_WRAP' (fn (Rep, ((map_comp_id, map_cong0L), coalg_final_sets)) => |
|
4c9f08836d87
renamed "map_cong" axiom to "map_cong0" in preparation for real "map_cong"
blanchet
parents:
51739
diff
changeset
|
685 |
EVERY' [rtac ballI, rtac (map_comp_id RS trans), rtac map_cong0L, |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
686 |
EVERY' (map2 (fn Abs_inverse => fn coalg_final_set => |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
687 |
EVERY' [rtac ballI, rtac (o_apply RS trans), rtac Abs_inverse, |
| 49305 | 688 |
etac set_rev_mp, rtac coalg_final_set, rtac Rep]) |
|
55541
fd9ea8ae28f6
syntactic simplifications of internal (co)datatype constructions
traytel
parents:
55414
diff
changeset
|
689 |
Abs_inverses coalg_final_sets)]) |
|
51761
4c9f08836d87
renamed "map_cong" axiom to "map_cong0" in preparation for real "map_cong"
blanchet
parents:
51739
diff
changeset
|
690 |
(Reps ~~ ((map_comp_ids ~~ map_cong0Ls) ~~ coalg_final_setss))] 1; |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
691 |
|
| 55197 | 692 |
fun mk_mor_Abs_tac ctxt defs Abs_inverses = |
|
49504
df9b897fb254
renamed "iter"/"coiter" to "fold"/"unfold" (cf. Wadler)
blanchet
parents:
49501
diff
changeset
|
693 |
unfold_thms_tac ctxt defs THEN |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
694 |
EVERY' [rtac conjI, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
695 |
CONJ_WRAP' (K (rtac ballI THEN' rtac UNIV_I)) Abs_inverses, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
696 |
CONJ_WRAP' (fn thm => rtac ballI THEN' etac (thm RS arg_cong RS sym)) Abs_inverses] 1; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
697 |
|
|
51761
4c9f08836d87
renamed "map_cong" axiom to "map_cong0" in preparation for real "map_cong"
blanchet
parents:
51739
diff
changeset
|
698 |
fun mk_mor_unfold_tac m mor_UNIV dtor_defs unfold_defs Abs_inverses morEs map_comp_ids map_cong0s = |
|
49488
02eb07152998
use iffD* instead of (s)subst instantiated with identity; tuned antiquotations;
traytel
parents:
49463
diff
changeset
|
699 |
EVERY' [rtac iffD2, rtac mor_UNIV, |
|
51761
4c9f08836d87
renamed "map_cong" axiom to "map_cong0" in preparation for real "map_cong"
blanchet
parents:
51739
diff
changeset
|
700 |
CONJ_WRAP' (fn ((Abs_inverse, morE), ((dtor_def, unfold_def), (map_comp_id, map_cong0))) => |
| 55990 | 701 |
EVERY' [rtac @{thm ext}, rtac (o_apply RS trans RS sym), rtac (dtor_def RS trans),
|
|
49504
df9b897fb254
renamed "iter"/"coiter" to "fold"/"unfold" (cf. Wadler)
blanchet
parents:
49501
diff
changeset
|
702 |
rtac (unfold_def RS arg_cong RS trans), rtac (Abs_inverse RS arg_cong RS trans), |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
703 |
rtac (morE RS arg_cong RS trans), rtac (map_comp_id RS trans), |
|
51761
4c9f08836d87
renamed "map_cong" axiom to "map_cong0" in preparation for real "map_cong"
blanchet
parents:
51739
diff
changeset
|
704 |
rtac (o_apply RS trans RS sym), rtac map_cong0, |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
705 |
REPEAT_DETERM_N m o rtac refl, |
|
49504
df9b897fb254
renamed "iter"/"coiter" to "fold"/"unfold" (cf. Wadler)
blanchet
parents:
49501
diff
changeset
|
706 |
EVERY' (map (fn thm => rtac (thm RS trans) THEN' rtac (o_apply RS sym)) unfold_defs)]) |
|
51761
4c9f08836d87
renamed "map_cong" axiom to "map_cong0" in preparation for real "map_cong"
blanchet
parents:
51739
diff
changeset
|
707 |
((Abs_inverses ~~ morEs) ~~ ((dtor_defs ~~ unfold_defs) ~~ (map_comp_ids ~~ map_cong0s)))] 1; |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
708 |
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
709 |
fun mk_raw_coind_tac bis_def bis_cong bis_O bis_converse bis_Gr tcoalg coalgT mor_T_final |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
710 |
sbis_lsbis lsbis_incls incl_lsbiss equiv_LSBISs mor_Rep Rep_injects = |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
711 |
let |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
712 |
val n = length Rep_injects; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
713 |
in |
|
49488
02eb07152998
use iffD* instead of (s)subst instantiated with identity; tuned antiquotations;
traytel
parents:
49463
diff
changeset
|
714 |
EVERY' [rtac rev_mp, ftac (bis_def RS iffD1), |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
715 |
REPEAT_DETERM o etac conjE, rtac bis_cong, rtac bis_O, rtac bis_converse, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
716 |
rtac bis_Gr, rtac tcoalg, rtac mor_Rep, rtac bis_O, atac, rtac bis_Gr, rtac tcoalg, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
717 |
rtac mor_Rep, REPEAT_DETERM_N n o etac @{thm relImage_Gr},
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
718 |
rtac impI, rtac rev_mp, rtac bis_cong, rtac bis_O, rtac bis_Gr, rtac coalgT, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
719 |
rtac mor_T_final, rtac bis_O, rtac sbis_lsbis, rtac bis_converse, rtac bis_Gr, rtac coalgT, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
720 |
rtac mor_T_final, EVERY' (map (fn thm => rtac (thm RS @{thm relInvImage_Gr})) lsbis_incls),
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
721 |
rtac impI, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
722 |
CONJ_WRAP' (fn (Rep_inject, (equiv_LSBIS , (incl_lsbis, lsbis_incl))) => |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
723 |
EVERY' [rtac subset_trans, rtac @{thm relInvImage_UNIV_relImage}, rtac subset_trans,
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
724 |
rtac @{thm relInvImage_mono}, rtac subset_trans, etac incl_lsbis,
|
| 49305 | 725 |
rtac ord_eq_le_trans, rtac @{thm sym[OF relImage_relInvImage]},
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
726 |
rtac @{thm xt1(3)}, rtac @{thm Sigma_cong},
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
727 |
rtac @{thm proj_image}, rtac @{thm proj_image}, rtac lsbis_incl,
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
728 |
rtac subset_trans, rtac @{thm relImage_mono}, rtac incl_lsbis, atac,
|
| 51447 | 729 |
rtac @{thm relImage_proj}, rtac equiv_LSBIS, rtac @{thm relInvImage_Id_on},
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
730 |
rtac Rep_inject]) |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
731 |
(Rep_injects ~~ (equiv_LSBISs ~~ (incl_lsbiss ~~ lsbis_incls)))] 1 |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
732 |
end; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
733 |
|
|
49504
df9b897fb254
renamed "iter"/"coiter" to "fold"/"unfold" (cf. Wadler)
blanchet
parents:
49501
diff
changeset
|
734 |
fun mk_unfold_unique_mor_tac raw_coinds bis mor unfold_defs = |
|
df9b897fb254
renamed "iter"/"coiter" to "fold"/"unfold" (cf. Wadler)
blanchet
parents:
49501
diff
changeset
|
735 |
CONJ_WRAP' (fn (raw_coind, unfold_def) => |
| 55990 | 736 |
EVERY' [rtac @{thm ext}, etac (bis RS raw_coind RS set_mp RS @{thm IdD}), rtac mor,
|
|
49504
df9b897fb254
renamed "iter"/"coiter" to "fold"/"unfold" (cf. Wadler)
blanchet
parents:
49501
diff
changeset
|
737 |
rtac @{thm image2_eqI}, rtac refl, rtac (unfold_def RS arg_cong RS trans),
|
|
df9b897fb254
renamed "iter"/"coiter" to "fold"/"unfold" (cf. Wadler)
blanchet
parents:
49501
diff
changeset
|
738 |
rtac (o_apply RS sym), rtac UNIV_I]) (raw_coinds ~~ unfold_defs) 1; |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
739 |
|
| 55197 | 740 |
fun mk_dtor_o_ctor_tac ctxt ctor_def unfold map_comp_id map_cong0L unfold_o_dtors = |
| 55990 | 741 |
unfold_thms_tac ctxt [ctor_def] THEN EVERY' [rtac @{thm ext}, rtac trans, rtac o_apply,
|
|
51761
4c9f08836d87
renamed "map_cong" axiom to "map_cong0" in preparation for real "map_cong"
blanchet
parents:
51739
diff
changeset
|
742 |
rtac trans, rtac unfold, rtac trans, rtac map_comp_id, rtac trans, rtac map_cong0L, |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
743 |
EVERY' (map (fn thm => |
|
49585
5c4a12550491
generate high-level "maps", "sets", and "rels" properties
blanchet
parents:
49581
diff
changeset
|
744 |
rtac ballI THEN' rtac (trans OF [thm RS fun_cong, id_apply])) unfold_o_dtors), |
|
5c4a12550491
generate high-level "maps", "sets", and "rels" properties
blanchet
parents:
49581
diff
changeset
|
745 |
rtac sym, rtac id_apply] 1; |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
746 |
|
| 55197 | 747 |
fun mk_corec_tac ctxt m corec_defs unfold map_cong0 corec_Inls = |
|
49504
df9b897fb254
renamed "iter"/"coiter" to "fold"/"unfold" (cf. Wadler)
blanchet
parents:
49501
diff
changeset
|
748 |
unfold_thms_tac ctxt corec_defs THEN EVERY' [rtac trans, rtac (o_apply RS arg_cong), |
|
55642
63beb38e9258
adapted to renaming of datatype 'cases' and 'recs' to 'case' and 'rec'
blanchet
parents:
55606
diff
changeset
|
749 |
rtac trans, rtac unfold, fo_rtac (@{thm sum.case(2)} RS arg_cong RS trans) ctxt, rtac map_cong0,
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
750 |
REPEAT_DETERM_N m o rtac refl, |
|
55414
eab03e9cee8a
renamed '{prod,sum,bool,unit}_case' to 'case_...'
blanchet
parents:
55393
diff
changeset
|
751 |
EVERY' (map (fn thm => rtac @{thm case_sum_expand_Inr} THEN' rtac thm) corec_Inls)] 1;
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
752 |
|
| 55197 | 753 |
fun mk_corec_unique_mor_tac ctxt corec_defs corec_Inls unfold_unique_mor = |
|
51739
3514b90d0a8b
(co)rec is (just as the (un)fold) the unique morphism;
traytel
parents:
51447
diff
changeset
|
754 |
unfold_thms_tac ctxt |
|
55414
eab03e9cee8a
renamed '{prod,sum,bool,unit}_case' to 'case_...'
blanchet
parents:
55393
diff
changeset
|
755 |
(corec_defs @ map (fn thm => thm RS @{thm case_sum_expand_Inr'}) corec_Inls) THEN
|
|
51739
3514b90d0a8b
(co)rec is (just as the (un)fold) the unique morphism;
traytel
parents:
51447
diff
changeset
|
756 |
etac unfold_unique_mor 1; |
|
3514b90d0a8b
(co)rec is (just as the (un)fold) the unique morphism;
traytel
parents:
51447
diff
changeset
|
757 |
|
|
51893
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51850
diff
changeset
|
758 |
fun mk_dtor_coinduct_tac m raw_coind bis_rel rel_congs = |
| 56114 | 759 |
EVERY' [rtac rev_mp, rtac raw_coind, rtac iffD2, rtac bis_rel, rtac conjI, |
|
51893
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51850
diff
changeset
|
760 |
CONJ_WRAP' (K (rtac @{thm ord_le_eq_trans[OF subset_UNIV UNIV_Times_UNIV[THEN sym]]}))
|
|
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51850
diff
changeset
|
761 |
rel_congs, |
|
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51850
diff
changeset
|
762 |
CONJ_WRAP' (fn rel_cong => EVERY' [rtac allI, rtac allI, rtac impI, |
|
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51850
diff
changeset
|
763 |
REPEAT_DETERM o etac allE, rtac (rel_cong RS @{thm eq_refl} RS @{thm predicate2D}),
|
|
55541
fd9ea8ae28f6
syntactic simplifications of internal (co)datatype constructions
traytel
parents:
55414
diff
changeset
|
764 |
REPEAT_DETERM_N m o rtac refl, |
|
51893
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51850
diff
changeset
|
765 |
REPEAT_DETERM_N (length rel_congs) o rtac @{thm in_rel_Collect_split_eq[symmetric]},
|
|
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51850
diff
changeset
|
766 |
etac mp, etac CollectE, etac @{thm splitD}])
|
|
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51850
diff
changeset
|
767 |
rel_congs, |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
768 |
rtac impI, REPEAT_DETERM o etac conjE, |
| 49305 | 769 |
CONJ_WRAP' (K (EVERY' [rtac impI, rtac @{thm IdD}, etac set_mp,
|
|
55414
eab03e9cee8a
renamed '{prod,sum,bool,unit}_case' to 'case_...'
blanchet
parents:
55393
diff
changeset
|
770 |
rtac CollectI, etac @{thm case_prodI}])) rel_congs] 1;
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
771 |
|
| 55602 | 772 |
fun mk_map_tac m n map_arg_cong unfold map_comp map_cong0 = |
| 55990 | 773 |
EVERY' [rtac @{thm ext}, rtac (o_apply RS trans RS sym), rtac (o_apply RS trans RS sym),
|
774 |
rtac (unfold RS trans), rtac (Thm.permute_prems 0 1 (map_comp RS @{thm box_equals})),
|
|
775 |
rtac map_cong0, |
|
| 55067 | 776 |
REPEAT_DETERM_N m o rtac (@{thm id_comp} RS fun_cong),
|
777 |
REPEAT_DETERM_N n o rtac (@{thm comp_id} RS fun_cong),
|
|
| 55602 | 778 |
rtac map_arg_cong, rtac (o_apply RS sym)] 1; |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
779 |
|
| 56179 | 780 |
fun mk_set_le_tac n Jset_minimal set_Jsets set_Jset_Jsetss = |
781 |
EVERY' [rtac Jset_minimal, |
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
782 |
REPEAT_DETERM_N n o rtac @{thm Un_upper1},
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
783 |
REPEAT_DETERM_N n o |
| 56179 | 784 |
EVERY' (map3 (fn i => fn set_Jset => fn set_Jset_Jsets => |
| 49366 | 785 |
EVERY' [rtac subsetI, rtac @{thm UnI2}, rtac (mk_UnIN n i), etac @{thm UN_I},
|
| 56179 | 786 |
etac UnE, etac set_Jset, REPEAT_DETERM_N (n - 1) o etac UnE, |
787 |
EVERY' (map (fn thm => EVERY' [etac @{thm UN_E}, etac thm, atac]) set_Jset_Jsets)])
|
|
788 |
(1 upto n) set_Jsets set_Jset_Jsetss)] 1; |
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
789 |
|
| 56179 | 790 |
fun mk_set_ge_tac n set_incl_Jset set_Jset_incl_Jsets = |
791 |
EVERY' [rtac @{thm Un_least}, rtac set_incl_Jset,
|
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
792 |
REPEAT_DETERM_N (n - 1) o rtac @{thm Un_least},
|
| 56179 | 793 |
EVERY' (map (fn thm => rtac @{thm UN_least} THEN' etac thm) set_Jset_incl_Jsets)] 1;
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
794 |
|
| 53270 | 795 |
fun mk_map_id0_tac maps unfold_unique unfold_dtor = |
| 52912 | 796 |
EVERY' [rtac (unfold_unique RS trans), EVERY' (map (rtac o mk_sym) maps), |
|
49504
df9b897fb254
renamed "iter"/"coiter" to "fold"/"unfold" (cf. Wadler)
blanchet
parents:
49501
diff
changeset
|
797 |
rtac unfold_dtor] 1; |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
798 |
|
|
54841
af71b753c459
express weak pullback property of bnfs only in terms of the relator
traytel
parents:
54793
diff
changeset
|
799 |
fun mk_map_comp0_tac maps map_comp0s map_unique = |
|
af71b753c459
express weak pullback property of bnfs only in terms of the relator
traytel
parents:
54793
diff
changeset
|
800 |
EVERY' [rtac map_unique, |
|
af71b753c459
express weak pullback property of bnfs only in terms of the relator
traytel
parents:
54793
diff
changeset
|
801 |
EVERY' (map2 (fn map_thm => fn map_comp0 => |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
802 |
EVERY' (map rtac |
| 55067 | 803 |
[@{thm comp_assoc[symmetric]} RS trans,
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
804 |
@{thm arg_cong2[of _ _ _ _ "op o"]} OF [map_thm, refl] RS trans,
|
| 55067 | 805 |
@{thm comp_assoc[symmetric]} RS sym RS trans, map_thm RS arg_cong RS trans,
|
806 |
@{thm comp_assoc[symmetric]} RS trans,
|
|
|
54841
af71b753c459
express weak pullback property of bnfs only in terms of the relator
traytel
parents:
54793
diff
changeset
|
807 |
@{thm arg_cong2[of _ _ _ _ "op o"]} OF [map_comp0 RS sym, refl]]))
|
|
af71b753c459
express weak pullback property of bnfs only in terms of the relator
traytel
parents:
54793
diff
changeset
|
808 |
maps map_comp0s)] 1; |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
809 |
|
| 56179 | 810 |
fun mk_mcong_tac ctxt m coinduct_tac map_comps dtor_maps map_cong0s set_map0ss set_Jsetss |
811 |
set_Jset_Jsetsss in_rels = |
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
812 |
let |
| 53288 | 813 |
val n = length map_comps; |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
814 |
val ks = 1 upto n; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
815 |
in |
| 55644 | 816 |
EVERY' ([rtac rev_mp, coinduct_tac] @ |
| 56179 | 817 |
maps (fn ((((((map_comp_trans, dtor_maps_trans), map_cong0), set_map0s), set_Jsets), |
818 |
set_Jset_Jsetss), in_rel) => |
|
| 55644 | 819 |
[REPEAT_DETERM o resolve_tac [allI, impI, in_rel RS iffD2], |
820 |
REPEAT_DETERM o eresolve_tac [exE, conjE], hyp_subst_tac ctxt, rtac exI, |
|
821 |
rtac (Drule.rotate_prems 1 conjI), |
|
| 53288 | 822 |
rtac conjI, rtac map_comp_trans, rtac sym, rtac dtor_maps_trans, rtac map_cong0, |
| 55644 | 823 |
REPEAT_DETERM_N m o (rtac o_apply_trans_sym THEN' rtac @{thm fst_conv}),
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
824 |
REPEAT_DETERM_N n o rtac fst_convol_fun_cong_sym, |
| 53288 | 825 |
rtac map_comp_trans, rtac sym, rtac dtor_maps_trans, rtac map_cong0, |
| 56179 | 826 |
EVERY' (maps (fn set_Jset => |
| 55644 | 827 |
[rtac o_apply_trans_sym, rtac (@{thm snd_conv} RS trans), etac CollectE,
|
| 56179 | 828 |
REPEAT_DETERM o etac conjE, etac bspec, etac set_Jset]) set_Jsets), |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
829 |
REPEAT_DETERM_N n o rtac snd_convol_fun_cong_sym, |
| 55644 | 830 |
rtac CollectI, |
831 |
EVERY' (map (fn set_map0 => EVERY' [rtac conjI, rtac ord_eq_le_trans, rtac set_map0, |
|
832 |
rtac @{thm image_subsetI}, rtac CollectI, rtac @{thm case_prodI}, rtac refl])
|
|
833 |
(take m set_map0s)), |
|
| 56179 | 834 |
CONJ_WRAP' (fn (set_map0, set_Jset_Jsets) => |
| 55644 | 835 |
EVERY' [rtac ord_eq_le_trans, rtac set_map0, |
836 |
rtac @{thm image_subsetI}, rtac CollectI, rtac @{thm case_prodI}, rtac exI, rtac conjI,
|
|
837 |
rtac CollectI, etac CollectE, |
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
838 |
REPEAT_DETERM o etac conjE, |
| 56179 | 839 |
CONJ_WRAP' (fn set_Jset_Jset => |
840 |
EVERY' [rtac ballI, etac bspec, etac set_Jset_Jset, atac]) set_Jset_Jsets, |
|
| 55644 | 841 |
rtac (conjI OF [refl, refl])]) |
| 56179 | 842 |
(drop m set_map0s ~~ set_Jset_Jsetss)]) |
| 53288 | 843 |
(map (fn th => th RS trans) map_comps ~~ map (fn th => th RS trans) dtor_maps ~~ |
| 56179 | 844 |
map_cong0s ~~ set_map0ss ~~ set_Jsetss ~~ set_Jset_Jsetsss ~~ in_rels) @ |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
845 |
[rtac impI, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
846 |
CONJ_WRAP' (fn k => |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
847 |
EVERY' [rtac impI, dtac (mk_conjunctN n k), etac mp, rtac exI, rtac conjI, etac CollectI, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
848 |
rtac conjI, rtac refl, rtac refl]) ks]) 1 |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
849 |
end |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
850 |
|
| 55197 | 851 |
fun mk_dtor_map_unique_tac ctxt unfold_unique sym_map_comps = |
|
49504
df9b897fb254
renamed "iter"/"coiter" to "fold"/"unfold" (cf. Wadler)
blanchet
parents:
49501
diff
changeset
|
852 |
rtac unfold_unique 1 THEN |
| 55067 | 853 |
unfold_thms_tac ctxt (sym_map_comps @ @{thms comp_assoc[symmetric] id_comp comp_id}) THEN
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
854 |
ALLGOALS (etac sym); |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
855 |
|
| 55197 | 856 |
fun mk_col_natural_tac ctxt cts rec_0s rec_Sucs dtor_maps set_map0ss = |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
857 |
let |
| 49541 | 858 |
val n = length dtor_maps; |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
859 |
in |
| 49305 | 860 |
EVERY' [rtac (Drule.instantiate' [] cts nat_induct), |
|
49504
df9b897fb254
renamed "iter"/"coiter" to "fold"/"unfold" (cf. Wadler)
blanchet
parents:
49501
diff
changeset
|
861 |
REPEAT_DETERM o rtac allI, SELECT_GOAL (unfold_thms_tac ctxt rec_0s), |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
862 |
CONJ_WRAP' (K (rtac @{thm image_empty})) rec_0s,
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
863 |
REPEAT_DETERM o rtac allI, |
| 49541 | 864 |
CONJ_WRAP' (fn (rec_Suc, (dtor_map, set_nats)) => EVERY' |
|
49504
df9b897fb254
renamed "iter"/"coiter" to "fold"/"unfold" (cf. Wadler)
blanchet
parents:
49501
diff
changeset
|
865 |
[SELECT_GOAL (unfold_thms_tac ctxt |
| 49541 | 866 |
(rec_Suc :: dtor_map :: set_nats @ @{thms image_Un image_UN UN_simps(10)})),
|
|
52659
58b87aa4dc3b
eliminate duplicated theorems (thanks to "Auto solve_direct" in jEdit)
traytel
parents:
52635
diff
changeset
|
867 |
rtac Un_cong, rtac refl, |
|
58b87aa4dc3b
eliminate duplicated theorems (thanks to "Auto solve_direct" in jEdit)
traytel
parents:
52635
diff
changeset
|
868 |
CONJ_WRAP_GEN' (rtac (Thm.permute_prems 0 1 Un_cong)) |
|
56248
67dc9549fa15
generalized and strengthened cong rules on compound operators, similar to 1ed737a98198
haftmann
parents:
56179
diff
changeset
|
869 |
(fn i => EVERY' [rtac @{thm SUP_cong[OF refl]},
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
870 |
REPEAT_DETERM o etac allE, etac (mk_conjunctN n i)]) (n downto 1)]) |
| 53289 | 871 |
(rec_Sucs ~~ (dtor_maps ~~ set_map0ss))] 1 |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
872 |
end; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
873 |
|
| 56113 | 874 |
fun mk_set_map0_tac col_natural = |
875 |
EVERY' (map rtac [@{thm ext}, o_apply RS trans, sym, o_apply RS trans, @{thm image_UN} RS trans,
|
|
|
56248
67dc9549fa15
generalized and strengthened cong rules on compound operators, similar to 1ed737a98198
haftmann
parents:
56179
diff
changeset
|
876 |
refl RS @{thm SUP_cong}, col_natural]) 1;
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
877 |
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
878 |
fun mk_col_bd_tac m j cts rec_0s rec_Sucs sbd_Card_order sbd_Cinfinite set_sbdss = |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
879 |
let |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
880 |
val n = length rec_0s; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
881 |
in |
| 49305 | 882 |
EVERY' [rtac (Drule.instantiate' [] cts nat_induct), |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
883 |
REPEAT_DETERM o rtac allI, |
| 49305 | 884 |
CONJ_WRAP' (fn rec_0 => EVERY' (map rtac [ordIso_ordLeq_trans, |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
885 |
@{thm card_of_ordIso_subst}, rec_0, @{thm Card_order_empty}, sbd_Card_order])) rec_0s,
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
886 |
REPEAT_DETERM o rtac allI, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
887 |
CONJ_WRAP' (fn (rec_Suc, set_sbds) => EVERY' |
| 49305 | 888 |
[rtac ordIso_ordLeq_trans, rtac @{thm card_of_ordIso_subst}, rtac rec_Suc,
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
889 |
rtac (sbd_Cinfinite RSN (3, @{thm Un_Cinfinite_bound})), rtac (nth set_sbds (j - 1)),
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
890 |
REPEAT_DETERM_N (n - 1) o rtac (sbd_Cinfinite RSN (3, @{thm Un_Cinfinite_bound})),
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
891 |
EVERY' (map2 (fn i => fn set_sbd => EVERY' [rtac @{thm UNION_Cinfinite_bound},
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
892 |
rtac set_sbd, rtac ballI, REPEAT_DETERM o etac allE, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
893 |
etac (mk_conjunctN n i), rtac sbd_Cinfinite]) (1 upto n) (drop m set_sbds))]) |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
894 |
(rec_Sucs ~~ set_sbdss)] 1 |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
895 |
end; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
896 |
|
| 56113 | 897 |
fun mk_set_bd_tac sbd_Cinfinite col_bd = |
898 |
EVERY' (map rtac [@{thm UNION_Cinfinite_bound}, ordIso_ordLeq_trans, @{thm card_of_nat},
|
|
| 54793 | 899 |
@{thm natLeq_ordLeq_cinfinite}, sbd_Cinfinite, ballI, col_bd, sbd_Cinfinite]) 1;
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
900 |
|
| 57726 | 901 |
fun mk_le_rel_OO_tac coinduct rel_Jrels le_rel_OOs = |
902 |
EVERY' (rtac coinduct :: map2 (fn rel_Jrel => fn le_rel_OO => |
|
|
54841
af71b753c459
express weak pullback property of bnfs only in terms of the relator
traytel
parents:
54793
diff
changeset
|
903 |
let val Jrel_imp_rel = rel_Jrel RS iffD1; |
|
af71b753c459
express weak pullback property of bnfs only in terms of the relator
traytel
parents:
54793
diff
changeset
|
904 |
in |
| 57726 | 905 |
EVERY' [rtac (le_rel_OO RS @{thm predicate2D}), etac @{thm relcomppE},
|
|
54841
af71b753c459
express weak pullback property of bnfs only in terms of the relator
traytel
parents:
54793
diff
changeset
|
906 |
rtac @{thm relcomppI}, etac Jrel_imp_rel, etac Jrel_imp_rel]
|
|
af71b753c459
express weak pullback property of bnfs only in terms of the relator
traytel
parents:
54793
diff
changeset
|
907 |
end) |
| 57726 | 908 |
rel_Jrels le_rel_OOs) 1; |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
909 |
|
| 55197 | 910 |
fun mk_wit_tac ctxt n dtor_ctors dtor_set wit coind_wits = |
| 49104 | 911 |
ALLGOALS (TRY o (eresolve_tac coind_wits THEN' rtac refl)) THEN |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
912 |
REPEAT_DETERM (atac 1 ORELSE |
|
49585
5c4a12550491
generate high-level "maps", "sets", and "rels" properties
blanchet
parents:
49581
diff
changeset
|
913 |
EVERY' [dtac set_rev_mp, rtac equalityD1, resolve_tac dtor_set, |
|
49504
df9b897fb254
renamed "iter"/"coiter" to "fold"/"unfold" (cf. Wadler)
blanchet
parents:
49501
diff
changeset
|
914 |
K (unfold_thms_tac ctxt dtor_ctors), |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
915 |
REPEAT_DETERM_N n o etac UnE, |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
916 |
REPEAT_DETERM o |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
917 |
(TRY o REPEAT_DETERM o etac UnE THEN' TRY o etac @{thm UN_E} THEN'
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
918 |
(eresolve_tac wit ORELSE' |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
919 |
(dresolve_tac wit THEN' |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
920 |
(etac FalseE ORELSE' |
| 51798 | 921 |
EVERY' [hyp_subst_tac ctxt, dtac set_rev_mp, rtac equalityD1, resolve_tac dtor_set, |
|
49504
df9b897fb254
renamed "iter"/"coiter" to "fold"/"unfold" (cf. Wadler)
blanchet
parents:
49501
diff
changeset
|
922 |
K (unfold_thms_tac ctxt dtor_ctors), REPEAT_DETERM_N n o etac UnE]))))] 1); |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
923 |
|
| 55197 | 924 |
fun mk_coind_wit_tac ctxt induct unfolds set_nats wits = |
| 51798 | 925 |
rtac induct 1 THEN ALLGOALS (TRY o rtac impI THEN' TRY o hyp_subst_tac ctxt) THEN |
|
49504
df9b897fb254
renamed "iter"/"coiter" to "fold"/"unfold" (cf. Wadler)
blanchet
parents:
49501
diff
changeset
|
926 |
unfold_thms_tac ctxt (unfolds @ set_nats @ @{thms image_id id_apply}) THEN
|
| 51798 | 927 |
ALLGOALS (REPEAT_DETERM o etac imageE THEN' TRY o hyp_subst_tac ctxt) THEN |
| 49104 | 928 |
ALLGOALS (TRY o |
929 |
FIRST' [rtac TrueI, rtac refl, etac (refl RSN (2, mp)), dresolve_tac wits THEN' etac FalseE]) |
|
930 |
||
| 53287 | 931 |
fun mk_dtor_rel_tac ctxt in_Jrels i in_rel map_comp0 map_cong0 dtor_map dtor_sets dtor_inject |
| 53289 | 932 |
dtor_ctor set_map0s dtor_set_incls dtor_set_set_inclss = |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
933 |
let |
|
49544
24094fa47e0d
renamed "set_incl" etc. to have "ctor" or "dtor" in the name
blanchet
parents:
49543
diff
changeset
|
934 |
val m = length dtor_set_incls; |
|
24094fa47e0d
renamed "set_incl" etc. to have "ctor" or "dtor" in the name
blanchet
parents:
49543
diff
changeset
|
935 |
val n = length dtor_set_set_inclss; |
| 53289 | 936 |
val (passive_set_map0s, active_set_map0s) = chop m set_map0s; |
|
51893
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51850
diff
changeset
|
937 |
val in_Jrel = nth in_Jrels (i - 1); |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
938 |
val if_tac = |
|
51893
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51850
diff
changeset
|
939 |
EVERY' [dtac (in_Jrel RS iffD1), REPEAT_DETERM o eresolve_tac [exE, conjE, CollectE], |
|
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51850
diff
changeset
|
940 |
rtac (in_rel RS iffD2), rtac exI, rtac conjI, rtac CollectI, |
| 53289 | 941 |
EVERY' (map2 (fn set_map0 => fn set_incl => |
942 |
EVERY' [rtac conjI, rtac ord_eq_le_trans, rtac set_map0, |
|
| 49305 | 943 |
rtac ord_eq_le_trans, rtac trans_fun_cong_image_id_id_apply, |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
944 |
etac (set_incl RS @{thm subset_trans})])
|
| 53289 | 945 |
passive_set_map0s dtor_set_incls), |
946 |
CONJ_WRAP' (fn (in_Jrel, (set_map0, dtor_set_set_incls)) => |
|
947 |
EVERY' [rtac ord_eq_le_trans, rtac set_map0, rtac @{thm image_subsetI}, rtac CollectI,
|
|
|
55414
eab03e9cee8a
renamed '{prod,sum,bool,unit}_case' to 'case_...'
blanchet
parents:
55393
diff
changeset
|
948 |
rtac @{thm case_prodI}, rtac (in_Jrel RS iffD2), rtac exI, rtac conjI, rtac CollectI,
|
|
49544
24094fa47e0d
renamed "set_incl" etc. to have "ctor" or "dtor" in the name
blanchet
parents:
49543
diff
changeset
|
949 |
CONJ_WRAP' (fn thm => etac (thm RS @{thm subset_trans}) THEN' atac) dtor_set_set_incls,
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
950 |
rtac conjI, rtac refl, rtac refl]) |
| 53289 | 951 |
(in_Jrels ~~ (active_set_map0s ~~ dtor_set_set_inclss)), |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
952 |
CONJ_WRAP' (fn conv => |
| 53287 | 953 |
EVERY' [rtac trans, rtac map_comp0, rtac trans, rtac map_cong0, |
| 55067 | 954 |
REPEAT_DETERM_N m o rtac @{thm fun_cong[OF comp_id]},
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
955 |
REPEAT_DETERM_N n o EVERY' (map rtac [trans, o_apply, conv]), |
| 49541 | 956 |
rtac trans, rtac sym, rtac dtor_map, rtac (dtor_inject RS iffD2), atac]) |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
957 |
@{thms fst_conv snd_conv}];
|
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
958 |
val only_if_tac = |
|
51893
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51850
diff
changeset
|
959 |
EVERY' [dtac (in_rel RS iffD1), REPEAT_DETERM o eresolve_tac [exE, conjE, CollectE], |
|
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51850
diff
changeset
|
960 |
rtac (in_Jrel RS iffD2), rtac exI, rtac conjI, rtac CollectI, |
| 53289 | 961 |
CONJ_WRAP' (fn (dtor_set, passive_set_map0) => |
|
49585
5c4a12550491
generate high-level "maps", "sets", and "rels" properties
blanchet
parents:
49581
diff
changeset
|
962 |
EVERY' [rtac ord_eq_le_trans, rtac dtor_set, rtac @{thm Un_least},
|
| 55990 | 963 |
rtac ord_eq_le_trans, rtac @{thm box_equals}, rtac passive_set_map0,
|
| 49501 | 964 |
rtac (dtor_ctor RS sym RS arg_cong), rtac trans_fun_cong_image_id_id_apply, atac, |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
965 |
CONJ_WRAP_GEN' (rtac (Thm.permute_prems 0 1 @{thm Un_least}))
|
| 53289 | 966 |
(fn (active_set_map0, in_Jrel) => EVERY' [rtac ord_eq_le_trans, |
|
56248
67dc9549fa15
generalized and strengthened cong rules on compound operators, similar to 1ed737a98198
haftmann
parents:
56179
diff
changeset
|
967 |
rtac @{thm SUP_cong[OF _ refl]}, rtac @{thm box_equals[OF _ _ refl]},
|
| 53289 | 968 |
rtac active_set_map0, rtac (dtor_ctor RS sym RS arg_cong), rtac @{thm UN_least},
|
| 49305 | 969 |
dtac set_rev_mp, etac @{thm image_mono}, etac imageE,
|
|
51893
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51850
diff
changeset
|
970 |
dtac @{thm ssubst_mem[OF pair_collapse]},
|
|
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51850
diff
changeset
|
971 |
REPEAT_DETERM o eresolve_tac (CollectE :: conjE :: |
| 56765 | 972 |
@{thms case_prodE iffD1[OF prod.inject, elim_format]}),
|
|
51893
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51850
diff
changeset
|
973 |
hyp_subst_tac ctxt, |
|
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51850
diff
changeset
|
974 |
dtac (in_Jrel RS iffD1), |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
975 |
dtac @{thm someI_ex}, REPEAT_DETERM o etac conjE,
|
|
51893
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51850
diff
changeset
|
976 |
REPEAT_DETERM o eresolve_tac [CollectE, conjE], atac]) |
| 53289 | 977 |
(rev (active_set_map0s ~~ in_Jrels))]) |
978 |
(dtor_sets ~~ passive_set_map0s), |
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
979 |
rtac conjI, |
| 49541 | 980 |
REPEAT_DETERM_N 2 o EVERY'[rtac (dtor_inject RS iffD1), rtac trans, rtac dtor_map, |
| 55990 | 981 |
rtac @{thm box_equals}, rtac map_comp0, rtac (dtor_ctor RS sym RS arg_cong), rtac trans,
|
| 55067 | 982 |
rtac map_cong0, REPEAT_DETERM_N m o rtac @{thm fun_cong[OF comp_id]},
|
|
51893
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51850
diff
changeset
|
983 |
EVERY' (map (fn in_Jrel => EVERY' [rtac trans, rtac o_apply, dtac set_rev_mp, atac, |
|
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51850
diff
changeset
|
984 |
dtac @{thm ssubst_mem[OF pair_collapse]},
|
| 56765 | 985 |
REPEAT_DETERM o eresolve_tac (CollectE :: conjE :: |
986 |
@{thms case_prodE iffD1[OF prod.inject, elim_format]}),
|
|
|
51893
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51850
diff
changeset
|
987 |
hyp_subst_tac ctxt, dtac (in_Jrel RS iffD1), |
|
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51850
diff
changeset
|
988 |
dtac @{thm someI_ex}, REPEAT_DETERM o etac conjE, atac]) in_Jrels),
|
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
989 |
atac]] |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
990 |
in |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
991 |
EVERY' [rtac iffI, if_tac, only_if_tac] 1 |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
992 |
end; |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
993 |
|
| 55644 | 994 |
fun mk_rel_coinduct_coind_tac ctxt fst m coinduct ks map_comp0s map_congs map_arg_congs set_map0ss |
995 |
dtor_unfolds dtor_maps in_rels = |
|
996 |
let |
|
997 |
val n = length ks; |
|
998 |
val fst_diag_nth = if fst then @{thm fst_diag_fst} else @{thm fst_diag_snd};
|
|
999 |
val snd_diag_nth = if fst then @{thm snd_diag_fst} else @{thm snd_diag_snd};
|
|
| 51925 | 1000 |
in |
| 55602 | 1001 |
EVERY' [rtac coinduct, |
| 55644 | 1002 |
EVERY' (map8 (fn i => fn map_comp0 => fn map_cong => fn map_arg_cong => fn set_map0s => |
1003 |
fn dtor_unfold => fn dtor_map => fn in_rel => |
|
1004 |
EVERY' [REPEAT_DETERM o resolve_tac [allI, impI, in_rel RS iffD2], |
|
1005 |
REPEAT_DETERM o eresolve_tac [exE, conjE], |
|
| 51925 | 1006 |
select_prem_tac (length ks) (dtac @{thm spec2}) i, dtac mp, atac,
|
1007 |
REPEAT_DETERM o eresolve_tac [CollectE, conjE], hyp_subst_tac ctxt, |
|
| 55644 | 1008 |
rtac exI, rtac (Drule.rotate_prems 1 conjI), rtac conjI, |
| 53287 | 1009 |
rtac (map_comp0 RS trans), rtac (dtor_map RS trans RS sym), |
1010 |
rtac (dtor_unfold RS map_arg_cong RS trans), rtac (trans OF [map_comp0, map_cong]), |
|
| 55644 | 1011 |
REPEAT_DETERM_N m o rtac (fst_diag_nth RS @{thm fun_cong[OF trans[OF o_id sym]]}),
|
| 51925 | 1012 |
REPEAT_DETERM_N n o (rtac @{thm sym[OF trans[OF o_apply]]} THEN' rtac @{thm fst_conv}),
|
| 53287 | 1013 |
rtac (map_comp0 RS trans), rtac (map_cong RS trans), |
| 55644 | 1014 |
REPEAT_DETERM_N m o rtac (snd_diag_nth RS fun_cong), |
| 51925 | 1015 |
REPEAT_DETERM_N n o (rtac @{thm trans[OF o_apply]} THEN' rtac @{thm snd_conv}),
|
|
55642
63beb38e9258
adapted to renaming of datatype 'cases' and 'recs' to 'case' and 'rec'
blanchet
parents:
55606
diff
changeset
|
1016 |
etac (@{thm prod.case} RS map_arg_cong RS trans),
|
| 55644 | 1017 |
SELECT_GOAL (unfold_thms_tac ctxt @{thms prod.case o_def fst_conv snd_conv}),
|
1018 |
rtac CollectI, |
|
| 53289 | 1019 |
CONJ_WRAP' (fn set_map0 => |
| 55644 | 1020 |
EVERY' [rtac (set_map0 RS ord_eq_le_trans), |
1021 |
rtac @{thm image_subsetI}, rtac CollectI, rtac @{thm case_prodI},
|
|
1022 |
FIRST' [rtac refl, EVERY'[rtac exI, rtac conjI, etac Collect_splitD_set_mp, atac, |
|
1023 |
rtac (@{thm surjective_pairing} RS arg_cong)]]])
|
|
1024 |
set_map0s]) |
|
1025 |
ks map_comp0s map_congs map_arg_congs set_map0ss dtor_unfolds dtor_maps in_rels)] 1 |
|
| 51925 | 1026 |
end; |
1027 |
||
|
55642
63beb38e9258
adapted to renaming of datatype 'cases' and 'recs' to 'case' and 'rec'
blanchet
parents:
55606
diff
changeset
|
1028 |
val split_id_unfolds = @{thms prod.case image_id id_apply};
|
| 51925 | 1029 |
|
| 55197 | 1030 |
fun mk_rel_coinduct_ind_tac ctxt m ks unfolds set_map0ss j set_induct = |
| 51925 | 1031 |
let val n = length ks; |
1032 |
in |
|
1033 |
rtac set_induct 1 THEN |
|
| 53289 | 1034 |
EVERY' (map3 (fn unfold => fn set_map0s => fn i => |
| 51925 | 1035 |
EVERY' [REPEAT_DETERM o resolve_tac [allI, impI], etac conjE, |
1036 |
select_prem_tac n (dtac @{thm spec2}) i, dtac mp, atac,
|
|
1037 |
REPEAT_DETERM o eresolve_tac [CollectE, conjE, Collect_splitD_set_mp, set_rev_mp], |
|
1038 |
hyp_subst_tac ctxt, |
|
| 53289 | 1039 |
SELECT_GOAL (unfold_thms_tac ctxt ([unfold, nth set_map0s (j - 1)] @ split_id_unfolds)), |
| 51925 | 1040 |
rtac subset_refl]) |
| 53289 | 1041 |
unfolds set_map0ss ks) 1 THEN |
1042 |
EVERY' (map3 (fn unfold => fn set_map0s => fn i => |
|
1043 |
EVERY' (map (fn set_map0 => |
|
| 51925 | 1044 |
EVERY' [REPEAT_DETERM o resolve_tac [allI, impI], etac conjE, |
1045 |
select_prem_tac n (dtac @{thm spec2}) i, dtac mp, atac,
|
|
1046 |
REPEAT_DETERM o eresolve_tac [CollectE, conjE], hyp_subst_tac ctxt, |
|
| 53289 | 1047 |
SELECT_GOAL (unfold_thms_tac ctxt ([unfold, set_map0] @ split_id_unfolds)), |
| 51925 | 1048 |
etac imageE, hyp_subst_tac ctxt, REPEAT_DETERM o eresolve_tac [allE, mp], |
1049 |
rtac conjI, etac Collect_splitD_set_mp, atac, rtac (@{thm surjective_pairing} RS arg_cong)])
|
|
| 53289 | 1050 |
(drop m set_map0s))) |
1051 |
unfolds set_map0ss ks) 1 |
|
| 51925 | 1052 |
end; |
1053 |
||
| 55197 | 1054 |
fun mk_rel_coinduct_tac ctxt CIHs in_rels in_Jrels helper_indss helper_coind1s helper_coind2s = |
| 51925 | 1055 |
let val n = length in_rels; |
1056 |
in |
|
| 52506 | 1057 |
Method.insert_tac CIHs 1 THEN |
| 51925 | 1058 |
unfold_thms_tac ctxt (@{thm choice_iff} :: @{thm ex_simps(6)[symmetric]} :: in_rels) THEN
|
1059 |
REPEAT_DETERM (etac exE 1) THEN |
|
1060 |
CONJ_WRAP' (fn (in_Jrel, (helper_inds, (helper_coind1, helper_coind2))) => |
|
1061 |
EVERY' [rtac @{thm predicate2I}, rtac (in_Jrel RS iffD2), rtac exI, rtac conjI,
|
|
1062 |
if null helper_inds then rtac UNIV_I |
|
1063 |
else rtac CollectI THEN' |
|
1064 |
CONJ_WRAP' (fn helper_ind => |
|
1065 |
EVERY' [rtac (helper_ind RS rev_mp), REPEAT_DETERM_N n o atac, |
|
1066 |
REPEAT_DETERM_N n o etac thin_rl, rtac impI, |
|
1067 |
REPEAT_DETERM o resolve_tac [subsetI, CollectI, @{thm iffD2[OF split_beta]}],
|
|
1068 |
dtac bspec, atac, REPEAT_DETERM o eresolve_tac [allE, mp, conjE], |
|
1069 |
etac (refl RSN (2, conjI))]) |
|
1070 |
helper_inds, |
|
1071 |
rtac conjI, |
|
1072 |
rtac (helper_coind1 RS rev_mp), REPEAT_DETERM_N n o atac, REPEAT_DETERM_N n o etac thin_rl, |
|
1073 |
rtac impI, etac mp, rtac exI, etac (refl RSN (2, conjI)), |
|
1074 |
rtac (helper_coind2 RS rev_mp), REPEAT_DETERM_N n o atac, REPEAT_DETERM_N n o etac thin_rl, |
|
1075 |
rtac impI, etac mp, rtac exI, etac (refl RSN (2, conjI))]) |
|
1076 |
(in_Jrels ~~ (helper_indss ~~ (helper_coind1s ~~ helper_coind2s))) 1 |
|
1077 |
end; |
|
1078 |
||
|
55901
8c6d49dd8ae1
renamed a pair of low-level theorems to have c/dtor in their names (like the others)
blanchet
parents:
55644
diff
changeset
|
1079 |
fun mk_unfold_transfer_tac ctxt m ctor_rel_coinduct map_transfers unfolds = |
| 52731 | 1080 |
let |
1081 |
val n = length map_transfers; |
|
1082 |
in |
|
1083 |
unfold_thms_tac ctxt |
|
| 55945 | 1084 |
@{thms rel_fun_def_butlast all_conj_distrib[symmetric] imp_conjR[symmetric]} THEN
|
1085 |
unfold_thms_tac ctxt @{thms rel_fun_iff_geq_image2p} THEN
|
|
| 52731 | 1086 |
HEADGOAL (EVERY' |
|
55901
8c6d49dd8ae1
renamed a pair of low-level theorems to have c/dtor in their names (like the others)
blanchet
parents:
55644
diff
changeset
|
1087 |
[REPEAT_DETERM o resolve_tac [allI, impI], rtac ctor_rel_coinduct, |
| 52731 | 1088 |
EVERY' (map (fn map_transfer => EVERY' |
1089 |
[REPEAT_DETERM o resolve_tac [allI, impI], etac @{thm image2pE}, hyp_subst_tac ctxt,
|
|
1090 |
SELECT_GOAL (unfold_thms_tac ctxt unfolds), |
|
| 55945 | 1091 |
rtac (funpow (m + n + 1) (fn thm => thm RS @{thm rel_funD}) map_transfer),
|
| 52731 | 1092 |
REPEAT_DETERM_N m o rtac @{thm id_transfer},
|
| 55945 | 1093 |
REPEAT_DETERM_N n o rtac @{thm rel_fun_image2p},
|
| 52731 | 1094 |
etac @{thm predicate2D}, etac @{thm image2pI}])
|
1095 |
map_transfers)]) |
|
1096 |
end; |
|
1097 |
||
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
1098 |
end; |