src/HOL/Tools/BNF/bnf_fp_util_tactics.ML
author traytel
Mon, 10 Apr 2017 18:01:46 +0200
changeset 65436 1fd2dca8eb60
parent 63045 c50c764aab10
child 67399 eab6ce8368fa
permissions -rw-r--r--
tuned signature
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
62905
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
     1
(*  Title:      HOL/Tools/BNF/bnf_fp_util_tactics.ML
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
     2
    Author:     Dmitriy Traytel, ETH Zürich
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
     3
    Copyright   2016
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
     4
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
     5
Common tactics for datatype and codatatype constructions.
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
     6
*)
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
     7
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
     8
signature BNF_FP_UTIL_TACTICS =
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
     9
sig
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    10
63045
c50c764aab10 n2m operates on (un)folds
traytel
parents: 62905
diff changeset
    11
val mk_xtor_un_fold_xtor_tac: Proof.context -> thm -> thm list -> thm list -> tactic
62905
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    12
val mk_xtor_co_rec_id_tac: Proof.context -> thm list -> thm -> thm list -> thm list -> tactic
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    13
val mk_xtor_co_rec_tac: Proof.context -> thm -> thm list -> thm list -> tactic
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    14
val mk_xtor_co_rec_unique_tac: Proof.context -> BNF_Util.fp_kind -> thm list -> thm list -> thm ->
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    15
  thm list -> thm list -> tactic
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    16
val mk_xtor_co_rec_transfer_tac: Proof.context -> BNF_Util.fp_kind -> int -> int -> thm list ->
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    17
  thm list -> thm list -> thm list -> tactic
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    18
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    19
end
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    20
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    21
structure BNF_FP_Util_Tactics =
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    22
struct
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    23
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    24
open BNF_Tactics
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    25
open BNF_Util
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    26
63045
c50c764aab10 n2m operates on (un)folds
traytel
parents: 62905
diff changeset
    27
fun mk_xtor_un_fold_xtor_tac ctxt xtor_un_fold_unique map_id0s inverses =
c50c764aab10 n2m operates on (un)folds
traytel
parents: 62905
diff changeset
    28
  HEADGOAL (rtac ctxt xtor_un_fold_unique THEN_ALL_NEW rtac ctxt ext) THEN
c50c764aab10 n2m operates on (un)folds
traytel
parents: 62905
diff changeset
    29
  unfold_thms_tac ctxt (@{thms o_apply id_o o_id} @ map_id0s @ inverses) THEN
c50c764aab10 n2m operates on (un)folds
traytel
parents: 62905
diff changeset
    30
  ALLGOALS (rtac ctxt refl);
c50c764aab10 n2m operates on (un)folds
traytel
parents: 62905
diff changeset
    31
c50c764aab10 n2m operates on (un)folds
traytel
parents: 62905
diff changeset
    32
fun mk_conj_arg_congN 1 = @{thm DEADID.rel_mono_strong}
c50c764aab10 n2m operates on (un)folds
traytel
parents: 62905
diff changeset
    33
  | mk_conj_arg_congN n = mk_conj_arg_congN (n - 1) RSN (2, @{thm arg_cong2[of _ _ _ _ "op \<and>"]});
c50c764aab10 n2m operates on (un)folds
traytel
parents: 62905
diff changeset
    34
