src/HOL/Codatatype/Tools/bnf_fp_sugar_tactics.ML
author blanchet
Mon, 17 Sep 2012 21:13:30 +0200
changeset 49426 6d05b8452cf3
parent 49391 3a96797fd53e
child 49427 b017e1dbc77c
permissions -rw-r--r--
got rid of one "auto" in induction tactic
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
49123
263b0e330d8b more work on sugar + simplify Trueprop + eq idiom everywhere
blanchet
parents:
diff changeset
     1
(*  Title:      HOL/Codatatype/Tools/bnf_fp_sugar_tactics.ML
263b0e330d8b more work on sugar + simplify Trueprop + eq idiom everywhere
blanchet
parents:
diff changeset
     2
    Author:     Jasmin Blanchette, TU Muenchen
263b0e330d8b more work on sugar + simplify Trueprop + eq idiom everywhere
blanchet
parents:
diff changeset
     3
    Copyright   2012
263b0e330d8b more work on sugar + simplify Trueprop + eq idiom everywhere
blanchet
parents:
diff changeset
     4
49389
blanchet
parents: 49385
diff changeset
     5
Tactics for datatype and codatatype sugar.
49123
263b0e330d8b more work on sugar + simplify Trueprop + eq idiom everywhere
blanchet
parents:
diff changeset
     6
*)
263b0e330d8b more work on sugar + simplify Trueprop + eq idiom everywhere
blanchet
parents:
diff changeset
     7
263b0e330d8b more work on sugar + simplify Trueprop + eq idiom everywhere
blanchet
parents:
diff changeset
     8
signature BNF_FP_SUGAR_TACTICS =
263b0e330d8b more work on sugar + simplify Trueprop + eq idiom everywhere
blanchet
parents:
diff changeset
     9
sig
49130
3c26e17b2849 implemented "mk_case_tac" -- and got rid of "cheat_tac"
blanchet
parents: 49127
diff changeset
    10
  val mk_case_tac: Proof.context -> int -> int -> int -> thm -> thm -> thm -> tactic
49226
510c6d4a73ec fixed and enabled iterator/recursor theorems
blanchet
parents: 49218
diff changeset
    11
  val mk_coiter_like_tac: thm list -> thm list -> thm -> thm -> thm -> Proof.context -> tactic
49161
a8e74375d971 fixed (n + 1)st bug in "mk_exhaust_tac" -- arose with uncurried constructors
blanchet
parents: 49160
diff changeset
    12
  val mk_exhaust_tac: Proof.context -> int -> thm list -> thm -> thm -> tactic
49372
c62165188971 polished the induction
blanchet
parents: 49370
diff changeset
    13
  val mk_fld_iff_unf_tac: Proof.context -> ctyp option list -> cterm -> cterm -> thm -> thm ->
c62165188971 polished the induction
blanchet
parents: 49370
diff changeset
    14
    tactic
49127
f7326a0d7f19 implemented "mk_half_distinct_tac"
blanchet
parents: 49126
diff changeset
    15
  val mk_half_distinct_tac: Proof.context -> thm -> thm list -> tactic
49376
c6366fd0415a select the right premise in "mk_induct_discharge_prem_prems_tac" instead of relying on backtracking
blanchet
parents: 49375
diff changeset
    16
  val mk_induct_tac: Proof.context -> int list -> int list list ->
49378
19237e465055 fixed issue with bound variables in prem prems + tuning
blanchet
parents: 49377
diff changeset
    17
    ((int * int) * (int * int)) list list list -> thm list -> thm -> thm list -> thm list list ->
19237e465055 fixed issue with bound variables in prem prems + tuning
blanchet
parents: 49377
diff changeset
    18
    tactic
49126
1bbd7a37fc29 implemented "mk_inject_tac"
blanchet
parents: 49125
diff changeset
    19
  val mk_inject_tac: Proof.context -> thm -> thm -> tactic
49226
510c6d4a73ec fixed and enabled iterator/recursor theorems
blanchet
parents: 49218
diff changeset
    20
  val mk_iter_like_tac: thm list -> thm list -> thm list -> thm -> thm -> Proof.context -> tactic
49123
263b0e330d8b more work on sugar + simplify Trueprop + eq idiom everywhere
blanchet
parents:
diff changeset
    21
end;
263b0e330d8b more work on sugar + simplify Trueprop + eq idiom everywhere
blanchet
parents:
diff changeset
    22
