src/HOL/Tools/BNF/bnf_fp_def_sugar_tactics.ML
changeset 56991 8e9ca31e9b8e
parent 56990 299b026cc5af
child 57046 b3613d7e108b
equal deleted inserted replaced
56990:299b026cc5af 56991:8e9ca31e9b8e
    16     thm list list list -> tactic
    16     thm list list list -> tactic
    17   val mk_corec_tac: thm list -> thm list -> thm -> thm -> thm -> thm -> Proof.context -> tactic
    17   val mk_corec_tac: thm list -> thm list -> thm -> thm -> thm -> thm -> Proof.context -> tactic
    18   val mk_ctor_iff_dtor_tac: Proof.context -> ctyp option list -> cterm -> cterm -> thm -> thm ->
    18   val mk_ctor_iff_dtor_tac: Proof.context -> ctyp option list -> cterm -> cterm -> thm -> thm ->
    19     tactic
    19     tactic
    20   val mk_disc_corec_iff_tac: thm list -> thm list -> thm list -> Proof.context -> tactic
    20   val mk_disc_corec_iff_tac: thm list -> thm list -> thm list -> Proof.context -> tactic
       
    21   val mk_disc_map_iff_tac: Proof.context -> cterm -> thm -> thm list -> thm list -> tactic
    21   val mk_exhaust_tac: Proof.context -> int -> thm list -> thm -> thm -> tactic
    22   val mk_exhaust_tac: Proof.context -> int -> thm list -> thm -> thm -> tactic
    22   val mk_half_distinct_tac: Proof.context -> thm -> thm -> thm list -> tactic
    23   val mk_half_distinct_tac: Proof.context -> thm -> thm -> thm list -> tactic
    23   val mk_induct_tac: Proof.context -> int -> int list -> int list list -> int list list list ->
    24   val mk_induct_tac: Proof.context -> int -> int list -> int list list -> int list list list ->
    24     thm list -> thm -> thm list -> thm list -> thm list -> thm list list -> tactic
    25     thm list -> thm -> thm list -> thm list -> thm list -> thm list list -> tactic
    25   val mk_inject_tac: Proof.context -> thm -> thm -> thm -> tactic
    26   val mk_inject_tac: Proof.context -> thm -> thm -> thm -> tactic
    29 end;
    30 end;
    30 
    31 
    31 structure BNF_FP_Def_Sugar_Tactics : BNF_FP_DEF_SUGAR_TACTICS =
    32 structure BNF_FP_Def_Sugar_Tactics : BNF_FP_DEF_SUGAR_TACTICS =
    32 struct
    33 struct
    33 
    34 
       
    35 open Ctr_Sugar_Util
    34 open BNF_Tactics
    36 open BNF_Tactics
    35 open BNF_Util
    37 open BNF_Util
    36 open BNF_FP_Util
    38 open BNF_FP_Util
    37 
    39 
    38 val basic_simp_thms = @{thms simp_thms(7,8,12,14,22,24)};
    40 val basic_simp_thms = @{thms simp_thms(7,8,12,14,22,24)};
   110   EVERY (map3 (fn case_split_tac => fn corec_thm => fn disc =>
   112   EVERY (map3 (fn case_split_tac => fn corec_thm => fn disc =>
   111       HEADGOAL case_split_tac THEN unfold_thms_tac ctxt [corec_thm] THEN
   113       HEADGOAL case_split_tac THEN unfold_thms_tac ctxt [corec_thm] THEN
   112       HEADGOAL (asm_simp_tac (ss_only basic_simp_thms ctxt)) THEN
   114       HEADGOAL (asm_simp_tac (ss_only basic_simp_thms ctxt)) THEN
   113       (if is_refl disc then all_tac else HEADGOAL (rtac disc)))
   115       (if is_refl disc then all_tac else HEADGOAL (rtac disc)))
   114     (map rtac case_splits' @ [K all_tac]) corecs discs);
   116     (map rtac case_splits' @ [K all_tac]) corecs discs);
       
   117 
       
   118 fun mk_disc_map_iff_tac ctxt ct exhaust discs maps =
       
   119   TRYALL Goal.conjunction_tac THEN
       
   120     ALLGOALS (rtac (cterm_instantiate_pos [SOME ct] exhaust) THEN_ALL_NEW
       
   121       REPEAT_DETERM o hyp_subst_tac ctxt) THEN
       
   122     unfold_thms_tac ctxt maps THEN
       
   123     unfold_thms_tac ctxt (map (fn thm => thm RS @{thm iffD2[OF eq_False]}
       
   124       handle THM _ => thm RS @{thm iffD2[OF eq_True]}) discs) THEN
       
   125     ALLGOALS (rtac refl ORELSE' rtac TrueI);
   115 
   126 
   116 fun solve_prem_prem_tac ctxt =
   127 fun solve_prem_prem_tac ctxt =
   117   REPEAT o (eresolve_tac @{thms bexE rev_bexI} ORELSE' rtac @{thm rev_bexI[OF UNIV_I]} ORELSE'
   128   REPEAT o (eresolve_tac @{thms bexE rev_bexI} ORELSE' rtac @{thm rev_bexI[OF UNIV_I]} ORELSE'
   118     hyp_subst_tac ctxt ORELSE' resolve_tac @{thms disjI1 disjI2}) THEN'
   129     hyp_subst_tac ctxt ORELSE' resolve_tac @{thms disjI1 disjI2}) THEN'
   119   (rtac refl ORELSE' atac ORELSE' rtac @{thm singletonI});
   130   (rtac refl ORELSE' atac ORELSE' rtac @{thm singletonI});
   192       (1 upto nn) ns pre_rel_defs fp_abs_inverses abs_inverses dtor_ctors exhausts ctr_defss discsss
   203       (1 upto nn) ns pre_rel_defs fp_abs_inverses abs_inverses dtor_ctors exhausts ctr_defss discsss
   193       selsss));
   204       selsss));
   194 
   205 
   195 fun mk_set_empty_tac ctxt ct exhaust sets discs =
   206 fun mk_set_empty_tac ctxt ct exhaust sets discs =
   196   TRYALL Goal.conjunction_tac THEN
   207   TRYALL Goal.conjunction_tac THEN
   197   ALLGOALS(rtac (Ctr_Sugar_Util.cterm_instantiate_pos [SOME ct] exhaust) THEN_ALL_NEW
   208   ALLGOALS (rtac (cterm_instantiate_pos [SOME ct] exhaust) THEN_ALL_NEW
   198     REPEAT_DETERM o hyp_subst_tac ctxt) THEN
   209     REPEAT_DETERM o hyp_subst_tac ctxt) THEN
   199   unfold_thms_tac ctxt (sets @ map_filter (fn thm =>
   210   unfold_thms_tac ctxt (sets @ map_filter (fn thm =>
   200     SOME (thm RS @{thm iffD2[OF eq_False]}) handle THM _ => NONE) discs) THEN
   211     SOME (thm RS @{thm iffD2[OF eq_False]}) handle THM _ => NONE) discs) THEN
   201   ALLGOALS(rtac refl ORELSE' etac FalseE);
   212   ALLGOALS (rtac refl ORELSE' etac FalseE);
   202 
   213 
   203 end;
   214 end;