src/HOL/Codatatype/Tools/bnf_sugar_tactics.ML
author blanchet
Thu, 30 Aug 2012 15:57:14 +0200
changeset 49031 632ee0da3c5b
parent 49030 d0f4f113e43d
child 49032 c2a7bedd57d8
permissions -rw-r--r--
generate "case_disc" property
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
632ee0da3c5b generate "case_disc" property
blanchet
parents: 49030
diff changeset
    10
  val mk_case_disc_tac: Proof.context -> thm -> thm list -> thm list -> thm list list -> tactic
49030
d0f4f113e43d generate "ctr_sels" theorems
blanchet
parents: 49029
diff changeset
    11
  val mk_ctr_sel_tac: Proof.context -> int -> thm -> thm list -> tactic
49029
f0ecfa9575a9 generate "disc_exhaust" property
blanchet
parents: 49028
diff changeset
    12
  val mk_disc_exhaust_tac: int -> thm -> thm list -> tactic
f0ecfa9575a9 generate "disc_exhaust" property
blanchet
parents: 49028
diff changeset
    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
487427a02bee generate "disc_distinct" theorems
blanchet
parents: 49022
diff changeset
    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
f0ecfa9575a9 generate "disc_exhaust" property
blanchet
parents: 49028
diff changeset
    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
632ee0da3c5b generate "case_disc" property
blanchet
parents: 49030
diff changeset
    24
fun eq_True_or_False thm =
632ee0da3c5b generate "case_disc" property
blanchet
parents: 49030
diff changeset
    25
  thm RS @{thm eq_False[THEN iffD2]}
632ee0da3c5b generate "case_disc" property
blanchet
parents: 49030
diff changeset
    26
  handle THM _ => thm RS @{thm eq_True[THEN iffD2]}
632ee0da3c5b generate "case_disc" property
blanchet
parents: 49030
diff changeset
    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
005ce926a932 define selectors and discriminators
blanchet
parents: 49020
diff changeset
    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
d0f4f113e43d generate "ctr_sels" theorems
blanchet
parents: 49029
diff changeset
    32
fun mk_half_disc_disjoint_tac m discD disc'_thm =
d0f4f113e43d generate "ctr_sels" theorems
blanchet
parents: 49029
diff changeset
    33
  (dtac discD THEN'
49028
487427a02bee generate "disc_distinct" theorems
blanchet
parents: 49022
diff changeset
    34
   REPEAT_DETERM_N m o etac exE THEN'
487427a02bee generate "disc_distinct" theorems
blanchet
parents: 49022
diff changeset
    35
   hyp_subst_tac THEN'
487427a02bee generate "disc_distinct" theorems
blanchet
parents: 49022
diff changeset
    36
   rtac disc'_thm) 1;
487427a02bee generate "disc_distinct" theorems
blanchet
parents: 49022
diff changeset
    37
487427a02bee generate "disc_distinct" theorems
blanchet
parents: 49022
diff changeset
    38
fun mk_other_half_disc_disjoint_tac half_thm =
487427a02bee generate "disc_distinct" theorems
blanchet
parents: 49022
diff changeset
    39
  (etac @{thm contrapos_pn} THEN' etac half_thm) 1;
487427a02bee generate "disc_distinct" theorems
blanchet
parents: 49022
diff changeset
    40
49029
f0ecfa9575a9 generate "disc_exhaust" property
blanchet
parents: 49028
diff changeset
    41
fun mk_disc_exhaust_tac n exhaust discIs =
f0ecfa9575a9 generate "disc_exhaust" property
blanchet
parents: 49028
diff changeset
    42
  (rtac exhaust THEN'
f0ecfa9575a9 generate "disc_exhaust" property
blanchet
parents: 49028
diff changeset
    43
   EVERY' (map2 (fn k => fn discI =>
f0ecfa9575a9 generate "disc_exhaust" property
blanchet
parents: 49028
diff changeset
    44
     dtac discI THEN' select_prem_tac n (etac @{thm meta_mp}) k THEN' atac) (1 upto n) discIs)) 1;
f0ecfa9575a9 generate "disc_exhaust" property
blanchet
parents: 49028
diff changeset
    45
49030
d0f4f113e43d generate "ctr_sels" theorems
blanchet
parents: 49029
diff changeset
    46
fun mk_ctr_sel_tac ctxt m discD sel_thms =
d0f4f113e43d generate "ctr_sels" theorems
blanchet
parents: 49029
diff changeset
    47
  (dtac discD THEN'
d0f4f113e43d generate "ctr_sels" theorems
blanchet
parents: 49029
diff changeset
    48
   (if m = 0 then
d0f4f113e43d generate "ctr_sels" theorems
blanchet
parents: 49029
diff changeset
    49
      atac
d0f4f113e43d generate "ctr_sels" theorems
blanchet
parents: 49029
diff changeset
    50
    else
d0f4f113e43d generate "ctr_sels" theorems
blanchet
parents: 49029
diff changeset
    51
      REPEAT_DETERM_N m o etac exE THEN'
d0f4f113e43d generate "ctr_sels" theorems
blanchet
parents: 49029
diff changeset
    52
      hyp_subst_tac THEN'
49031
632ee0da3c5b generate "case_disc" property
blanchet
parents: 49030
diff changeset
    53
      SELECT_GOAL (Local_Defs.unfold_tac ctxt sel_thms) THEN'
49030
d0f4f113e43d generate "ctr_sels" theorems
blanchet
parents: 49029
diff changeset
    54
      rtac refl)) 1;
d0f4f113e43d generate "ctr_sels" theorems
blanchet
parents: 49029
diff changeset
    55
49031
632ee0da3c5b generate "case_disc" property
blanchet
parents: 49030
diff changeset
    56
fun mk_case_disc_tac ctxt exhaust case_thms disc_thms sel_thmss =
632ee0da3c5b generate "case_disc" property
blanchet
parents: 49030
diff changeset
    57
  let val base_unfolds = @{thms if_True if_False} @ map eq_True_or_False disc_thms in
632ee0da3c5b generate "case_disc" property
blanchet
parents: 49030
diff changeset
    58
    (rtac exhaust THEN'
632ee0da3c5b generate "case_disc" property
blanchet
parents: 49030
diff changeset
    59
     EVERY' (map2 (fn case_thm => fn sel_thms => EVERY' [
632ee0da3c5b generate "case_disc" property
blanchet
parents: 49030
diff changeset
    60
       hyp_subst_tac THEN'
632ee0da3c5b generate "case_disc" property
blanchet
parents: 49030
diff changeset
    61
       SELECT_GOAL (Local_Defs.unfold_tac ctxt (base_unfolds @ sel_thms)) THEN'
632ee0da3c5b generate "case_disc" property
blanchet
parents: 49030
diff changeset
    62
       rtac case_thm]) case_thms sel_thmss)) 1
632ee0da3c5b generate "case_disc" property
blanchet
parents: 49030
diff changeset
    63
  end;
632ee0da3c5b generate "case_disc" property
blanchet
parents: 49030
diff changeset
    64
49020
f379cf5d71bd more work on BNF sugar -- up to derivation of nchotomy
blanchet
parents:
diff changeset
    65
end;