263b0e330d8b more work on sugar + simplify Trueprop + eq idiom everywhere
blanchet
parents:
diff changeset
    23
structure BNF_FP_Sugar_Tactics : BNF_FP_SUGAR_TACTICS =
263b0e330d8b more work on sugar + simplify Trueprop + eq idiom everywhere
blanchet
parents:
diff changeset
    24
struct
263b0e330d8b more work on sugar + simplify Trueprop + eq idiom everywhere
blanchet
parents:
diff changeset
    25
49125
5fc5211cf104 implemented "mk_exhaust_tac"
blanchet
parents: 49123
diff changeset
    26
open BNF_Tactics
49123
263b0e330d8b more work on sugar + simplify Trueprop + eq idiom everywhere
blanchet
parents:
diff changeset
    27
open BNF_Util
49264
9059e0dbdbc1 implemented and use "mk_sum_casesN_balanced"
blanchet
parents: 49263
diff changeset
    28
open BNF_FP_Util
49123
263b0e330d8b more work on sugar + simplify Trueprop + eq idiom everywhere
blanchet
parents:
diff changeset
    29
49368
df359ce891ac added induct tactic
blanchet
parents: 49363
diff changeset
    30
val meta_mp = @{thm meta_mp};
df359ce891ac added induct tactic
blanchet
parents: 49363
diff changeset
    31
val meta_spec = @{thm meta_spec};
df359ce891ac added induct tactic
blanchet
parents: 49363
diff changeset
    32
49391
3a96797fd53e tuned induction tactic
blanchet
parents: 49389
diff changeset
    33
fun inst_spurious_fs lthy thm =
49368
df359ce891ac added induct tactic
blanchet
parents: 49363
diff changeset
    34
  let
49384
94ad5ba23541 took out one rotate_tac
blanchet
parents: 49383
diff changeset
    35
    val fs =
49368
df359ce891ac added induct tactic
blanchet
parents: 49363
diff changeset
    36
      Term.add_vars (prop_of thm) []
df359ce891ac added induct tactic
blanchet
parents: 49363
diff changeset
    37
      |> filter (fn (_, Type (@{type_name fun}, [_, T'])) => T' <> HOLogic.boolT | _ => false);
49384
94ad5ba23541 took out one rotate_tac
blanchet
parents: 49383
diff changeset
    38
    val cfs =
94ad5ba23541 took out one rotate_tac
blanchet
parents: 49383
diff changeset
    39
      map (fn f as (_, T) => (certify lthy (Var f), certify lthy (id_abs (domain_type T)))) fs;
49368
df359ce891ac added induct tactic
blanchet
parents: 49363
diff changeset
    40
  in
49384
94ad5ba23541 took out one rotate_tac
blanchet
parents: 49383
diff changeset
    41
    Drule.cterm_instantiate cfs thm
49368
df359ce891ac added induct tactic
blanchet
parents: 49363
diff changeset
    42
  end;
df359ce891ac added induct tactic
blanchet
parents: 49363
diff changeset
    43
49391
3a96797fd53e tuned induction tactic
blanchet
parents: 49389
diff changeset
    44
val inst_spurious_fs_tac = PRIMITIVE o inst_spurious_fs;
49368
df359ce891ac added induct tactic
blanchet
parents: 49363
diff changeset
    45
49130
3c26e17b2849 implemented "mk_case_tac" -- and got rid of "cheat_tac"
blanchet
parents: 49127
diff changeset
    46
fun mk_case_tac ctxt n k m case_def ctr_def unf_fld =
3c26e17b2849 implemented "mk_case_tac" -- and got rid of "cheat_tac"
blanchet
parents: 49127
diff changeset
    47
  Local_Defs.unfold_tac ctxt [case_def, ctr_def, unf_fld] THEN
49264
9059e0dbdbc1 implemented and use "mk_sum_casesN_balanced"
blanchet
parents: 49263
diff changeset
    48
  (rtac (mk_sum_casesN_balanced n k RS ssubst) THEN'
49130
3c26e17b2849 implemented "mk_case_tac" -- and got rid of "cheat_tac"
blanchet
parents: 49127
diff changeset
    49
   REPEAT_DETERM_N (Int.max (0, m - 1)) o rtac (@{thm split} RS ssubst) THEN'
3c26e17b2849 implemented "mk_case_tac" -- and got rid of "cheat_tac"
blanchet
parents: 49127
diff changeset
    50
   rtac refl) 1;
3c26e17b2849 implemented "mk_case_tac" -- and got rid of "cheat_tac"
blanchet
parents: 49127
diff changeset
    51
49161
a8e74375d971 fixed (n + 1)st bug in "mk_exhaust_tac" -- arose with uncurried constructors
blanchet
parents: 49160
diff changeset
    52
fun mk_exhaust_tac ctxt n ctr_defs fld_iff_unf sumEN' =
49263
669a820ef213 fixed general case of "mk_sumEN_balanced"
blanchet
parents: 49262
diff changeset
    53
  Local_Defs.unfold_tac ctxt (fld_iff_unf :: ctr_defs) THEN rtac sumEN' 1 THEN
49125
5fc5211cf104 implemented "mk_exhaust_tac"
blanchet
parents: 49123
diff changeset
    54
  Local_Defs.unfold_tac ctxt @{thms all_prod_eq} THEN
49368
df359ce891ac added induct tactic
blanchet
parents: 49363
diff changeset
    55
  EVERY' (maps (fn k => [select_prem_tac n (rotate_tac 1) k, REPEAT_DETERM o dtac meta_spec,
df359ce891ac added induct tactic
blanchet
parents: 49363
diff changeset
    56
    etac meta_mp, atac]) (1 upto n)) 1;
