src/HOLCF/Tools/Domain/domain_theorems.ML
changeset 40018 bf85fef3cce4
parent 40017 575d3aa1f3c5
child 40019 05cda34d36e7
equal deleted inserted replaced
40017:575d3aa1f3c5 40018:bf85fef3cce4
   160 (****************************** induction rules *******************************)
   160 (****************************** induction rules *******************************)
   161 (******************************************************************************)
   161 (******************************************************************************)
   162 
   162 
   163 fun prove_induction
   163 fun prove_induction
   164     (comp_dbind : binding, eqs : eq list)
   164     (comp_dbind : binding, eqs : eq list)
       
   165     (constr_infos : Domain_Constructors.constr_info list)
       
   166     (take_info : Domain_Take_Proofs.take_induct_info)
   165     (take_rews : thm list)
   167     (take_rews : thm list)
   166     (take_info : Domain_Take_Proofs.take_induct_info)
       
   167     (thy : theory) =
   168     (thy : theory) =
   168 let
   169 let
   169   val comp_dname = Sign.full_name thy comp_dbind;
   170   val comp_dname = Sign.full_name thy comp_dbind;
   170   val dnames = map (fst o fst) eqs;
   171   val dnames = map (fst o fst) eqs;
   171   val conss  = map  snd        eqs;
   172   val conss  = map  snd        eqs;
   172   fun dc_take dn = %%:(dn^"_take");
   173   fun dc_take dn = %%:(dn^"_take");
   173   val x_name = idx_name dnames "x";
   174   val x_name = idx_name dnames "x";
   174   val P_name = idx_name dnames "P";
   175   val P_name = idx_name dnames "P";
   175   val pg = pg' thy;
   176   val pg = pg' thy;
   176 
   177 
   177   local
   178   val iso_infos = map #iso_info constr_infos;
   178     fun ga s dn = Global_Theory.get_thm thy (dn ^ "." ^ s);
   179   val axs_rep_iso = map #rep_inverse iso_infos;
   179     fun gts s dn = Global_Theory.get_thms thy (dn ^ "." ^ s);
   180   val axs_abs_iso = map #abs_inverse iso_infos;
   180   in
   181   val exhausts = map #exhaust constr_infos;
   181     val axs_rep_iso = map (ga "rep_iso") dnames;
   182   val con_rews = maps #con_rews constr_infos;
   182     val axs_abs_iso = map (ga "abs_iso") dnames;
       
   183     val exhausts = map (ga  "exhaust" ) dnames;
       
   184     val con_rews  = maps (gts "con_rews" ) dnames;
       
   185   end;
       
   186 
   183 
   187   val {take_consts, ...} = take_info;
   184   val {take_consts, ...} = take_info;
   188   val {take_0_thms, take_Suc_thms, chain_take_thms, ...} = take_info;
   185   val {take_0_thms, take_Suc_thms, chain_take_thms, ...} = take_info;
   189   val {lub_take_thms, finite_defs, reach_thms, ...} = take_info;
   186   val {lub_take_thms, finite_defs, reach_thms, ...} = take_info;
   190   val {take_induct_thms, ...} = take_info;
   187   val {take_induct_thms, ...} = take_info;
   503 
   500 
   504 in thy |> snd o Global_Theory.add_thmss
   501 in thy |> snd o Global_Theory.add_thmss
   505     [((Binding.qualified true "coinduct" comp_dbind, [coind]), [])]
   502     [((Binding.qualified true "coinduct" comp_dbind, [coind]), [])]
   506 end; (* let *)
   503 end; (* let *)
   507 
   504 
       
   505 (******************************************************************************)
       
   506 (******************************* main function ********************************)
       
   507 (******************************************************************************)
       
   508 
   508 fun comp_theorems
   509 fun comp_theorems
   509     (comp_dbind : binding, eqs : eq list)
   510     (comp_dbind : binding, eqs : eq list)
   510     (specs : (binding * (binding * (bool * binding option * typ) list * mixfix) list) list)
   511     (specs : (binding * (binding * (bool * binding option * typ) list * mixfix) list) list)
   511     (take_info : Domain_Take_Proofs.take_induct_info)
   512     (take_info : Domain_Take_Proofs.take_induct_info)
   512     (constr_infos : Domain_Constructors.constr_info list)
   513     (constr_infos : Domain_Constructors.constr_info list)
   543 val take_rews = take_0_thms @ take_strict_thms @ flat take_rewss;
   544 val take_rews = take_0_thms @ take_strict_thms @ flat take_rewss;
   544 
   545 
   545 (* prove induction rules, unless definition is indirect recursive *)
   546 (* prove induction rules, unless definition is indirect recursive *)
   546 val thy =
   547 val thy =
   547     if is_indirect then thy else
   548     if is_indirect then thy else
   548     prove_induction (comp_dbind, eqs) take_rews take_info thy;
   549     prove_induction (comp_dbind, eqs) constr_infos take_info take_rews thy;
   549 
   550 
   550 val thy =
   551 val thy =
   551     if is_indirect then thy else
   552     if is_indirect then thy else
   552     prove_coinduction (comp_dbind, eqs) take_rews take_lemma_thms thy;
   553     prove_coinduction (comp_dbind, eqs) take_rews take_lemma_thms thy;
   553 
   554