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)); |