49125
5fc5211cf104 implemented "mk_exhaust_tac"
blanchet
parents: 49123
diff changeset
    57
49123
263b0e330d8b more work on sugar + simplify Trueprop + eq idiom everywhere
blanchet
parents:
diff changeset
    58
fun mk_fld_iff_unf_tac ctxt cTs cfld cunf fld_unf unf_fld =
263b0e330d8b more work on sugar + simplify Trueprop + eq idiom everywhere
blanchet
parents:
diff changeset
    59
  (rtac iffI THEN'
263b0e330d8b more work on sugar + simplify Trueprop + eq idiom everywhere
blanchet
parents:
diff changeset
    60
   EVERY' (map3 (fn cTs => fn cx => fn th =>
263b0e330d8b more work on sugar + simplify Trueprop + eq idiom everywhere
blanchet
parents:
diff changeset
    61
     dtac (Drule.instantiate' cTs [NONE, NONE, SOME cx] arg_cong) THEN'
263b0e330d8b more work on sugar + simplify Trueprop + eq idiom everywhere
blanchet
parents:
diff changeset
    62
     SELECT_GOAL (Local_Defs.unfold_tac ctxt [th]) THEN'
263b0e330d8b more work on sugar + simplify Trueprop + eq idiom everywhere
blanchet
parents:
diff changeset
    63
     atac) [rev cTs, cTs] [cunf, cfld] [unf_fld, fld_unf])) 1;
263b0e330d8b more work on sugar + simplify Trueprop + eq idiom everywhere
blanchet
parents:
diff changeset
    64
49127
f7326a0d7f19 implemented "mk_half_distinct_tac"
blanchet
parents: 49126
diff changeset
    65
fun mk_half_distinct_tac ctxt fld_inject ctr_defs =
f7326a0d7f19 implemented "mk_half_distinct_tac"
blanchet
parents: 49126
diff changeset
    66
  Local_Defs.unfold_tac ctxt (fld_inject :: @{thms sum.inject} @ ctr_defs) THEN
f7326a0d7f19 implemented "mk_half_distinct_tac"
blanchet
parents: 49126
diff changeset
    67
  rtac @{thm sum.distinct(1)} 1;
f7326a0d7f19 implemented "mk_half_distinct_tac"
blanchet
parents: 49126
diff changeset
    68
49126
1bbd7a37fc29 implemented "mk_inject_tac"
blanchet
parents: 49125
diff changeset
    69
fun mk_inject_tac ctxt ctr_def fld_inject =
49135
de13b454fa31 fixed some type issues in sugar "exhaust_tac"
blanchet
parents: 49130
diff changeset
    70
  Local_Defs.unfold_tac ctxt [ctr_def] THEN rtac (fld_inject RS ssubst) 1 THEN
de13b454fa31 fixed some type issues in sugar "exhaust_tac"
blanchet
parents: 49130
diff changeset
    71
  Local_Defs.unfold_tac ctxt @{thms sum.inject Pair_eq conj_assoc} THEN rtac refl 1;
