src/Pure/sign.ML
changeset 77895 655bd3b0671b
parent 77889 5db014c36f42
child 79345 75701d767ed9
equal deleted inserted replaced
77894:186bd4012b78 77895:655bd3b0671b
   127 datatype sign = Sign of
   127 datatype sign = Sign of
   128  {syn: Syntax.syntax,           (*concrete syntax for terms, types, sorts*)
   128  {syn: Syntax.syntax,           (*concrete syntax for terms, types, sorts*)
   129   tsig: Type.tsig,              (*order-sorted signature of types*)
   129   tsig: Type.tsig,              (*order-sorted signature of types*)
   130   consts: Consts.T};            (*polymorphic constants*)
   130   consts: Consts.T};            (*polymorphic constants*)
   131 
   131 
       
   132 fun rep_sign (Sign args) = args;
   132 fun make_sign (syn, tsig, consts) = Sign {syn = syn, tsig = tsig, consts = consts};
   133 fun make_sign (syn, tsig, consts) = Sign {syn = syn, tsig = tsig, consts = consts};
   133 
   134 
   134 structure Data = Theory_Data'
   135 structure Data = Theory_Data'
   135 (
   136 (
   136   type T = sign;
   137   type T = sign;
   137   val empty = make_sign (Syntax.empty_syntax, Type.empty_tsig, Consts.empty);
   138   val empty = make_sign (Syntax.empty_syntax, Type.empty_tsig, Consts.empty);
   138   fun merge old_thys (sign1, sign2) =
   139   fun merge args =
   139     let
   140     let
   140       val Sign {syn = syn1, tsig = tsig1, consts = consts1} = sign1;
   141       val context0 = Context.Theory (#1 (hd args));
   141       val Sign {syn = syn2, tsig = tsig2, consts = consts2} = sign2;
   142       val syn' = Library.foldl1 Syntax.merge_syntax (map (#syn o rep_sign o #2) args);
   142 
   143       val tsig' = Library.foldl1 (Type.merge_tsig context0) (map (#tsig o rep_sign o #2) args);
   143       val syn = Syntax.merge_syntax (syn1, syn2);
   144       val consts' = Library.foldl1 Consts.merge (map (#consts o rep_sign o #2) args);
   144       val tsig = Type.merge_tsig (Context.Theory (fst old_thys)) (tsig1, tsig2);
   145     in make_sign (syn', tsig', consts') end;
   145       val consts = Consts.merge (consts1, consts2);
       
   146     in make_sign (syn, tsig, consts) end;
       
   147 );
   146 );
   148 
   147 
   149 fun rep_sg thy = Data.get thy |> (fn Sign args => args);
   148 val rep_sg = rep_sign o Data.get;
   150 
   149 
   151 fun map_sign f = Data.map (fn Sign {syn, tsig, consts} => make_sign (f (syn, tsig, consts)));
   150 fun map_sign f = Data.map (fn Sign {syn, tsig, consts} => make_sign (f (syn, tsig, consts)));
   152 
   151 
   153 fun map_syn f = map_sign (fn (syn, tsig, consts) => (f syn, tsig, consts));
   152 fun map_syn f = map_sign (fn (syn, tsig, consts) => (f syn, tsig, consts));
   154 fun map_tsig f = map_sign (fn (syn, tsig, consts) => (syn, f tsig, consts));
   153 fun map_tsig f = map_sign (fn (syn, tsig, consts) => (syn, f tsig, consts));