src/HOL/Tools/record_package.ML
changeset 12265 6df58e87ec91
parent 12255 93d4972238c7
child 12302 87d1bddcdfe7
equal deleted inserted replaced
12264:9c356e2da72f 12265:6df58e87ec91
   108 val fieldN = "_field";
   108 val fieldN = "_field";
   109 val fstN = "_val";
   109 val fstN = "_val";
   110 val sndN = "_more";
   110 val sndN = "_more";
   111 val updateN = "_update";
   111 val updateN = "_update";
   112 val makeN = "make";
   112 val makeN = "make";
       
   113 val fieldsN = "fields";
   113 val extendN = "extend";
   114 val extendN = "extend";
   114 val truncateN = "truncate";
   115 val truncateN = "truncate";
   115 
   116 
   116 
   117 
   117 (*see typedef_package.ML*)
   118 (*see typedef_package.ML*)
   692     val all_xs_more = all_xs @ [moreN];
   693     val all_xs_more = all_xs @ [moreN];
   693 
   694 
   694     val parent_more = funpow parent_len mk_snd;
   695     val parent_more = funpow parent_len mk_snd;
   695     val idxs = 0 upto (len - 1);
   696     val idxs = 0 upto (len - 1);
   696 
   697 
   697     val parentT = if null parent_fields then [] else [mk_recordT (parent_fields, HOLogic.unitT)];
   698     val fieldsT = mk_recordT (fields, HOLogic.unitT);
   698     val r_parent = if null parent_fields then [] else [Free (rN, hd parentT)];
       
   699 
       
   700     fun rec_schemeT n = mk_recordT (prune n all_fields, moreT);
   699     fun rec_schemeT n = mk_recordT (prune n all_fields, moreT);
   701     fun rec_scheme n = mk_record (prune n all_named_vars, more);
   700     fun rec_scheme n = mk_record (prune n all_named_vars, more);
   702     fun recT n = mk_recordT (prune n all_fields, HOLogic.unitT);
   701     fun recT n = mk_recordT (prune n all_fields, HOLogic.unitT);
   703     fun rec_ n = mk_record (prune n all_named_vars, HOLogic.unit);
   702     fun rec_ n = mk_record (prune n all_named_vars, HOLogic.unit);
   704     fun r_scheme n = Free (rN, rec_schemeT n);
   703     fun r_scheme n = Free (rN, rec_schemeT n);
   715 
   714 
   716     val sel_decls = map (mk_selC (rec_schemeT 0)) bfields @
   715     val sel_decls = map (mk_selC (rec_schemeT 0)) bfields @
   717       [mk_moreC (rec_schemeT 0) (moreN, moreT)];
   716       [mk_moreC (rec_schemeT 0) (moreN, moreT)];
   718     val update_decls = map (mk_updateC (rec_schemeT 0)) bfields @
   717     val update_decls = map (mk_updateC (rec_schemeT 0)) bfields @
   719       [mk_more_updateC (rec_schemeT 0) (moreN, moreT)];
   718       [mk_more_updateC (rec_schemeT 0) (moreN, moreT)];
   720     val make_decl = (makeN, parentT ---> types ---> recT 0);
   719     val make_decl = (makeN, all_types ---> recT 0);
       
   720     val fields_decl = (fieldsN, types ---> fieldsT);
   721     val extend_decl = (extendN, recT 0 --> moreT --> rec_schemeT 0);
   721     val extend_decl = (extendN, recT 0 --> moreT --> rec_schemeT 0);
   722     val truncate_decl = (truncateN, rec_schemeT 0 --> recT 0);
   722     val truncate_decl = (truncateN, rec_schemeT 0 --> recT 0);
   723 
   723 
   724 
   724 
   725     (* prepare definitions *)
   725     (* prepare definitions *)
   744     val update_specs =
   744     val update_specs =
   745       ListPair.map mk_upd_spec (idxs, named_vars) @
   745       ListPair.map mk_upd_spec (idxs, named_vars) @
   746         [more_part_update (r_scheme 0) more :== mk_record (all_sels, more)];
   746         [more_part_update (r_scheme 0) more :== mk_record (all_sels, more)];
   747 
   747 
   748     (*derived operations*)
   748     (*derived operations*)
   749     val make_spec = Const (full makeN, parentT ---> types ---> recT 0) $$ r_parent $$ vars :==
   749     val make_spec = Const (full makeN, all_types ---> recT 0) $$ all_vars :==
   750       mk_record (flat (map (mk_named_sels parent_names) r_parent) @ named_vars, HOLogic.unit);
   750       mk_record (all_named_vars, HOLogic.unit);
       
   751     val fields_spec = Const (full fieldsN, types ---> fieldsT) $$ vars :==
       
   752       mk_record (named_vars, HOLogic.unit);
   751     val extend_spec = Const (full extendN, recT 0 --> moreT --> rec_schemeT 0) $ r 0 $ more :==
   753     val extend_spec = Const (full extendN, recT 0 --> moreT --> rec_schemeT 0) $ r 0 $ more :==
   752       mk_record (mk_named_sels all_names (r 0), more);
   754       mk_record (mk_named_sels all_names (r 0), more);
   753     val truncate_spec = Const (full truncateN, rec_schemeT 0 --> recT 0) $ r_scheme 0 :==
   755     val truncate_spec = Const (full truncateN, rec_schemeT 0 --> recT 0) $ r_scheme 0 :==
   754       mk_record (all_sels, HOLogic.unit);
   756       mk_record (all_sels, HOLogic.unit);
   755 
   757 
   824       |> Theory.parent_path
   826       |> Theory.parent_path
   825       |> Theory.add_tyabbrs_i recordT_specs
   827       |> Theory.add_tyabbrs_i recordT_specs
   826       |> Theory.add_path bname
   828       |> Theory.add_path bname
   827       |> Theory.add_trfuns ([], [], field_tr's, [])
   829       |> Theory.add_trfuns ([], [], field_tr's, [])
   828       |> (Theory.add_consts_i o map Syntax.no_syn)
   830       |> (Theory.add_consts_i o map Syntax.no_syn)
   829         (sel_decls @ update_decls @ [make_decl, extend_decl, truncate_decl])
   831         (sel_decls @ update_decls @ [make_decl, fields_decl, extend_decl, truncate_decl])
   830       |> (PureThy.add_defs_i false o map Thm.no_attributes) sel_specs
   832       |> (PureThy.add_defs_i false o map Thm.no_attributes) sel_specs
   831       |>>> (PureThy.add_defs_i false o map Thm.no_attributes) update_specs
   833       |>>> (PureThy.add_defs_i false o map Thm.no_attributes) update_specs
   832       |>>> (PureThy.add_defs_i false o map Thm.no_attributes)
   834       |>>> (PureThy.add_defs_i false o map Thm.no_attributes)
   833         [make_spec, extend_spec, truncate_spec];
   835         [make_spec, fields_spec, extend_spec, truncate_spec];
   834 
   836 
   835 
   837 
   836     (* 3rd stage: thms_thy *)
   838     (* 3rd stage: thms_thy *)
   837 
   839 
   838     val prove_standard = Tactic.prove_standard (Theory.sign_of defs_thy);
   840     val prove_standard = Tactic.prove_standard (Theory.sign_of defs_thy);
   867       |> (PureThy.add_thmss o map Thm.no_attributes)
   869       |> (PureThy.add_thmss o map Thm.no_attributes)
   868        [("select_convs", sel_convs),
   870        [("select_convs", sel_convs),
   869         ("update_convs", update_convs),
   871         ("update_convs", update_convs),
   870         ("select_defs", sel_defs),
   872         ("select_defs", sel_defs),
   871         ("update_defs", update_defs),
   873         ("update_defs", update_defs),
   872         ("derived_defs", derived_defs)]
   874         ("defs", derived_defs)]
   873       |>>> PureThy.add_thms
   875       |>>> PureThy.add_thms
   874        [(("induct_scheme", induct_scheme0), induct_type_global (suffix schemeN name)),
   876        [(("induct_scheme", induct_scheme0), induct_type_global (suffix schemeN name)),
   875         (("cases_scheme", cases_scheme0), cases_type_global (suffix schemeN name))]
   877         (("cases_scheme", cases_scheme0), cases_type_global (suffix schemeN name))]
   876       |>>> PureThy.add_thmss
   878       |>>> PureThy.add_thmss
   877         [(("more_induct_scheme", more_induct_scheme), induct_type_global ""),
   879         [(("more_induct_scheme", more_induct_scheme), induct_type_global ""),