62905
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    35
fun mk_xtor_co_rec_id_tac ctxt xtor_un_fold_xtors xtor_un_fold_unique xtor_un_folds map_comps =
63045
c50c764aab10 n2m operates on (un)folds
traytel
parents: 62905
diff changeset
    36
  HEADGOAL (rtac ctxt (mk_conj_arg_congN (length xtor_un_fold_xtors) RS iffD1 OF
c50c764aab10 n2m operates on (un)folds
traytel
parents: 62905
diff changeset
    37
    (map (fn thm => @{thm DEADID.rel_cong} OF [refl, thm]) xtor_un_fold_xtors)) THEN'
c50c764aab10 n2m operates on (un)folds
traytel
parents: 62905
diff changeset
    38
    rtac ctxt xtor_un_fold_unique THEN_ALL_NEW EVERY' [rtac ctxt ext,
c50c764aab10 n2m operates on (un)folds
traytel
parents: 62905
diff changeset
    39
      SELECT_GOAL (unfold_thms_tac ctxt
c50c764aab10 n2m operates on (un)folds
traytel
parents: 62905
diff changeset
    40
        (o_apply :: @{thms fst_convol' id_o sum.case} @ map_comps @ xtor_un_folds)),
c50c764aab10 n2m operates on (un)folds
traytel
parents: 62905
diff changeset
    41
      rtac ctxt refl]);
62905
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    42
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    43
fun mk_xtor_co_rec_tac ctxt un_fold co_rec_defs co_rec_expand_thms =
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    44
  unfold_thms_tac ctxt (un_fold ::
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    45
    @{thms o_apply sum.case snd_convol' case_sum_o_inj(2)} @ co_rec_defs @ co_rec_expand_thms) THEN
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    46
    HEADGOAL (rtac ctxt refl);
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    47
63045
c50c764aab10 n2m operates on (un)folds
traytel
parents: 62905
diff changeset
    48
fun mk_xtor_co_rec_unique_tac ctxt fp co_rec_defs co_rec_expand's un_fold_unique map_ids map_comps
c50c764aab10 n2m operates on (un)folds
traytel
parents: 62905
diff changeset
    49
    inverses =
62905
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    50
  unfold_thms_tac ctxt (co_rec_defs @ co_rec_expand's) THEN
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    51
  HEADGOAL (EVERY' [rtac ctxt un_fold_unique]) THEN
63045
c50c764aab10 n2m operates on (un)folds
traytel
parents: 62905
diff changeset
    52
  unfold_thms_tac ctxt (map_ids @ map_comps @ inverses @ case_fp fp
62905
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    53
    @{thms id_o o_id convol_o fst_convol o_assoc[symmetric]}
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    54
    @{thms id_o o_id o_case_sum case_sum_o_inj(1) o_assoc}) THEN
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    55
  ALLGOALS (etac ctxt (case_fp fp
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    56
    @{thm arg_cong2[of _ _ _ _ BNF_Def.convol, OF refl]}
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    57
    @{thm arg_cong2[of _ _ _ _ case_sum, OF refl]}));
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    58
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    59
fun mk_xtor_co_rec_transfer_tac ctxt fp n m defs un_fold_transfers pre_T_map_transfers xtor_rels =
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    60
  case_fp fp
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    61
    (CONJ_WRAP (fn (def, un_fold_transfer) =>
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    62
        REPEAT_DETERM (HEADGOAL (rtac ctxt rel_funI)) THEN
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    63
        unfold_thms_tac ctxt [def, o_apply] THEN
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    64
        HEADGOAL (rtac ctxt @{thm rel_funD[OF snd_transfer]} THEN'
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    65
          etac ctxt (mk_rel_funDN_rotated (n + 1) un_fold_transfer) THEN'
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    66
          EVERY' (map2 (fn pre_T_map_transfer => fn xtor_rel =>
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    67
            etac ctxt (mk_rel_funDN_rotated 2 @{thm convol_transfer}) THEN'
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    68
            rtac ctxt (mk_rel_funDN_rotated 2 @{thm comp_transfer}) THEN'
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    69
            rtac ctxt (mk_rel_funDN (m + n) pre_T_map_transfer) THEN'
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    70
            REPEAT_DETERM_N m o rtac ctxt @{thm id_transfer} THEN'
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    71
            REPEAT_DETERM o rtac ctxt @{thm fst_transfer} THEN'
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    72
            rtac ctxt rel_funI THEN'
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    73
            etac ctxt (xtor_rel RS iffD2)) pre_T_map_transfers xtor_rels)))
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    74
      (defs ~~ un_fold_transfers))
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    75
    (CONJ_WRAP (fn (def, un_fold_transfer) =>
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    76
        REPEAT_DETERM (HEADGOAL (rtac ctxt rel_funI)) THEN
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    77
        unfold_thms_tac ctxt [def, o_apply] THEN
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    78
        HEADGOAL (rtac ctxt (mk_rel_funDN (n + 1) un_fold_transfer) THEN'
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    79
          EVERY' (map2 (fn pre_T_map_transfer => fn xtor_rel =>
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    80
            etac ctxt (mk_rel_funDN_rotated 2 @{thm case_sum_transfer}) THEN'
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    81
            rtac ctxt (mk_rel_funDN 2 @{thm comp_transfer}) THEN'
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    82
            rtac ctxt (mk_rel_funDN (m + n) pre_T_map_transfer) THEN'
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    83
            REPEAT_DETERM_N m o rtac ctxt @{thm id_transfer} THEN'
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    84
            REPEAT_DETERM_N n o rtac ctxt @{thm Inl_transfer} THEN'
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    85
            rtac ctxt rel_funI THEN'
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    86
            etac ctxt (xtor_rel RS iffD1)) pre_T_map_transfers xtor_rels) THEN'
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    87
          etac ctxt (mk_rel_funDN 1 @{thm Inr_transfer})))
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    88
      (defs ~~ un_fold_transfers));
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    89
52c5a25e0c96 derive (co)rec uniformly from (un)fold
traytel
parents:
diff changeset
    90
end