1803 case_distribs = [], split = Drule.dummy_thm, split_asm = Drule.dummy_thm, disc_defs = [], |
1803 case_distribs = [], split = Drule.dummy_thm, split_asm = Drule.dummy_thm, disc_defs = [], |
1804 disc_thmss = [], discIs = [], disc_eq_cases = [], sel_defs = [], sel_thmss = [sel_thms], |
1804 disc_thmss = [], discIs = [], disc_eq_cases = [], sel_defs = [], sel_thmss = [sel_thms], |
1805 distinct_discsss = [], exhaust_discs = [], exhaust_sels = [], collapses = [], expands = [], |
1805 distinct_discsss = [], exhaust_discs = [], exhaust_sels = [], collapses = [], expands = [], |
1806 split_sels = [], split_sel_asms = [], case_eq_ifs = []}; |
1806 split_sels = [], split_sel_asms = [], case_eq_ifs = []}; |
1807 |
1807 |
|
1808 fun lhs_of_equation (Const (@{const_name Pure.eq}, _) $ t $ _) = t |
|
1809 | lhs_of_equation (@{const Trueprop} $ (Const (@{const_name HOL.eq}, _) $ t $ _)) = t; |
|
1810 |
|
1811 fun add_spec_rule rule = |
|
1812 let val head = head_of (lhs_of_equation (Thm.prop_of rule)) in |
|
1813 Spec_Rules.add_global Spec_Rules.Equational ([head], [rule]) |
|
1814 end; |
1808 |
1815 |
1809 (* definition *) |
1816 (* definition *) |
1810 |
1817 |
1811 fun definition overloaded (alphas, binding) parent (parents: parent_info list) raw_fields thy0 = |
1818 fun definition overloaded (alphas, binding) parent (parents: parent_info list) raw_fields thy0 = |
1812 let |
1819 let |
2038 map (Thm.no_attributes o apfst (Binding.concealed o Binding.name))) sel_specs |
2045 map (Thm.no_attributes o apfst (Binding.concealed o Binding.name))) sel_specs |
2039 ||>> (Global_Theory.add_defs false o |
2046 ||>> (Global_Theory.add_defs false o |
2040 map (Thm.no_attributes o apfst (Binding.concealed o Binding.name))) upd_specs |
2047 map (Thm.no_attributes o apfst (Binding.concealed o Binding.name))) upd_specs |
2041 ||>> (Global_Theory.add_defs false o |
2048 ||>> (Global_Theory.add_defs false o |
2042 map (rpair [Code.add_default_eqn_attribute] |
2049 map (rpair [Code.add_default_eqn_attribute] |
2043 o apfst (Binding.concealed o Binding.name))) (*FIXME Spec_Rules (?)*) |
2050 o apfst (Binding.concealed o Binding.name))) |
2044 [make_spec, fields_spec, extend_spec, truncate_spec]); |
2051 [make_spec, fields_spec, extend_spec, truncate_spec]); |
2045 val defs_ctxt = Proof_Context.init_global defs_thy; |
2052 val defs_ctxt = Proof_Context.init_global defs_thy; |
2046 |
2053 |
2047 (* prepare propositions *) |
2054 (* prepare propositions *) |
2048 val _ = timing_msg defs_ctxt "record preparing propositions"; |
2055 val _ = timing_msg defs_ctxt "record preparing propositions"; |
2050 val C = Free (singleton (Name.variant_list all_variants) "C", HOLogic.boolT); |
2057 val C = Free (singleton (Name.variant_list all_variants) "C", HOLogic.boolT); |
2051 val P_unit = Free (singleton (Name.variant_list all_variants) "P", recT0 --> HOLogic.boolT); |
2058 val P_unit = Free (singleton (Name.variant_list all_variants) "P", recT0 --> HOLogic.boolT); |
2052 |
2059 |
2053 (*selectors*) |
2060 (*selectors*) |
2054 val sel_conv_props = |
2061 val sel_conv_props = |
2055 map (fn (c, x as Free (_, T)) => mk_sel r_rec0 (c, T) === x) named_vars_more; |
2062 map (fn (c, x as Free (_, T)) => mk_sel r_rec0 (c, T) === x) named_vars_more; |
2056 |
2063 |
2057 (*updates*) |
2064 (*updates*) |
2058 fun mk_upd_prop i (c, T) = |
2065 fun mk_upd_prop i (c, T) = |
2059 let |
2066 let |
2060 val x' = |
2067 val x' = |
2237 make_info alphas parent fields extension |
2244 make_info alphas parent fields extension |
2238 ext_induct ext_inject ext_surjective ext_split ext_def |
2245 ext_induct ext_inject ext_surjective ext_split ext_def |
2239 sel_convs' upd_convs' sel_defs' upd_defs' fold_congs' unfold_congs' splits' derived_defs' |
2246 sel_convs' upd_convs' sel_defs' upd_defs' fold_congs' unfold_congs' splits' derived_defs' |
2240 surjective' equality' induct_scheme' induct' cases_scheme' cases' simps' iffs'; |
2247 surjective' equality' induct_scheme' induct' cases_scheme' cases' simps' iffs'; |
2241 |
2248 |
2242 val sels = map (fst o Logic.dest_equals o Thm.prop_of) sel_defs; |
|
2243 |
|
2244 val final_thy = |
2249 val final_thy = |
2245 thms_thy' |
2250 thms_thy' |
2246 |> put_record name info |
2251 |> put_record name info |
2247 |> put_sel_upd names full_moreN depth sel_upd_simps sel_upd_defs |
2252 |> put_sel_upd names full_moreN depth sel_upd_simps sel_upd_defs |
2248 |> add_equalities extension_id equality' |
2253 |> add_equalities extension_id equality' |
2251 |> add_splits extension_id (split_meta', split_object', split_ex', induct_scheme') |
2256 |> add_splits extension_id (split_meta', split_object', split_ex', induct_scheme') |
2252 |> add_extfields extension_name (fields @ [(full_moreN, moreT)]) |
2257 |> add_extfields extension_name (fields @ [(full_moreN, moreT)]) |
2253 |> add_fieldext (extension_name, snd extension) names |
2258 |> add_fieldext (extension_name, snd extension) names |
2254 |> add_code ext_tyco vs extT ext simps' ext_inject |
2259 |> add_code ext_tyco vs extT ext simps' ext_inject |
2255 |> add_ctr_sugar (Const ext) cases_scheme' ext_inject sel_convs' |
2260 |> add_ctr_sugar (Const ext) cases_scheme' ext_inject sel_convs' |
|
2261 |> fold add_spec_rule (sel_convs' @ upd_convs' @ derived_defs') |
2256 |> Sign.restore_naming thy0; |
2262 |> Sign.restore_naming thy0; |
2257 |
2263 |
2258 in final_thy end; |
2264 in final_thy end; |
2259 |
2265 |
2260 |
2266 |