src/HOL/Tools/record.ML
changeset 42290 b1f544c84040
parent 42284 326f57825e1a
child 42358 b47d41d9f4b5
equal deleted inserted replaced
42289:dafae095d733 42290:b1f544c84040
   713                         (#1 (split_last alphas));
   713                         (#1 (split_last alphas));
   714 
   714 
   715                     val more' = mk_ext rest;
   715                     val more' = mk_ext rest;
   716                   in
   716                   in
   717                     list_comb
   717                     list_comb
   718                       (Syntax.const (Syntax.mark_type (suffix ext_typeN ext)), alphas' @ [more'])
   718                       (Syntax.const (Lexicon.mark_type (suffix ext_typeN ext)), alphas' @ [more'])
   719                   end
   719                   end
   720               | NONE => err ("no fields defined for " ^ ext))
   720               | NONE => err ("no fields defined for " ^ ext))
   721           | NONE => err (name ^ " is no proper field"))
   721           | NONE => err (name ^ " is no proper field"))
   722       | mk_ext [] = more;
   722       | mk_ext [] = more;
   723   in
   723   in
   758               (case get_extfields thy ext of
   758               (case get_extfields thy ext of
   759                 SOME fields =>
   759                 SOME fields =>
   760                   let
   760                   let
   761                     val (args, rest) = split_args (map fst (fst (split_last fields))) fargs;
   761                     val (args, rest) = split_args (map fst (fst (split_last fields))) fargs;
   762                     val more' = mk_ext rest;
   762                     val more' = mk_ext rest;
   763                   in list_comb (Syntax.const (Syntax.mark_const (ext ^ extN)), args @ [more']) end
   763                   in list_comb (Syntax.const (Lexicon.mark_const (ext ^ extN)), args @ [more']) end
   764               | NONE => err ("no fields defined for " ^ ext))
   764               | NONE => err ("no fields defined for " ^ ext))
   765           | NONE => err (name ^ " is no proper field"))
   765           | NONE => err (name ^ " is no proper field"))
   766       | mk_ext [] = more;
   766       | mk_ext [] = more;
   767   in mk_ext (fields_tr t) end;
   767   in mk_ext (fields_tr t) end;
   768 
   768 
   887 
   887 
   888 in
   888 in
   889 
   889 
   890 fun record_ext_type_tr' name =
   890 fun record_ext_type_tr' name =
   891   let
   891   let
   892     val ext_type_name = Syntax.mark_type (suffix ext_typeN name);
   892     val ext_type_name = Lexicon.mark_type (suffix ext_typeN name);
   893     fun tr' ctxt ts =
   893     fun tr' ctxt ts =
   894       record_type_tr' ctxt (list_comb (Syntax.const ext_type_name, ts));
   894       record_type_tr' ctxt (list_comb (Syntax.const ext_type_name, ts));
   895   in (ext_type_name, tr') end;
   895   in (ext_type_name, tr') end;
   896 
   896 
   897 fun record_ext_type_abbr_tr' abbr alphas zeta last_ext schemeT name =
   897 fun record_ext_type_abbr_tr' abbr alphas zeta last_ext schemeT name =
   898   let
   898   let
   899     val ext_type_name = Syntax.mark_type (suffix ext_typeN name);
   899     val ext_type_name = Lexicon.mark_type (suffix ext_typeN name);
   900     fun tr' ctxt ts =
   900     fun tr' ctxt ts =
   901       record_type_abbr_tr' abbr alphas zeta last_ext schemeT ctxt
   901       record_type_abbr_tr' abbr alphas zeta last_ext schemeT ctxt
   902         (list_comb (Syntax.const ext_type_name, ts));
   902         (list_comb (Syntax.const ext_type_name, ts));
   903   in (ext_type_name, tr') end;
   903   in (ext_type_name, tr') end;
   904 
   904 
   917     val extern = Consts.extern (ProofContext.consts_of ctxt);
   917     val extern = Consts.extern (ProofContext.consts_of ctxt);
   918 
   918 
   919     fun strip_fields t =
   919     fun strip_fields t =
   920       (case strip_comb t of
   920       (case strip_comb t of
   921         (Const (ext, _), args as (_ :: _)) =>
   921         (Const (ext, _), args as (_ :: _)) =>
   922           (case try (Syntax.unmark_const o unsuffix extN) ext of
   922           (case try (Lexicon.unmark_const o unsuffix extN) ext of
   923             SOME ext' =>
   923             SOME ext' =>
   924               (case get_extfields thy ext' of
   924               (case get_extfields thy ext' of
   925                 SOME fields =>
   925                 SOME fields =>
   926                  (let
   926                  (let
   927                     val (f :: fs, _) = split_last (map fst fields);
   927                     val (f :: fs, _) = split_last (map fst fields);
   944 
   944 
   945 in
   945 in
   946 
   946 
   947 fun record_ext_tr' name =
   947 fun record_ext_tr' name =
   948   let
   948   let
   949     val ext_name = Syntax.mark_const (name ^ extN);
   949     val ext_name = Lexicon.mark_const (name ^ extN);
   950     fun tr' ctxt ts = record_tr' ctxt (list_comb (Syntax.const ext_name, ts));
   950     fun tr' ctxt ts = record_tr' ctxt (list_comb (Syntax.const ext_name, ts));
   951   in (ext_name, tr') end;
   951   in (ext_name, tr') end;
   952 
   952 
   953 end;
   953 end;
   954 
   954 
   955 
   955 
   956 local
   956 local
   957 
   957 
   958 fun dest_update ctxt c =
   958 fun dest_update ctxt c =
   959   (case try Syntax.unmark_const c of
   959   (case try Lexicon.unmark_const c of
   960     SOME d => try (unsuffix updateN) (Consts.extern (ProofContext.consts_of ctxt) d)
   960     SOME d => try (unsuffix updateN) (Consts.extern (ProofContext.consts_of ctxt) d)
   961   | NONE => NONE);
   961   | NONE => NONE);
   962 
   962 
   963 fun field_updates_tr' ctxt (tm as Const (c, _) $ k $ u) =
   963 fun field_updates_tr' ctxt (tm as Const (c, _) $ k $ u) =
   964       (case dest_update ctxt c of
   964       (case dest_update ctxt c of
   980 
   980 
   981 in
   981 in
   982 
   982 
   983 fun field_update_tr' name =
   983 fun field_update_tr' name =
   984   let
   984   let
   985     val update_name = Syntax.mark_const (name ^ updateN);
   985     val update_name = Lexicon.mark_const (name ^ updateN);
   986     fun tr' ctxt [t, u] = record_update_tr' ctxt (Syntax.const update_name $ t $ u)
   986     fun tr' ctxt [t, u] = record_update_tr' ctxt (Syntax.const update_name $ t $ u)
   987       | tr' _ _ = raise Match;
   987       | tr' _ _ = raise Match;
   988   in (update_name, tr') end;
   988   in (update_name, tr') end;
   989 
   989 
   990 end;
   990 end;