49126
1bbd7a37fc29 implemented "mk_inject_tac"
blanchet
parents: 49125
diff changeset
    72
49211
239a4fa29ddf define corecursors
blanchet
parents: 49207
diff changeset
    73
val iter_like_thms =
49233
7f412734fbb3 fixed and reenabled "corecs" theorems
blanchet
parents: 49232
diff changeset
    74
  @{thms case_unit comp_def convol_def id_apply map_pair_def sum.simps(5,6) sum_map.simps
7f412734fbb3 fixed and reenabled "corecs" theorems
blanchet
parents: 49232
diff changeset
    75
      split_conv};
49205
674f04c737e0 implemented "mk_iter_or_rec_tac"
blanchet
parents: 49161
diff changeset
    76
49229
d5717b5e2217 use map_id, not map_id', to allow better composition
blanchet
parents: 49226
diff changeset
    77
fun mk_iter_like_tac pre_map_defs map_ids iter_like_defs fld_iter_like ctr_def ctxt =
d5717b5e2217 use map_id, not map_id', to allow better composition
blanchet
parents: 49226
diff changeset
    78
  Local_Defs.unfold_tac ctxt (ctr_def :: fld_iter_like :: iter_like_defs @ pre_map_defs @ map_ids @
49232
9ea11f0c53e4 fixed and enabled generation of "coiters" theorems, including the recursive case
blanchet
parents: 49229
diff changeset
    79
    iter_like_thms) THEN Local_Defs.unfold_tac ctxt @{thms id_def} THEN rtac refl 1;
49205
674f04c737e0 implemented "mk_iter_or_rec_tac"
blanchet
parents: 49161
diff changeset
    80
49213
975ccb0130cb some work on coiter tactic
blanchet
parents: 49211
diff changeset
    81
val coiter_like_ss = ss_only @{thms if_True if_False};
49276
59fa53ed7507 finished splitting sum types for corecursors
blanchet
parents: 49274
diff changeset
    82
val coiter_like_thms = @{thms id_apply map_pair_def sum_map.simps prod.cases};
49213
975ccb0130cb some work on coiter tactic
blanchet
parents: 49211
diff changeset
    83
49229
d5717b5e2217 use map_id, not map_id', to allow better composition
blanchet
parents: 49226
diff changeset
    84
fun mk_coiter_like_tac coiter_like_defs map_ids fld_unf_coiter_like pre_map_def ctr_def ctxt =
49213
975ccb0130cb some work on coiter tactic
blanchet
parents: 49211
diff changeset
    85
  Local_Defs.unfold_tac ctxt (ctr_def :: coiter_like_defs) THEN
49226
510c6d4a73ec fixed and enabled iterator/recursor theorems
blanchet
parents: 49218
diff changeset
    86
  subst_tac ctxt [fld_unf_coiter_like] 1 THEN asm_simp_tac coiter_like_ss 1 THEN
49232
9ea11f0c53e4 fixed and enabled generation of "coiters" theorems, including the recursive case
blanchet
parents: 49229
diff changeset
    87
  Local_Defs.unfold_tac ctxt (pre_map_def :: coiter_like_thms @ map_ids) THEN
49235
f9fc2b64c599 fixed bug with one-value codatatype "codata 'a dead_foo = A"
blanchet
parents: 49233
diff changeset
    88
  Local_Defs.unfold_tac ctxt @{thms id_def} THEN
49362
1271aca16aed make tactic more robust in the case where "asm_simp_tac" already finishes the job
blanchet
parents: 49276
diff changeset
    89
  TRY ((rtac refl ORELSE' subst_tac ctxt @{thms unit_eq} THEN' rtac refl) 1);
49213
975ccb0130cb some work on coiter tactic
blanchet
parents: 49211
diff changeset
    90
49389
blanchet
parents: 49385
diff changeset
    91
(* TODO: Get rid of "auto_tac" (or at least use a naked context) *)
49368
df359ce891ac added induct tactic
blanchet
parents: 49363
diff changeset
    92
49389
blanchet
parents: 49385
diff changeset
    93
fun mk_induct_prem_prem_endgame_tac _ 0 = atac ORELSE' rtac @{thm singletonI}
blanchet
parents: 49385
diff changeset
    94
  | mk_induct_prem_prem_endgame_tac ctxt qq =
blanchet
parents: 49385
diff changeset
    95
    REPEAT_DETERM_N qq o
