author | blanchet |
Thu, 30 Aug 2012 15:57:14 +0200 | |
changeset 49031 | 632ee0da3c5b |
parent 49030 | d0f4f113e43d |
child 49032 | c2a7bedd57d8 |
permissions | -rw-r--r-- |
49020
f379cf5d71bd
more work on BNF sugar -- up to derivation of nchotomy
blanchet
parents:
diff
changeset
|
1 |
(* Title: HOL/Codatatype/Tools/bnf_sugar_tactics.ML |
f379cf5d71bd
more work on BNF sugar -- up to derivation of nchotomy
blanchet
parents:
diff
changeset
|
2 |
Author: Jasmin Blanchette, TU Muenchen |
f379cf5d71bd
more work on BNF sugar -- up to derivation of nchotomy
blanchet
parents:
diff
changeset
|
3 |
Copyright 2012 |
f379cf5d71bd
more work on BNF sugar -- up to derivation of nchotomy
blanchet
parents:
diff
changeset
|
4 |
|
f379cf5d71bd
more work on BNF sugar -- up to derivation of nchotomy
blanchet
parents:
diff
changeset
|
5 |
Tactics for sugar on top of a BNF. |
f379cf5d71bd
more work on BNF sugar -- up to derivation of nchotomy
blanchet
parents:
diff
changeset
|
6 |
*) |
f379cf5d71bd
more work on BNF sugar -- up to derivation of nchotomy
blanchet
parents:
diff
changeset
|
7 |
|
f379cf5d71bd
more work on BNF sugar -- up to derivation of nchotomy
blanchet
parents:
diff
changeset
|
8 |
signature BNF_SUGAR_TACTICS = |
f379cf5d71bd
more work on BNF sugar -- up to derivation of nchotomy
blanchet
parents:
diff
changeset
|
9 |
sig |
49031 | 10 |
val mk_case_disc_tac: Proof.context -> thm -> thm list -> thm list -> thm list list -> tactic |
49030 | 11 |
val mk_ctr_sel_tac: Proof.context -> int -> thm -> thm list -> tactic |
49029 | 12 |
val mk_disc_exhaust_tac: int -> thm -> thm list -> tactic |
13 |
val mk_half_disc_disjoint_tac: int -> thm -> thm -> tactic |
|
49020
f379cf5d71bd
more work on BNF sugar -- up to derivation of nchotomy
blanchet
parents:
diff
changeset
|
14 |
val mk_nchotomy_tac: int -> thm -> tactic |
49028 | 15 |
val mk_other_half_disc_disjoint_tac: thm -> tactic |
49020
f379cf5d71bd
more work on BNF sugar -- up to derivation of nchotomy
blanchet
parents:
diff
changeset
|
16 |
end; |
f379cf5d71bd
more work on BNF sugar -- up to derivation of nchotomy
blanchet
parents:
diff
changeset
|
17 |
|
f379cf5d71bd
more work on BNF sugar -- up to derivation of nchotomy
blanchet
parents:
diff
changeset
|
18 |
structure BNF_Sugar_Tactics : BNF_SUGAR_TACTICS = |
f379cf5d71bd
more work on BNF sugar -- up to derivation of nchotomy
blanchet
parents:
diff
changeset
|
19 |
struct |
f379cf5d71bd
more work on BNF sugar -- up to derivation of nchotomy
blanchet
parents:
diff
changeset
|
20 |
|
49029 | 21 |
open BNF_Tactics |
49020
f379cf5d71bd
more work on BNF sugar -- up to derivation of nchotomy
blanchet
parents:
diff
changeset
|
22 |
open BNF_FP_Util |
f379cf5d71bd
more work on BNF sugar -- up to derivation of nchotomy
blanchet
parents:
diff
changeset
|
23 |
|
49031 | 24 |
fun eq_True_or_False thm = |
25 |
thm RS @{thm eq_False[THEN iffD2]} |
|
26 |
handle THM _ => thm RS @{thm eq_True[THEN iffD2]} |
|
27 |
||
49020
f379cf5d71bd
more work on BNF sugar -- up to derivation of nchotomy
blanchet
parents:
diff
changeset
|
28 |
fun mk_nchotomy_tac n exhaust = |
f379cf5d71bd
more work on BNF sugar -- up to derivation of nchotomy
blanchet
parents:
diff
changeset
|
29 |
(rtac allI THEN' rtac exhaust THEN' |
49022 | 30 |
EVERY' (maps (fn k => [rtac (mk_disjIN n k), REPEAT_DETERM o rtac exI, atac]) (1 upto n))) 1; |
49020
f379cf5d71bd
more work on BNF sugar -- up to derivation of nchotomy
blanchet
parents:
diff
changeset
|
31 |
|
49030 | 32 |
fun mk_half_disc_disjoint_tac m discD disc'_thm = |
33 |
(dtac discD THEN' |
|
49028 | 34 |
REPEAT_DETERM_N m o etac exE THEN' |
35 |
hyp_subst_tac THEN' |
|
36 |
rtac disc'_thm) 1; |
|
37 |
||
38 |
fun mk_other_half_disc_disjoint_tac half_thm = |
|
39 |
(etac @{thm contrapos_pn} THEN' etac half_thm) 1; |
|
40 |
||
49029 | 41 |
fun mk_disc_exhaust_tac n exhaust discIs = |
42 |
(rtac exhaust THEN' |
|
43 |
EVERY' (map2 (fn k => fn discI => |
|
44 |
dtac discI THEN' select_prem_tac n (etac @{thm meta_mp}) k THEN' atac) (1 upto n) discIs)) 1; |
|
45 |
||
49030 | 46 |
fun mk_ctr_sel_tac ctxt m discD sel_thms = |
47 |
(dtac discD THEN' |
|
48 |
(if m = 0 then |
|
49 |
atac |
|
50 |
else |
|
51 |
REPEAT_DETERM_N m o etac exE THEN' |
|
52 |
hyp_subst_tac THEN' |
|
49031 | 53 |
SELECT_GOAL (Local_Defs.unfold_tac ctxt sel_thms) THEN' |
49030 | 54 |
rtac refl)) 1; |
55 |
||
49031 | 56 |
fun mk_case_disc_tac ctxt exhaust case_thms disc_thms sel_thmss = |
57 |
let val base_unfolds = @{thms if_True if_False} @ map eq_True_or_False disc_thms in |
|
58 |
(rtac exhaust THEN' |
|
59 |
EVERY' (map2 (fn case_thm => fn sel_thms => EVERY' [ |
|
60 |
hyp_subst_tac THEN' |
|
61 |
SELECT_GOAL (Local_Defs.unfold_tac ctxt (base_unfolds @ sel_thms)) THEN' |
|
62 |
rtac case_thm]) case_thms sel_thmss)) 1 |
|
63 |
end; |
|
64 |
||
49020
f379cf5d71bd
more work on BNF sugar -- up to derivation of nchotomy
blanchet
parents:
diff
changeset
|
65 |
end; |