src/HOL/Tools/record_package.ML
changeset 12338 de0f4a63baa5
parent 12311 ce5f9e61c037
child 12374 59874c94d0aa
equal deleted inserted replaced
12337:7c6a970f0808 12338:de0f4a63baa5
   491 
   491 
   492 (** record simproc **)
   492 (** record simproc **)
   493 
   493 
   494 local
   494 local
   495 
   495 
   496 val sel_upd_pat = [Thm.read_cterm (Theory.sign_of HOL.thy) ("s (u k r)", HOLogic.termT)];
   496 val sel_upd_pat = [HOLogic.read_cterm (Theory.sign_of HOL.thy) "s (u k r)"];
   497 
   497 
   498 fun proc sg _ t =
   498 fun proc sg _ t =
   499   (case t of (sel as Const (s, _)) $ ((upd as Const (u, _)) $ k $ r) =>
   499   (case t of (sel as Const (s, _)) $ ((upd as Const (u, _)) $ k $ r) =>
   500     (case get_selectors sg s of Some () =>
   500     (case get_selectors sg s of Some () =>
   501       (case get_updates sg u of Some u_name =>
   501       (case get_updates sg u of Some u_name =>
   558 (* field_typedefs *)
   558 (* field_typedefs *)
   559 
   559 
   560 fun field_typedefs zeta moreT names theory =
   560 fun field_typedefs zeta moreT names theory =
   561   let
   561   let
   562     val alpha = "'a";
   562     val alpha = "'a";
   563     val aT = TFree (alpha, HOLogic.termS);
   563     val aT = TFree (alpha, HOLogic.typeS);
   564     val UNIV = HOLogic.mk_UNIV (HOLogic.mk_prodT (aT, moreT));
   564     val UNIV = HOLogic.mk_UNIV (HOLogic.mk_prodT (aT, moreT));
   565 
   565 
   566     fun type_def (thy, name) =
   566     fun type_def (thy, name) =
   567       let val (thy', {type_definition, set_def = Some def, ...}) =
   567       let val (thy', {type_definition, set_def = Some def, ...}) =
   568         thy |> setmp TypedefPackage.quiet_mode true
   568         thy |> setmp TypedefPackage.quiet_mode true
   579   let
   579   let
   580     val sign = Theory.sign_of thy;
   580     val sign = Theory.sign_of thy;
   581     val base = Sign.base_name;
   581     val base = Sign.base_name;
   582     val full_path = Sign.full_name_path sign;
   582     val full_path = Sign.full_name_path sign;
   583 
   583 
   584     val xT = TFree (variant alphas "'x", HOLogic.termS);
   584     val xT = TFree (variant alphas "'x", HOLogic.typeS);
   585 
   585 
   586 
   586 
   587     (* prepare declarations and definitions *)
   587     (* prepare declarations and definitions *)
   588 
   588 
   589     (*field constructors*)
   589     (*field constructors*)
   681     val all_xs = parent_xs @ xs;
   681     val all_xs = parent_xs @ xs;
   682     val all_vars = parent_vars @ vars;
   682     val all_vars = parent_vars @ vars;
   683     val all_named_vars = parent_named_vars @ named_vars;
   683     val all_named_vars = parent_named_vars @ named_vars;
   684 
   684 
   685     val zeta = variant alphas "'z";
   685     val zeta = variant alphas "'z";
   686     val moreT = TFree (zeta, HOLogic.termS);
   686     val moreT = TFree (zeta, HOLogic.typeS);
   687     val more = Free (moreN, moreT);
   687     val more = Free (moreN, moreT);
   688     val full_moreN = full moreN;
   688     val full_moreN = full moreN;
   689     fun more_part t = mk_more t full_moreN;
   689     fun more_part t = mk_more t full_moreN;
   690     fun more_part_update t x = mk_more_update t (full_moreN, x);
   690     fun more_part_update t x = mk_more_update t (full_moreN, x);
   691     val all_types_more = all_types @ [moreT];
   691     val all_types_more = all_types @ [moreT];