src/HOL/Tools/record.ML
changeset 61861 be63fa2b608e
parent 61260 e6f03fae14d5
child 62117 86a31308a8e1
equal deleted inserted replaced
61860:2ce3d12015b3 61861:be63fa2b608e
  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