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 |