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 ""), |