src/HOL/Codatatype/Tools/bnf_gfp_tactics.ML
changeset 49104 6defdacd595a
parent 49091 0da7116b1b23
child 49305 8241f21d104b
equal deleted inserted replaced
49103:3caaa80f53a4 49104:6defdacd595a
    25     {prems: 'a, context: Proof.context} -> tactic
    25     {prems: 'a, context: Proof.context} -> tactic
    26   val mk_coalg_final_tac: int -> thm -> thm list -> thm list -> thm list list -> thm list list ->
    26   val mk_coalg_final_tac: int -> thm -> thm list -> thm list -> thm list list -> thm list list ->
    27     tactic
    27     tactic
    28   val mk_coalg_set_tac: thm -> tactic
    28   val mk_coalg_set_tac: thm -> tactic
    29   val mk_coalg_thePull_tac: int -> thm -> thm list -> thm list list -> (int -> tactic) list ->
    29   val mk_coalg_thePull_tac: int -> thm -> thm list -> thm list list -> (int -> tactic) list ->
       
    30     {prems: 'a, context: Proof.context} -> tactic
       
    31   val mk_coind_wit_tac: thm -> thm list -> thm list -> thm list ->
    30     {prems: 'a, context: Proof.context} -> tactic
    32     {prems: 'a, context: Proof.context} -> tactic
    31   val mk_coiter_unique_mor_tac: thm list -> thm -> thm -> thm list -> tactic
    33   val mk_coiter_unique_mor_tac: thm list -> thm -> thm -> thm list -> tactic
    32   val mk_col_bd_tac: int -> int -> cterm option list -> thm list -> thm list -> thm -> thm ->
    34   val mk_col_bd_tac: int -> int -> cterm option list -> thm list -> thm list -> thm -> thm ->
    33     thm list list -> tactic
    35     thm list list -> tactic
    34   val mk_col_natural_tac: cterm option list -> thm list -> thm list -> thm list -> thm list list ->
    36   val mk_col_natural_tac: cterm option list -> thm list -> thm list -> thm list -> thm list list ->
   112   val mk_unf_coinduct_upto_tac: int list -> ctyp option list -> cterm option list -> thm -> thm ->
   114   val mk_unf_coinduct_upto_tac: int list -> ctyp option list -> cterm option list -> thm -> thm ->
   113     thm -> tactic
   115     thm -> tactic
   114   val mk_unf_o_fld_tac: thm -> thm -> thm -> thm -> thm list ->
   116   val mk_unf_o_fld_tac: thm -> thm -> thm -> thm -> thm list ->
   115     {prems: 'a, context: Proof.context} -> tactic
   117     {prems: 'a, context: Proof.context} -> tactic
   116   val mk_unique_mor_tac: thm list -> thm -> tactic
   118   val mk_unique_mor_tac: thm list -> thm -> tactic
   117   val mk_wit_tac: int -> thm list -> thm list -> thm list ->
   119   val mk_wit_tac: int -> thm list -> thm list -> thm list -> thm list ->
   118     {prems: 'a, context: Proof.context} -> tactic
   120     {prems: 'a, context: Proof.context} -> tactic
   119   val mk_wpull_tac: int -> thm -> thm -> thm -> thm -> thm -> thm list -> thm list -> tactic
   121   val mk_wpull_tac: int -> thm -> thm -> thm -> thm -> thm -> thm list -> thm list -> tactic
   120 end;
   122 end;
   121 
   123 
   122 structure BNF_GFP_Tactics : BNF_GFP_TACTICS =
   124 structure BNF_GFP_Tactics : BNF_GFP_TACTICS =
  1461         rtac pick, REPEAT_DETERM_N (m - 1) o etac conjI, atac,
  1463         rtac pick, REPEAT_DETERM_N (m - 1) o etac conjI, atac,
  1462         rtac @{thm set_mp[OF equalityD2[OF thePull_def]]}, rtac CollectI,
  1464         rtac @{thm set_mp[OF equalityD2[OF thePull_def]]}, rtac CollectI,
  1463         rtac @{thm prod_caseI}, etac conjI, etac conjI, atac])
  1465         rtac @{thm prod_caseI}, etac conjI, etac conjI, atac])
  1464     (pick_cols ~~ hset_defs)] 1;
  1466     (pick_cols ~~ hset_defs)] 1;
  1465 
  1467 
  1466 fun mk_wit_tac n unf_flds set_simp wit {context = ctxt, prems = _} =
  1468 fun mk_wit_tac n unf_flds set_simp wit coind_wits {context = ctxt, prems = _} =
       
  1469   ALLGOALS (TRY o (eresolve_tac coind_wits THEN' rtac refl)) THEN
  1467   REPEAT_DETERM (atac 1 ORELSE
  1470   REPEAT_DETERM (atac 1 ORELSE
  1468     EVERY' [dtac @{thm set_rev_mp}, rtac equalityD1, resolve_tac set_simp,
  1471     EVERY' [dtac @{thm set_rev_mp}, rtac equalityD1, resolve_tac set_simp,
  1469     K (Local_Defs.unfold_tac ctxt unf_flds),
  1472     K (Local_Defs.unfold_tac ctxt unf_flds),
  1470     REPEAT_DETERM_N n o etac UnE,
  1473     REPEAT_DETERM_N n o etac UnE,
  1471     REPEAT_DETERM o
  1474     REPEAT_DETERM o
  1473         (eresolve_tac wit ORELSE'
  1476         (eresolve_tac wit ORELSE'
  1474         (dresolve_tac wit THEN'
  1477         (dresolve_tac wit THEN'
  1475           (etac FalseE ORELSE'
  1478           (etac FalseE ORELSE'
  1476           EVERY' [hyp_subst_tac, dtac @{thm set_rev_mp}, rtac equalityD1, resolve_tac set_simp,
  1479           EVERY' [hyp_subst_tac, dtac @{thm set_rev_mp}, rtac equalityD1, resolve_tac set_simp,
  1477             K (Local_Defs.unfold_tac ctxt unf_flds), REPEAT_DETERM_N n o etac UnE]))))] 1);
  1480             K (Local_Defs.unfold_tac ctxt unf_flds), REPEAT_DETERM_N n o etac UnE]))))] 1);
       
  1481 
       
  1482 fun mk_coind_wit_tac induct coiters set_nats wits {context = ctxt, prems = _} =
       
  1483   rtac induct 1 THEN ALLGOALS (TRY o rtac impI THEN' TRY o hyp_subst_tac) THEN
       
  1484   Local_Defs.unfold_tac ctxt (coiters @ set_nats @ @{thms image_id id_apply}) THEN
       
  1485   ALLGOALS (REPEAT_DETERM o etac imageE THEN' TRY o hyp_subst_tac) THEN
       
  1486   ALLGOALS (TRY o
       
  1487     FIRST' [rtac TrueI, rtac refl, etac (refl RSN (2, mp)), dresolve_tac wits THEN' etac FalseE])
  1478 
  1488 
  1479 fun mk_rel_unfold_tac in_Jrels i in_rel map_comp map_cong map_simp set_simps unf_inject unf_fld
  1489 fun mk_rel_unfold_tac in_Jrels i in_rel map_comp map_cong map_simp set_simps unf_inject unf_fld
  1480   set_naturals set_incls set_set_inclss =
  1490   set_naturals set_incls set_set_inclss =
  1481   let
  1491   let
  1482     val m = length set_incls;
  1492     val m = length set_incls;