blanchet
parents: 49385
diff changeset
    96
      (SELECT_GOAL (Local_Defs.unfold_tac ctxt @{thms Union_iff bex_simps(6)}) THEN'
blanchet
parents: 49385
diff changeset
    97
       etac @{thm induct_set_step}) THEN'
blanchet
parents: 49385
diff changeset
    98
    atac ORELSE' SELECT_GOAL (auto_tac ctxt);
49368
df359ce891ac added induct tactic
blanchet
parents: 49363
diff changeset
    99
49426
6d05b8452cf3 got rid of one "auto" in induction tactic
blanchet
parents: 49391
diff changeset
   100
fun gen_UN_comprehI_tac UnI = REPEAT_DETERM o resolve_tac @{thms mem_UN_comprehI} THEN' rtac UnI;
6d05b8452cf3 got rid of one "auto" in induction tactic
blanchet
parents: 49391
diff changeset
   101
6d05b8452cf3 got rid of one "auto" in induction tactic
blanchet
parents: 49391
diff changeset
   102
fun gen_UnIN_tac 1 1 = REPEAT_DETERM o resolve_tac @{thms mem_UN_comprehI'}
6d05b8452cf3 got rid of one "auto" in induction tactic
blanchet
parents: 49391
diff changeset
   103
  | gen_UnIN_tac _ 1 = gen_UN_comprehI_tac @{thm UnI1} THEN' gen_UnIN_tac 1 1
6d05b8452cf3 got rid of one "auto" in induction tactic
blanchet
parents: 49391
diff changeset
   104
  | gen_UnIN_tac n k = gen_UN_comprehI_tac @{thm UnI2} THEN' gen_UnIN_tac (n - 1) (k - 1);
6d05b8452cf3 got rid of one "auto" in induction tactic
blanchet
parents: 49391
diff changeset
   105
49368
df359ce891ac added induct tactic
blanchet
parents: 49363
diff changeset
   106
val induct_prem_prem_thms =
49426
6d05b8452cf3 got rid of one "auto" in induction tactic
blanchet
parents: 49391
diff changeset
   107
  @{thms SUP_empty Sup_empty Sup_insert UN_compreh_bex_eq_empty UN_compreh_bex_eq_singleton
6d05b8452cf3 got rid of one "auto" in induction tactic
blanchet
parents: 49391
diff changeset
   108
      UN_insert Un_assoc Un_empty_left Un_empty_right Union_Un_distrib collect_def[abs_def] fst_conv
6d05b8452cf3 got rid of one "auto" in induction tactic
blanchet
parents: 49391
diff changeset
   109
      image_def o_apply snd_conv snd_prod_fun sum.cases sup_bot_right fst_map_pair map_pair_simp
6d05b8452cf3 got rid of one "auto" in induction tactic
blanchet
parents: 49391
diff changeset
   110
      sum_map.simps};
49368
df359ce891ac added induct tactic
blanchet
parents: 49363
diff changeset
   111
49372
c62165188971 polished the induction
blanchet
parents: 49370
diff changeset
   112
(* These rules interfere with the "set_natural'" properties of "sum" and "prod", so we explicitly
c62165188971 polished the induction
blanchet
parents: 49370
diff changeset
   113
   delay them. *)
c62165188971 polished the induction
blanchet
parents: 49370
diff changeset
   114
val induct_prem_prem_thms_delayed =
c62165188971 polished the induction
blanchet
parents: 49370
diff changeset
   115
  @{thms fsts_def[abs_def] snds_def[abs_def] sum_setl_def[abs_def] sum_setr_def[abs_def]};
c62165188971 polished the induction
blanchet
parents: 49370
diff changeset
   116
49389
blanchet
parents: 49385
diff changeset
   117
fun mk_induct_leverage_prem_prems_tac ctxt nn ppjjqqkks set_natural's pre_set_defs =
49378
19237e465055 fixed issue with bound variables in prem prems + tuning
blanchet
parents: 49377
diff changeset
   118
  EVERY' (maps (fn ((pp, jj), (qq, kk)) =>
49389
blanchet
parents: 49385
diff changeset
   119
    [select_prem_tac nn (dtac meta_spec) kk, etac meta_mp,
blanchet
parents: 49385
diff changeset
   120
     SELECT_GOAL (Local_Defs.unfold_tac ctxt
blanchet
parents: 49385
diff changeset
   121
       (pre_set_defs @ set_natural's @ induct_prem_prem_thms)),
blanchet
parents: 49385
diff changeset
   122
     SELECT_GOAL (Local_Defs.unfold_tac ctxt
blanchet
parents: 49385
diff changeset
   123
       (induct_prem_prem_thms_delayed @ induct_prem_prem_thms)),
49426
6d05b8452cf3 got rid of one "auto" in induction tactic
blanchet
parents: 49391
diff changeset
   124
     gen_UnIN_tac pp jj THEN' mk_induct_prem_prem_endgame_tac ctxt qq]) (rev ppjjqqkks)) 1;
49368
df359ce891ac added induct tactic
blanchet
parents: 49363
diff changeset
   125
49389
blanchet
parents: 49385
diff changeset
   126
fun mk_induct_discharge_prem_tac ctxt nn n set_natural's pre_set_defs m k ppjjqqkks =
49391
3a96797fd53e tuned induction tactic
blanchet
parents: 49389
diff changeset
   127
  let val r = length ppjjqqkks in
3a96797fd53e tuned induction tactic
blanchet
parents: 49389
diff changeset
   128
    EVERY' [select_prem_tac n (rotate_tac 1) k, rotate_tac ~1, hyp_subst_tac,
3a96797fd53e tuned induction tactic
blanchet
parents: 49389
diff changeset
   129
      REPEAT_DETERM_N m o (dtac meta_spec THEN' rotate_tac ~1)] 1 THEN
3a96797fd53e tuned induction tactic
blanchet
parents: 49389
diff changeset
   130
    EVERY [REPEAT_DETERM_N r
3a96797fd53e tuned induction tactic
blanchet
parents: 49389
diff changeset
   131
        (rotate_tac ~1 1 THEN dtac meta_mp 1 THEN rotate_tac 1 1 THEN prefer_tac 2),
3a96797fd53e tuned induction tactic
blanchet
parents: 49389
diff changeset
   132
      if r > 0 then PRIMITIVE Raw_Simplifier.norm_hhf else all_tac, atac 1,
3a96797fd53e tuned induction tactic
blanchet
parents: 49389
diff changeset
   133
      mk_induct_leverage_prem_prems_tac ctxt nn ppjjqqkks set_natural's pre_set_defs]
3a96797fd53e tuned induction tactic
blanchet
parents: 49389
diff changeset
   134
  end;
49368
df359ce891ac added induct tactic
blanchet
parents: 49363
diff changeset
   135
49389
blanchet
parents: 49385
diff changeset
   136
fun mk_induct_tac ctxt ns mss ppjjqqkksss ctr_defs fld_induct' set_natural's pre_set_defss =
49376
c6366fd0415a select the right premise in "mk_induct_discharge_prem_prems_tac" instead of relying on backtracking
blanchet
parents: 49375
diff changeset
   137
  let
c6366fd0415a select the right premise in "mk_induct_discharge_prem_prems_tac" instead of relying on backtracking
blanchet
parents: 49375
diff changeset
   138
    val nn = length ns;
c6366fd0415a select the right premise in "mk_induct_discharge_prem_prems_tac" instead of relying on backtracking
blanchet
parents: 49375
diff changeset
   139
    val n = Integer.sum ns;
c6366fd0415a select the right premise in "mk_induct_discharge_prem_prems_tac" instead of relying on backtracking
blanchet
parents: 49375
diff changeset
   140
  in
49391
3a96797fd53e tuned induction tactic
blanchet
parents: 49389
diff changeset
   141
    Local_Defs.unfold_tac ctxt ctr_defs THEN rtac fld_induct' 1 THEN inst_spurious_fs_tac ctxt THEN
49376
c6366fd0415a select the right premise in "mk_induct_discharge_prem_prems_tac" instead of relying on backtracking
blanchet
parents: 49375
diff changeset
   142
    EVERY (map4 (EVERY oooo map3 o mk_induct_discharge_prem_tac ctxt nn n set_natural's)
49389
blanchet
parents: 49385
diff changeset
   143
      pre_set_defss mss (unflat mss (1 upto n)) ppjjqqkksss)
49368
df359ce891ac added induct tactic
blanchet
parents: 49363
diff changeset
   144
  end;
df359ce891ac added induct tactic
blanchet
parents: 49363
diff changeset
   145
49123
263b0e330d8b more work on sugar + simplify Trueprop + eq idiom everywhere
blanchet
parents:
diff changeset
   146
end;