|
wenzelm@19
|
1 |
(* Title: Pure/sign.ML
|
|
clasohm@0
|
2 |
ID: $Id$
|
|
wenzelm@251
|
3 |
Author: Lawrence C Paulson and Markus Wenzel
|
|
clasohm@0
|
4 |
|
|
wenzelm@251
|
5 |
The abstract type "sg" of signatures.
|
|
wenzelm@251
|
6 |
|
|
wenzelm@251
|
7 |
TODO:
|
|
wenzelm@386
|
8 |
pure sign: elim Syntax.constrainC
|
|
clasohm@0
|
9 |
*)
|
|
clasohm@0
|
10 |
|
|
wenzelm@19
|
11 |
signature SIGN =
|
|
clasohm@0
|
12 |
sig
|
|
clasohm@0
|
13 |
structure Symtab: SYMTAB
|
|
clasohm@0
|
14 |
structure Syntax: SYNTAX
|
|
wenzelm@251
|
15 |
structure Type: TYPE
|
|
wenzelm@143
|
16 |
sharing Symtab = Type.Symtab
|
|
wenzelm@386
|
17 |
local open Type Syntax Syntax.Mixfix in
|
|
wenzelm@251
|
18 |
type sg
|
|
wenzelm@251
|
19 |
val rep_sg: sg ->
|
|
wenzelm@251
|
20 |
{tsig: type_sig,
|
|
wenzelm@251
|
21 |
const_tab: typ Symtab.table,
|
|
wenzelm@386
|
22 |
syn: syntax,
|
|
wenzelm@251
|
23 |
stamps: string ref list}
|
|
wenzelm@251
|
24 |
val subsig: sg * sg -> bool
|
|
wenzelm@251
|
25 |
val eq_sg: sg * sg -> bool
|
|
wenzelm@386
|
26 |
val is_draft: sg -> bool
|
|
wenzelm@386
|
27 |
val const_type: sg -> string -> typ option
|
|
wenzelm@251
|
28 |
val print_sg: sg -> unit
|
|
wenzelm@251
|
29 |
val pprint_sg: sg -> pprint_args -> unit
|
|
wenzelm@386
|
30 |
val pretty_term: sg -> term -> Pretty.T
|
|
wenzelm@386
|
31 |
val pretty_typ: sg -> typ -> Pretty.T
|
|
wenzelm@251
|
32 |
val string_of_term: sg -> term -> string
|
|
wenzelm@251
|
33 |
val string_of_typ: sg -> typ -> string
|
|
wenzelm@251
|
34 |
val pprint_term: sg -> term -> pprint_args -> unit
|
|
wenzelm@251
|
35 |
val pprint_typ: sg -> typ -> pprint_args -> unit
|
|
wenzelm@251
|
36 |
val certify_typ: sg -> typ -> typ
|
|
wenzelm@251
|
37 |
val certify_term: sg -> term -> term * typ * int
|
|
wenzelm@251
|
38 |
val read_typ: sg * (indexname -> sort option) -> string -> typ
|
|
wenzelm@386
|
39 |
val add_classes: (class list * class * class list) list -> sg -> sg
|
|
wenzelm@386
|
40 |
val add_defsort: sort -> sg -> sg
|
|
wenzelm@386
|
41 |
val add_types: (string * int * mixfix) list -> sg -> sg
|
|
wenzelm@386
|
42 |
val add_tyabbrs: (string * string list * string * mixfix) list -> sg -> sg
|
|
wenzelm@386
|
43 |
val add_tyabbrs_i: (string * string list * typ * mixfix) list -> sg -> sg
|
|
wenzelm@386
|
44 |
val add_arities: (string * sort list * sort) list -> sg -> sg
|
|
wenzelm@386
|
45 |
val add_consts: (string * string * mixfix) list -> sg -> sg
|
|
wenzelm@386
|
46 |
val add_consts_i: (string * typ * mixfix) list -> sg -> sg
|
|
wenzelm@386
|
47 |
val add_syntax: (string * string * mixfix) list -> sg -> sg
|
|
wenzelm@386
|
48 |
val add_syntax_i: (string * typ * mixfix) list -> sg -> sg
|
|
wenzelm@386
|
49 |
val add_trfuns:
|
|
wenzelm@386
|
50 |
(string * (ast list -> ast)) list *
|
|
wenzelm@386
|
51 |
(string * (term list -> term)) list *
|
|
wenzelm@386
|
52 |
(string * (term list -> term)) list *
|
|
wenzelm@386
|
53 |
(string * (ast list -> ast)) list -> sg -> sg
|
|
wenzelm@386
|
54 |
val add_trrules: xrule list -> sg -> sg
|
|
wenzelm@386
|
55 |
val add_name: string -> sg -> sg
|
|
wenzelm@386
|
56 |
val make_draft: sg -> sg
|
|
wenzelm@251
|
57 |
val extend: sg -> string ->
|
|
wenzelm@251
|
58 |
(class * class list) list * class list *
|
|
wenzelm@251
|
59 |
(string list * int) list *
|
|
wenzelm@251
|
60 |
(string * string list * string) list *
|
|
wenzelm@251
|
61 |
(string list * (sort list * class)) list *
|
|
wenzelm@386
|
62 |
(string list * string) list * sext option -> sg
|
|
wenzelm@251
|
63 |
val merge: sg * sg -> sg
|
|
wenzelm@251
|
64 |
val pure: sg
|
|
wenzelm@386
|
65 |
val const_of_class: class -> string
|
|
wenzelm@386
|
66 |
val class_of_const: string -> class
|
|
wenzelm@251
|
67 |
end
|
|
clasohm@0
|
68 |
end;
|
|
clasohm@0
|
69 |
|
|
wenzelm@251
|
70 |
functor SignFun(structure Syntax: SYNTAX and Type: TYPE): SIGN =
|
|
wenzelm@143
|
71 |
struct
|
|
clasohm@0
|
72 |
|
|
clasohm@0
|
73 |
structure Symtab = Type.Symtab;
|
|
clasohm@0
|
74 |
structure Syntax = Syntax;
|
|
wenzelm@386
|
75 |
structure BasicSyntax: BASIC_SYNTAX = Syntax;
|
|
wenzelm@251
|
76 |
structure Pretty = Syntax.Pretty;
|
|
wenzelm@251
|
77 |
structure Type = Type;
|
|
wenzelm@386
|
78 |
open BasicSyntax Type;
|
|
wenzelm@386
|
79 |
open Syntax.Mixfix; (* FIXME *)
|
|
clasohm@0
|
80 |
|
|
wenzelm@143
|
81 |
|
|
wenzelm@251
|
82 |
(** datatype sg **)
|
|
wenzelm@251
|
83 |
|
|
wenzelm@251
|
84 |
(*the "ref" in stamps ensures that no two signatures are identical -- it is
|
|
wenzelm@251
|
85 |
impossible to forge a signature*)
|
|
wenzelm@143
|
86 |
|
|
wenzelm@19
|
87 |
datatype sg =
|
|
wenzelm@143
|
88 |
Sg of {
|
|
wenzelm@251
|
89 |
tsig: type_sig, (*order-sorted signature of types*)
|
|
wenzelm@143
|
90 |
const_tab: typ Symtab.table, (*types of constants*)
|
|
wenzelm@143
|
91 |
syn: Syntax.syntax, (*syntax for parsing and printing*)
|
|
wenzelm@143
|
92 |
stamps: string ref list}; (*unique theory indentifier*)
|
|
clasohm@0
|
93 |
|
|
clasohm@0
|
94 |
fun rep_sg (Sg args) = args;
|
|
clasohm@0
|
95 |
|
|
nipkow@206
|
96 |
|
|
wenzelm@386
|
97 |
fun is_draft (Sg {stamps = ref "#" :: _, ...}) = true
|
|
wenzelm@386
|
98 |
| is_draft _ = false;
|
|
wenzelm@386
|
99 |
|
|
wenzelm@251
|
100 |
fun subsig (Sg {stamps = s1, ...}, Sg {stamps = s2, ...}) = s1 subset s2;
|
|
clasohm@0
|
101 |
|
|
wenzelm@266
|
102 |
fun eq_sg (Sg {stamps = s1, ...}, Sg {stamps = s2, ...}) = eq_set (s1, s2);
|
|
clasohm@0
|
103 |
|
|
clasohm@0
|
104 |
|
|
wenzelm@386
|
105 |
fun const_type (Sg {const_tab, ...}) c =
|
|
wenzelm@386
|
106 |
Symtab.lookup (const_tab, c);
|
|
wenzelm@386
|
107 |
|
|
wenzelm@386
|
108 |
|
|
clasohm@0
|
109 |
|
|
wenzelm@251
|
110 |
(** print signature **)
|
|
clasohm@0
|
111 |
|
|
wenzelm@386
|
112 |
val stamp_names = rev o map !;
|
|
wenzelm@386
|
113 |
|
|
wenzelm@251
|
114 |
fun print_sg sg =
|
|
wenzelm@251
|
115 |
let
|
|
wenzelm@251
|
116 |
fun prt_typ syn ty = Pretty.quote (Syntax.pretty_typ syn ty);
|
|
clasohm@0
|
117 |
|
|
wenzelm@251
|
118 |
fun pretty_sort [cl] = Pretty.str cl
|
|
wenzelm@251
|
119 |
| pretty_sort cls = Pretty.str_list "{" "}" cls;
|
|
wenzelm@169
|
120 |
|
|
wenzelm@251
|
121 |
fun pretty_subclass (cl, cls) = Pretty.block
|
|
wenzelm@251
|
122 |
[Pretty.str (cl ^ " <"), Pretty.brk 1, pretty_sort cls];
|
|
clasohm@0
|
123 |
|
|
wenzelm@251
|
124 |
fun pretty_default cls = Pretty.block
|
|
wenzelm@251
|
125 |
[Pretty.str "default:", Pretty.brk 1, pretty_sort cls];
|
|
clasohm@0
|
126 |
|
|
wenzelm@251
|
127 |
fun pretty_arg (ty, n) = Pretty.str (ty ^ " " ^ string_of_int n);
|
|
wenzelm@251
|
128 |
|
|
wenzelm@251
|
129 |
fun pretty_abbr syn (ty, (vs, rhs)) = Pretty.block
|
|
wenzelm@251
|
130 |
[prt_typ syn (Type (ty, map (fn v => TVar (v, [])) vs)),
|
|
wenzelm@251
|
131 |
Pretty.str " =", Pretty.brk 1, prt_typ syn rhs];
|
|
wenzelm@251
|
132 |
|
|
wenzelm@251
|
133 |
fun pretty_arity ty (cl, []) = Pretty.block
|
|
wenzelm@251
|
134 |
[Pretty.str (ty ^ " ::"), Pretty.brk 1, Pretty.str cl]
|
|
wenzelm@251
|
135 |
| pretty_arity ty (cl, srts) = Pretty.block
|
|
wenzelm@251
|
136 |
[Pretty.str (ty ^ " ::"), Pretty.brk 1,
|
|
wenzelm@251
|
137 |
Pretty.list "(" ")" (map pretty_sort srts),
|
|
wenzelm@251
|
138 |
Pretty.brk 1, Pretty.str cl];
|
|
wenzelm@251
|
139 |
|
|
wenzelm@251
|
140 |
fun pretty_coreg (ty, ars) = map (pretty_arity ty) ars;
|
|
wenzelm@251
|
141 |
|
|
wenzelm@251
|
142 |
fun pretty_const syn (c, ty) = Pretty.block
|
|
wenzelm@266
|
143 |
[Pretty.str (quote c ^ " ::"), Pretty.brk 1, prt_typ syn ty];
|
|
wenzelm@251
|
144 |
|
|
wenzelm@251
|
145 |
|
|
wenzelm@251
|
146 |
val Sg {tsig, const_tab, syn, stamps} = sg;
|
|
wenzelm@251
|
147 |
val {classes, subclass, default, args, abbrs, coreg} = rep_tsig tsig;
|
|
wenzelm@251
|
148 |
in
|
|
wenzelm@386
|
149 |
Pretty.writeln (Pretty.strs ("stamps:" :: stamp_names stamps));
|
|
wenzelm@251
|
150 |
Pretty.writeln (Pretty.strs ("classes:" :: classes));
|
|
wenzelm@251
|
151 |
Pretty.writeln (Pretty.big_list "subclass:" (map pretty_subclass subclass));
|
|
wenzelm@251
|
152 |
Pretty.writeln (pretty_default default);
|
|
wenzelm@251
|
153 |
Pretty.writeln (Pretty.big_list "types:" (map pretty_arg args));
|
|
wenzelm@251
|
154 |
Pretty.writeln (Pretty.big_list "abbrs:" (map (pretty_abbr syn) abbrs));
|
|
wenzelm@251
|
155 |
Pretty.writeln (Pretty.big_list "coreg:" (flat (map pretty_coreg coreg)));
|
|
wenzelm@251
|
156 |
Pretty.writeln (Pretty.big_list "consts:"
|
|
wenzelm@386
|
157 |
(map (pretty_const syn) (Symtab.dest const_tab)))
|
|
wenzelm@251
|
158 |
end;
|
|
wenzelm@251
|
159 |
|
|
wenzelm@251
|
160 |
|
|
wenzelm@251
|
161 |
fun pprint_sg (Sg {stamps, ...}) =
|
|
wenzelm@386
|
162 |
Pretty.pprint (Pretty.str_list "{" "}" (stamp_names stamps));
|
|
wenzelm@251
|
163 |
|
|
wenzelm@251
|
164 |
|
|
wenzelm@251
|
165 |
|
|
wenzelm@251
|
166 |
(** pretty printing of terms and types **)
|
|
wenzelm@251
|
167 |
|
|
wenzelm@251
|
168 |
fun pretty_term (Sg {syn, ...}) = Syntax.pretty_term syn;
|
|
wenzelm@251
|
169 |
fun pretty_typ (Sg {syn, ...}) = Syntax.pretty_typ syn;
|
|
wenzelm@251
|
170 |
|
|
wenzelm@251
|
171 |
fun string_of_term (Sg {syn, ...}) = Syntax.string_of_term syn;
|
|
wenzelm@251
|
172 |
fun string_of_typ (Sg {syn, ...}) = Syntax.string_of_typ syn;
|
|
wenzelm@251
|
173 |
|
|
wenzelm@251
|
174 |
fun pprint_term sg = Pretty.pprint o Pretty.quote o (pretty_term sg);
|
|
wenzelm@251
|
175 |
fun pprint_typ sg = Pretty.pprint o Pretty.quote o (pretty_typ sg);
|
|
wenzelm@251
|
176 |
|
|
wenzelm@251
|
177 |
|
|
wenzelm@251
|
178 |
|
|
wenzelm@386
|
179 |
(** certify types and terms **) (*exception TYPE*)
|
|
wenzelm@251
|
180 |
|
|
wenzelm@251
|
181 |
fun certify_typ (Sg {tsig, ...}) ty = cert_typ tsig ty;
|
|
wenzelm@251
|
182 |
|
|
wenzelm@251
|
183 |
|
|
wenzelm@386
|
184 |
fun mapfilt_atoms f (Abs (_, _, t)) = mapfilt_atoms f t
|
|
wenzelm@386
|
185 |
| mapfilt_atoms f (t $ u) = mapfilt_atoms f t @ mapfilt_atoms f u
|
|
wenzelm@386
|
186 |
| mapfilt_atoms f a = (case f a of Some y => [y] | None => []);
|
|
wenzelm@251
|
187 |
|
|
wenzelm@386
|
188 |
fun certify_term (sg as Sg {tsig, ...}) tm =
|
|
wenzelm@169
|
189 |
let
|
|
wenzelm@251
|
190 |
fun valid_const a T =
|
|
wenzelm@386
|
191 |
(case const_type sg a of
|
|
wenzelm@251
|
192 |
Some U => typ_instance (tsig, T, U)
|
|
wenzelm@251
|
193 |
| _ => false);
|
|
wenzelm@143
|
194 |
|
|
wenzelm@251
|
195 |
fun atom_err (Const (a, T)) =
|
|
wenzelm@251
|
196 |
if valid_const a T then None
|
|
wenzelm@251
|
197 |
else Some ("Illegal type for constant " ^ quote a ^ " :: " ^
|
|
wenzelm@251
|
198 |
quote (string_of_typ sg T))
|
|
wenzelm@251
|
199 |
| atom_err (Var ((x, i), _)) =
|
|
wenzelm@251
|
200 |
if i < 0 then Some ("Negative index for Var " ^ quote x) else None
|
|
wenzelm@251
|
201 |
| atom_err _ = None;
|
|
clasohm@0
|
202 |
|
|
wenzelm@251
|
203 |
val norm_tm =
|
|
wenzelm@251
|
204 |
(case it_term_types (typ_errors tsig) (tm, []) of
|
|
wenzelm@251
|
205 |
[] => map_term_types (norm_typ tsig) tm
|
|
wenzelm@251
|
206 |
| errs => raise_type (cat_lines errs) [] [tm]);
|
|
wenzelm@251
|
207 |
in
|
|
wenzelm@386
|
208 |
(case mapfilt_atoms atom_err norm_tm of
|
|
wenzelm@251
|
209 |
[] => (norm_tm, type_of norm_tm, maxidx_of_term norm_tm)
|
|
wenzelm@251
|
210 |
| errs => raise_type (cat_lines errs) [] [norm_tm])
|
|
wenzelm@251
|
211 |
end;
|
|
wenzelm@251
|
212 |
|
|
wenzelm@251
|
213 |
|
|
wenzelm@251
|
214 |
|
|
wenzelm@386
|
215 |
(** read types **) (*exception ERROR*)
|
|
wenzelm@251
|
216 |
|
|
wenzelm@386
|
217 |
(* FIXME rd_typ vs. read_raw_typ (?) *)
|
|
wenzelm@251
|
218 |
|
|
wenzelm@251
|
219 |
fun rd_typ tsig syn sort_of s =
|
|
wenzelm@251
|
220 |
let
|
|
wenzelm@251
|
221 |
val def_sort = defaultS tsig;
|
|
wenzelm@251
|
222 |
val raw_ty = (*this may raise ERROR, too!*)
|
|
wenzelm@251
|
223 |
Syntax.read_typ syn (fn x => if_none (sort_of x) def_sort) s;
|
|
wenzelm@251
|
224 |
in
|
|
wenzelm@251
|
225 |
cert_typ tsig raw_ty
|
|
wenzelm@251
|
226 |
handle TYPE (msg, _, _) => error msg
|
|
wenzelm@251
|
227 |
end
|
|
wenzelm@251
|
228 |
handle ERROR => error ("The error(s) above occurred in type " ^ quote s);
|
|
wenzelm@251
|
229 |
|
|
wenzelm@251
|
230 |
fun read_typ (Sg {tsig, syn, ...}, sort_of) s = rd_typ tsig syn sort_of s;
|
|
wenzelm@251
|
231 |
|
|
wenzelm@251
|
232 |
|
|
wenzelm@251
|
233 |
|
|
wenzelm@386
|
234 |
(** extend signature **) (*exception ERROR*)
|
|
wenzelm@251
|
235 |
|
|
wenzelm@386
|
236 |
(* FIXME -> type.ML *)
|
|
wenzelm@386
|
237 |
|
|
wenzelm@386
|
238 |
(* FIXME replace? *)
|
|
wenzelm@386
|
239 |
fun varify_typ (Type (t, tys)) = Type (t, map varify_typ tys)
|
|
wenzelm@386
|
240 |
| varify_typ (TFree (a, s)) = TVar ((a, 0), s)
|
|
wenzelm@386
|
241 |
| varify_typ (ty as TVar _) =
|
|
wenzelm@386
|
242 |
raise_type "Illegal schematic type variable" [ty] [];
|
|
wenzelm@386
|
243 |
|
|
wenzelm@386
|
244 |
|
|
wenzelm@386
|
245 |
(* fake newstyle interfaces *) (* FIXME -> type.ML *)
|
|
wenzelm@386
|
246 |
|
|
wenzelm@386
|
247 |
fun ext_tsig_classes tsig classes =
|
|
wenzelm@386
|
248 |
if exists (fn ([], _, _) => false | _ => true) classes then
|
|
wenzelm@386
|
249 |
sys_error "FIXME ext_tsig_classes"
|
|
wenzelm@386
|
250 |
else
|
|
wenzelm@386
|
251 |
extend_tsig tsig (map (fn (_, c, cs) => (c, cs)) classes, [], [], []);
|
|
wenzelm@386
|
252 |
|
|
wenzelm@386
|
253 |
fun ext_tsig_defsort tsig defsort =
|
|
wenzelm@386
|
254 |
extend_tsig tsig ([], defsort, [], []);
|
|
wenzelm@386
|
255 |
|
|
wenzelm@386
|
256 |
fun ext_tsig_types tsig types =
|
|
wenzelm@386
|
257 |
extend_tsig tsig ([], [], map (fn (t, n) => ([t], n)) types, []);
|
|
wenzelm@386
|
258 |
|
|
wenzelm@386
|
259 |
(* FIXME varify_typ, rem_sorts; norm_typ (?) *)
|
|
wenzelm@386
|
260 |
fun ext_tsig_abbrs tsig abbrs = Type.ext_tsig_abbrs tsig
|
|
wenzelm@386
|
261 |
(map (fn (t, vs, rhs) => (t, (map (rpair 0) vs, varifyT rhs))) abbrs);
|
|
wenzelm@386
|
262 |
|
|
wenzelm@386
|
263 |
fun ext_tsig_arities tsig arities = extend_tsig tsig
|
|
wenzelm@386
|
264 |
([], [], [], flat (map (fn (t, ss, cs) => map (fn c => ([t], (ss, c))) cs) arities));
|
|
wenzelm@386
|
265 |
|
|
wenzelm@386
|
266 |
|
|
wenzelm@386
|
267 |
|
|
wenzelm@386
|
268 |
(** read types **) (*exception ERROR*)
|
|
wenzelm@386
|
269 |
|
|
wenzelm@386
|
270 |
fun err_in_type s =
|
|
wenzelm@386
|
271 |
error ("The error(s) above occurred in type " ^ quote s);
|
|
wenzelm@386
|
272 |
|
|
wenzelm@386
|
273 |
fun read_raw_typ syn tsig sort_of str =
|
|
wenzelm@386
|
274 |
Syntax.read_typ syn (fn x => if_none (sort_of x) (defaultS tsig)) str
|
|
wenzelm@386
|
275 |
handle ERROR => err_in_type str;
|
|
wenzelm@386
|
276 |
|
|
wenzelm@386
|
277 |
(*read and certify typ wrt a signature*)
|
|
wenzelm@386
|
278 |
fun read_typ (Sg {tsig, syn, ...}, sort_of) str =
|
|
wenzelm@386
|
279 |
cert_typ tsig (read_raw_typ syn tsig sort_of str)
|
|
wenzelm@386
|
280 |
handle TYPE (msg, _, _) => (writeln msg; err_in_type str);
|
|
wenzelm@386
|
281 |
|
|
wenzelm@386
|
282 |
|
|
wenzelm@386
|
283 |
|
|
wenzelm@386
|
284 |
(** extension functions **) (*exception ERROR*)
|
|
wenzelm@386
|
285 |
|
|
wenzelm@386
|
286 |
fun decls_of name_of mfixs =
|
|
wenzelm@386
|
287 |
map (fn (x, y, mx) => (name_of x mx, y)) mfixs;
|
|
wenzelm@386
|
288 |
|
|
wenzelm@386
|
289 |
|
|
wenzelm@386
|
290 |
(* add default sort *)
|
|
wenzelm@386
|
291 |
|
|
wenzelm@386
|
292 |
fun ext_defsort (syn, tsig, ctab) defsort =
|
|
wenzelm@386
|
293 |
(syn, ext_tsig_defsort tsig defsort, ctab);
|
|
wenzelm@386
|
294 |
|
|
wenzelm@386
|
295 |
|
|
wenzelm@386
|
296 |
(* add type constructors *)
|
|
wenzelm@386
|
297 |
|
|
wenzelm@386
|
298 |
fun ext_types (syn, tsig, ctab) types =
|
|
wenzelm@386
|
299 |
(Syntax.extend_type_gram syn types,
|
|
wenzelm@386
|
300 |
ext_tsig_types tsig (decls_of type_name types),
|
|
wenzelm@386
|
301 |
ctab);
|
|
wenzelm@386
|
302 |
|
|
wenzelm@386
|
303 |
|
|
wenzelm@386
|
304 |
(* add type abbreviations *)
|
|
wenzelm@386
|
305 |
|
|
wenzelm@386
|
306 |
fun read_abbr syn tsig (t, vs, rhs_src) =
|
|
wenzelm@386
|
307 |
(t, vs, read_raw_typ syn tsig (K None) rhs_src)
|
|
wenzelm@386
|
308 |
handle ERROR => error ("in type abbreviation " ^ t);
|
|
wenzelm@386
|
309 |
|
|
wenzelm@386
|
310 |
fun ext_abbrs rd_abbr (syn, tsig, ctab) abbrs =
|
|
wenzelm@386
|
311 |
let
|
|
wenzelm@386
|
312 |
fun mfix_of (t, vs, _, mx) = (t, length vs, mx);
|
|
wenzelm@386
|
313 |
val syn1 = Syntax.extend_type_gram syn (map mfix_of abbrs);
|
|
wenzelm@386
|
314 |
|
|
wenzelm@386
|
315 |
fun decl_of (t, vs, rhs, mx) =
|
|
wenzelm@386
|
316 |
rd_abbr syn1 tsig (type_name t mx, vs, rhs);
|
|
wenzelm@386
|
317 |
in
|
|
wenzelm@386
|
318 |
(syn1, ext_tsig_abbrs tsig (map decl_of abbrs), ctab)
|
|
wenzelm@386
|
319 |
end;
|
|
wenzelm@386
|
320 |
|
|
wenzelm@386
|
321 |
val ext_tyabbrs_i = ext_abbrs (K (K I));
|
|
wenzelm@386
|
322 |
val ext_tyabbrs = ext_abbrs read_abbr;
|
|
wenzelm@386
|
323 |
|
|
wenzelm@386
|
324 |
|
|
wenzelm@386
|
325 |
(* add type arities *)
|
|
wenzelm@386
|
326 |
|
|
wenzelm@386
|
327 |
fun ext_arities (syn, tsig, ctab) arities =
|
|
wenzelm@386
|
328 |
let
|
|
wenzelm@386
|
329 |
val tsig1 = ext_tsig_arities tsig arities;
|
|
wenzelm@386
|
330 |
val log_types = logical_types tsig1;
|
|
wenzelm@386
|
331 |
in
|
|
wenzelm@386
|
332 |
(Syntax.extend_log_types syn log_types, tsig1, ctab)
|
|
wenzelm@386
|
333 |
end;
|
|
wenzelm@386
|
334 |
|
|
wenzelm@386
|
335 |
|
|
wenzelm@386
|
336 |
(* add term constants and syntax *)
|
|
wenzelm@386
|
337 |
|
|
wenzelm@386
|
338 |
fun err_in_const c =
|
|
wenzelm@386
|
339 |
error ("in declaration of constant " ^ quote c);
|
|
wenzelm@386
|
340 |
|
|
wenzelm@386
|
341 |
fun err_dup_consts cs =
|
|
wenzelm@386
|
342 |
error ("Duplicate declaration of constant(s) " ^ commas_quote cs);
|
|
wenzelm@386
|
343 |
|
|
wenzelm@386
|
344 |
|
|
wenzelm@386
|
345 |
fun read_const syn tsig (c, ty_src, mx) =
|
|
wenzelm@386
|
346 |
(c, read_raw_typ syn tsig (K None) ty_src, mx)
|
|
wenzelm@386
|
347 |
handle ERROR => err_in_const (const_name c mx);
|
|
wenzelm@386
|
348 |
|
|
wenzelm@386
|
349 |
fun ext_cnsts rd_const syn_only (syn, tsig, ctab) raw_consts =
|
|
wenzelm@386
|
350 |
let
|
|
wenzelm@386
|
351 |
fun prep_const (c, ty, mx) = (c, cert_typ tsig (varify_typ ty), mx)
|
|
wenzelm@386
|
352 |
handle TYPE (msg, _, _) => (writeln msg; err_in_const (const_name c mx));
|
|
wenzelm@386
|
353 |
|
|
wenzelm@386
|
354 |
val consts = map (prep_const o rd_const syn tsig) raw_consts;
|
|
wenzelm@386
|
355 |
val decls =
|
|
wenzelm@386
|
356 |
if syn_only then []
|
|
wenzelm@386
|
357 |
else filter_out (equal "" o fst) (decls_of const_name consts);
|
|
wenzelm@386
|
358 |
in
|
|
wenzelm@386
|
359 |
(Syntax.extend_const_gram syn consts, tsig,
|
|
wenzelm@386
|
360 |
Symtab.extend_new (ctab, decls)
|
|
wenzelm@386
|
361 |
handle Symtab.DUPS cs => err_dup_consts cs)
|
|
wenzelm@386
|
362 |
end;
|
|
wenzelm@386
|
363 |
|
|
wenzelm@386
|
364 |
val ext_consts_i = ext_cnsts (K (K I)) false;
|
|
wenzelm@386
|
365 |
val ext_consts = ext_cnsts read_const false;
|
|
wenzelm@386
|
366 |
val ext_syntax_i = ext_cnsts (K (K I)) true;
|
|
wenzelm@386
|
367 |
val ext_syntax = ext_cnsts read_const true;
|
|
wenzelm@386
|
368 |
|
|
wenzelm@386
|
369 |
|
|
wenzelm@386
|
370 |
(* add type classes *)
|
|
wenzelm@386
|
371 |
|
|
wenzelm@386
|
372 |
fun const_of_class c = c ^ "_class";
|
|
wenzelm@386
|
373 |
|
|
wenzelm@386
|
374 |
fun class_of_const c_class =
|
|
wenzelm@386
|
375 |
let
|
|
wenzelm@386
|
376 |
val c = implode (take (size c_class - 6, explode c_class));
|
|
wenzelm@386
|
377 |
in
|
|
wenzelm@386
|
378 |
if const_of_class c = c_class then c
|
|
wenzelm@386
|
379 |
else raise_term ("class_of_const: bad name " ^ quote c_class) []
|
|
wenzelm@386
|
380 |
end;
|
|
wenzelm@386
|
381 |
|
|
wenzelm@386
|
382 |
|
|
wenzelm@386
|
383 |
fun ext_classes (syn, tsig, ctab) classes =
|
|
wenzelm@386
|
384 |
let
|
|
wenzelm@386
|
385 |
val names = map (fn (_, c, _) => c) classes;
|
|
wenzelm@386
|
386 |
val consts =
|
|
wenzelm@386
|
387 |
map (fn c => (const_of_class c, a_itselfT --> propT, NoSyn)) names;
|
|
wenzelm@386
|
388 |
in
|
|
wenzelm@386
|
389 |
ext_consts_i
|
|
wenzelm@386
|
390 |
(Syntax.extend_consts syn names, ext_tsig_classes tsig classes, ctab)
|
|
wenzelm@386
|
391 |
consts
|
|
wenzelm@386
|
392 |
end;
|
|
wenzelm@386
|
393 |
|
|
wenzelm@386
|
394 |
|
|
wenzelm@386
|
395 |
(* add syntactic translations *)
|
|
wenzelm@386
|
396 |
|
|
wenzelm@386
|
397 |
fun ext_trfuns (syn, tsig, ctab) trfuns =
|
|
wenzelm@386
|
398 |
(Syntax.extend_trfuns syn trfuns, tsig, ctab);
|
|
wenzelm@386
|
399 |
|
|
wenzelm@386
|
400 |
fun ext_trrules (syn, tsig, ctab) xrules =
|
|
wenzelm@386
|
401 |
(Syntax.extend_trrules syn xrules, tsig, ctab);
|
|
wenzelm@386
|
402 |
|
|
wenzelm@386
|
403 |
|
|
wenzelm@386
|
404 |
(* build signature *)
|
|
wenzelm@386
|
405 |
|
|
wenzelm@386
|
406 |
(* FIXME debug *)
|
|
wenzelm@386
|
407 |
fun assert_stamps_ok stamps =
|
|
wenzelm@386
|
408 |
let val names = map ! stamps;
|
|
wenzelm@386
|
409 |
in
|
|
wenzelm@386
|
410 |
if not (null (duplicates stamps)) then
|
|
wenzelm@386
|
411 |
error "DEBUG dup stamps"
|
|
wenzelm@386
|
412 |
else if not (null (duplicates names)) then
|
|
wenzelm@386
|
413 |
error "DEBUG dup stamp names"
|
|
wenzelm@386
|
414 |
else if not (null names) andalso exists (equal "#") (tl names) then
|
|
wenzelm@386
|
415 |
error "DEBUG misplaced draft stamp name"
|
|
wenzelm@386
|
416 |
else stamps
|
|
wenzelm@386
|
417 |
end;
|
|
wenzelm@386
|
418 |
|
|
wenzelm@386
|
419 |
fun ext_stamps stamps name =
|
|
wenzelm@386
|
420 |
let
|
|
wenzelm@386
|
421 |
val stmps = (case stamps of ref "#" :: ss => ss | ss => ss);
|
|
wenzelm@386
|
422 |
in
|
|
wenzelm@386
|
423 |
if exists (equal name o !) stmps then
|
|
wenzelm@386
|
424 |
error ("Theory already contains a " ^ quote name ^ " component")
|
|
wenzelm@386
|
425 |
else assert_stamps_ok (ref name :: stmps)
|
|
wenzelm@386
|
426 |
end;
|
|
wenzelm@386
|
427 |
|
|
wenzelm@386
|
428 |
|
|
wenzelm@386
|
429 |
fun make_sign (syn, tsig, ctab) stamps name =
|
|
wenzelm@386
|
430 |
Sg {tsig = tsig, const_tab = ctab, syn = syn,
|
|
wenzelm@386
|
431 |
stamps = ext_stamps stamps name};
|
|
wenzelm@386
|
432 |
|
|
wenzelm@386
|
433 |
fun extend_sign extfun name decls (Sg {tsig, const_tab, syn, stamps}) =
|
|
wenzelm@386
|
434 |
make_sign (extfun (syn, tsig, const_tab) decls) stamps name;
|
|
wenzelm@386
|
435 |
|
|
wenzelm@386
|
436 |
|
|
wenzelm@386
|
437 |
(* the external interfaces *)
|
|
wenzelm@386
|
438 |
|
|
wenzelm@386
|
439 |
val add_classes = extend_sign ext_classes "#";
|
|
wenzelm@386
|
440 |
val add_defsort = extend_sign ext_defsort "#";
|
|
wenzelm@386
|
441 |
val add_types = extend_sign ext_types "#";
|
|
wenzelm@386
|
442 |
val add_tyabbrs = extend_sign ext_tyabbrs "#";
|
|
wenzelm@386
|
443 |
val add_tyabbrs_i = extend_sign ext_tyabbrs_i "#";
|
|
wenzelm@386
|
444 |
val add_arities = extend_sign ext_arities "#";
|
|
wenzelm@386
|
445 |
val add_consts = extend_sign ext_consts "#";
|
|
wenzelm@386
|
446 |
val add_consts_i = extend_sign ext_consts_i "#";
|
|
wenzelm@386
|
447 |
val add_syntax = extend_sign ext_syntax "#";
|
|
wenzelm@386
|
448 |
val add_syntax_i = extend_sign ext_syntax_i "#";
|
|
wenzelm@386
|
449 |
val add_trfuns = extend_sign ext_trfuns "#";
|
|
wenzelm@386
|
450 |
val add_trrules = extend_sign ext_trrules "#";
|
|
wenzelm@386
|
451 |
|
|
wenzelm@386
|
452 |
fun add_name name sg = extend_sign K name () sg;
|
|
wenzelm@386
|
453 |
val make_draft = add_name "#";
|
|
wenzelm@386
|
454 |
|
|
wenzelm@386
|
455 |
|
|
wenzelm@386
|
456 |
|
|
wenzelm@386
|
457 |
(** extend signature (old) **) (* FIXME remove *)
|
|
wenzelm@251
|
458 |
|
|
wenzelm@251
|
459 |
fun extend sg name (classes, default, types, abbrs, arities, consts, opt_sext) =
|
|
wenzelm@251
|
460 |
let
|
|
wenzelm@267
|
461 |
fun read_abbr syn (c, vs, rhs_src) =
|
|
wenzelm@267
|
462 |
(c, (map (rpair 0) vs, varifyT (Syntax.read_typ syn (K []) rhs_src)))
|
|
wenzelm@267
|
463 |
handle ERROR => error ("The error(s) above occurred in the rhs " ^
|
|
wenzelm@267
|
464 |
quote rhs_src ^ "\nof type abbreviation " ^ quote c);
|
|
wenzelm@267
|
465 |
|
|
wenzelm@251
|
466 |
(*reset TVar indices to 0, renaming to preserve distinctness*)
|
|
wenzelm@251
|
467 |
fun zero_tvar_idxs T =
|
|
wenzelm@169
|
468 |
let
|
|
wenzelm@169
|
469 |
val inxSs = typ_tvars T;
|
|
wenzelm@169
|
470 |
val nms' = variantlist (map (#1 o #1) inxSs, []);
|
|
wenzelm@251
|
471 |
val tye = map2 (fn ((v, S), a) => (v, TVar ((a, 0), S))) (inxSs, nms');
|
|
wenzelm@251
|
472 |
in
|
|
wenzelm@251
|
473 |
typ_subst_TVars tye T
|
|
wenzelm@251
|
474 |
end;
|
|
wenzelm@143
|
475 |
|
|
wenzelm@169
|
476 |
(*read and check the type mentioned in a const declaration; zero type var
|
|
wenzelm@169
|
477 |
indices because type inference requires it*)
|
|
wenzelm@251
|
478 |
fun read_const tsig syn (c, s) =
|
|
wenzelm@251
|
479 |
(c, zero_tvar_idxs (varifyT (rd_typ tsig syn (K None) s)))
|
|
wenzelm@251
|
480 |
handle ERROR => error ("in declaration of constant " ^ quote c);
|
|
wenzelm@169
|
481 |
|
|
wenzelm@143
|
482 |
|
|
wenzelm@251
|
483 |
val Sg {tsig, const_tab, syn, stamps} = sg;
|
|
wenzelm@251
|
484 |
val xconsts = map #1 classes @ flat (map #1 types) @ map #1 abbrs @
|
|
wenzelm@251
|
485 |
flat (map #1 consts);
|
|
wenzelm@251
|
486 |
val sext = if_none opt_sext Syntax.empty_sext;
|
|
nipkow@200
|
487 |
|
|
wenzelm@251
|
488 |
val tsig' = extend_tsig tsig (classes, default, types, arities);
|
|
wenzelm@386
|
489 |
val tsig1 = Type.ext_tsig_abbrs tsig' (map (read_abbr syn) abbrs);
|
|
wenzelm@143
|
490 |
|
|
wenzelm@251
|
491 |
val syn1 = Syntax.extend syn (rd_typ tsig1 syn (K None))
|
|
wenzelm@251
|
492 |
(logical_types tsig1, xconsts, sext);
|
|
wenzelm@169
|
493 |
|
|
wenzelm@251
|
494 |
val all_consts = flat (map (fn (cs, s) => map (rpair s) cs)
|
|
wenzelm@251
|
495 |
(Syntax.constants sext @ consts));
|
|
wenzelm@169
|
496 |
|
|
wenzelm@277
|
497 |
val const_tab1 =
|
|
wenzelm@386
|
498 |
Symtab.extend_new (const_tab, map (read_const tsig1 syn) all_consts)
|
|
wenzelm@386
|
499 |
handle Symtab.DUPS cs => err_dup_consts cs;
|
|
wenzelm@251
|
500 |
|
|
wenzelm@386
|
501 |
val stamps1 = ext_stamps stamps name;
|
|
wenzelm@143
|
502 |
in
|
|
wenzelm@251
|
503 |
Sg {tsig = tsig1, const_tab = const_tab1, syn = syn1, stamps = stamps1}
|
|
wenzelm@143
|
504 |
end;
|
|
clasohm@0
|
505 |
|
|
clasohm@0
|
506 |
|
|
clasohm@0
|
507 |
|
|
wenzelm@386
|
508 |
(** merge signatures **) (*exception TERM*)
|
|
wenzelm@251
|
509 |
|
|
wenzelm@251
|
510 |
fun merge (sg1, sg2) =
|
|
wenzelm@251
|
511 |
if subsig (sg2, sg1) then sg1
|
|
wenzelm@251
|
512 |
else if subsig (sg1, sg2) then sg2
|
|
wenzelm@386
|
513 |
else if is_draft sg1 orelse is_draft sg2 then
|
|
wenzelm@386
|
514 |
raise_term "Illegal merge of draft signatures" []
|
|
wenzelm@251
|
515 |
else
|
|
wenzelm@251
|
516 |
(*neither is union already; must form union*)
|
|
wenzelm@251
|
517 |
let
|
|
wenzelm@251
|
518 |
val Sg {tsig = tsig1, const_tab = const_tab1, syn = syn1,
|
|
wenzelm@251
|
519 |
stamps = stamps1} = sg1;
|
|
wenzelm@251
|
520 |
val Sg {tsig = tsig2, const_tab = const_tab2, syn = syn2,
|
|
wenzelm@251
|
521 |
stamps = stamps2} = sg2;
|
|
wenzelm@251
|
522 |
|
|
wenzelm@386
|
523 |
|
|
wenzelm@251
|
524 |
val tsig = merge_tsigs (tsig1, tsig2);
|
|
wenzelm@251
|
525 |
|
|
wenzelm@251
|
526 |
val const_tab = Symtab.merge (op =) (const_tab1, const_tab2)
|
|
wenzelm@386
|
527 |
handle Symtab.DUPS cs =>
|
|
wenzelm@386
|
528 |
raise_term ("Incompatible types for constant(s) " ^ commas_quote cs) [];
|
|
wenzelm@251
|
529 |
|
|
wenzelm@386
|
530 |
val syn = Syntax.merge_syntaxes syn1 syn2;
|
|
wenzelm@251
|
531 |
|
|
wenzelm@386
|
532 |
val stamps = merge_rev_lists stamps1 stamps2;
|
|
wenzelm@386
|
533 |
val dups = duplicates (stamp_names stamps);
|
|
wenzelm@251
|
534 |
in
|
|
wenzelm@386
|
535 |
if null dups then assert_stamps_ok stamps (* FIXME debug *)
|
|
wenzelm@386
|
536 |
else raise_term ("Attempt to merge different versions of theories " ^
|
|
wenzelm@386
|
537 |
commas_quote dups) [];
|
|
wenzelm@251
|
538 |
Sg {tsig = tsig, const_tab = const_tab, syn = syn, stamps = stamps}
|
|
wenzelm@251
|
539 |
end;
|
|
wenzelm@251
|
540 |
|
|
wenzelm@251
|
541 |
|
|
wenzelm@251
|
542 |
|
|
wenzelm@251
|
543 |
(** the Pure signature **)
|
|
wenzelm@251
|
544 |
|
|
wenzelm@386
|
545 |
val pure =
|
|
wenzelm@386
|
546 |
make_sign (Syntax.type_syn, tsig0, Symtab.null) [] "#"
|
|
wenzelm@386
|
547 |
also add_types
|
|
wenzelm@386
|
548 |
(("fun", 2, NoSyn) ::
|
|
wenzelm@386
|
549 |
("prop", 0, NoSyn) ::
|
|
wenzelm@386
|
550 |
("itself", 1, NoSyn) ::
|
|
wenzelm@386
|
551 |
Syntax.Mixfix.pure_types)
|
|
wenzelm@386
|
552 |
also add_classes [([], logicC, [])]
|
|
wenzelm@386
|
553 |
also add_defsort logicS
|
|
wenzelm@386
|
554 |
also add_arities
|
|
wenzelm@386
|
555 |
[("fun", [logicS, logicS], logicS),
|
|
wenzelm@386
|
556 |
("prop", [], logicS),
|
|
wenzelm@386
|
557 |
("itself", [logicS], logicS)]
|
|
wenzelm@386
|
558 |
also add_syntax Syntax.Mixfix.pure_syntax
|
|
wenzelm@386
|
559 |
also add_trfuns Syntax.pure_trfuns
|
|
wenzelm@386
|
560 |
also add_consts
|
|
wenzelm@386
|
561 |
[("==", "['a::{}, 'a] => prop", Mixfix ("(_ ==/ _)", [3, 2], 2)),
|
|
wenzelm@386
|
562 |
("=?=", "['a::{}, 'a] => prop", Mixfix ("(_ =?=/ _)", [3, 2], 2)),
|
|
wenzelm@386
|
563 |
("==>", "[prop, prop] => prop", Mixfix ("(_ ==>/ _)", [2, 1], 1)),
|
|
wenzelm@386
|
564 |
("all", "('a => prop) => prop", Binder ("!!", 0)),
|
|
wenzelm@386
|
565 |
("TYPE", "'a itself", NoSyn),
|
|
wenzelm@386
|
566 |
(Syntax.constrainC, "'a::{} => 'a", NoSyn)]
|
|
wenzelm@386
|
567 |
also add_name "Pure";
|
|
wenzelm@143
|
568 |
|
|
clasohm@0
|
569 |
|
|
clasohm@0
|
570 |
end;
|
|
wenzelm@143
|
571 |
|