16 type tsig |
16 type tsig |
17 val rep_tsig: tsig -> |
17 val rep_tsig: tsig -> |
18 {classes: NameSpace.T * Sorts.algebra, |
18 {classes: NameSpace.T * Sorts.algebra, |
19 default: sort, |
19 default: sort, |
20 types: (decl * serial) NameSpace.table, |
20 types: (decl * serial) NameSpace.table, |
21 log_types: string list, |
21 log_types: string list} |
22 witness: (typ * sort) option} |
|
23 val empty_tsig: tsig |
22 val empty_tsig: tsig |
24 val defaultS: tsig -> sort |
23 val defaultS: tsig -> sort |
25 val logical_types: tsig -> string list |
24 val logical_types: tsig -> string list |
26 val universal_witness: tsig -> (typ * sort) option |
|
27 val eq_sort: tsig -> sort * sort -> bool |
25 val eq_sort: tsig -> sort * sort -> bool |
28 val subsort: tsig -> sort * sort -> bool |
26 val subsort: tsig -> sort * sort -> bool |
29 val of_sort: tsig -> typ * sort -> bool |
27 val of_sort: tsig -> typ * sort -> bool |
30 val inter_sort: tsig -> sort * sort -> sort |
28 val inter_sort: tsig -> sort * sort -> sort |
31 val cert_class: tsig -> class -> class |
29 val cert_class: tsig -> class -> class |
105 datatype tsig = |
103 datatype tsig = |
106 TSig of { |
104 TSig of { |
107 classes: NameSpace.T * Sorts.algebra, (*order-sorted algebra of type classes*) |
105 classes: NameSpace.T * Sorts.algebra, (*order-sorted algebra of type classes*) |
108 default: sort, (*default sort on input*) |
106 default: sort, (*default sort on input*) |
109 types: (decl * serial) NameSpace.table, (*declared types*) |
107 types: (decl * serial) NameSpace.table, (*declared types*) |
110 log_types: string list, (*logical types sorted by number of arguments*) |
108 log_types: string list}; (*logical types sorted by number of arguments*) |
111 witness: (typ * sort) option}; (*witness for non-emptiness of strictest sort*) |
|
112 |
109 |
113 fun rep_tsig (TSig comps) = comps; |
110 fun rep_tsig (TSig comps) = comps; |
114 |
111 |
115 fun make_tsig (classes, default, types, log_types, witness) = |
112 fun make_tsig (classes, default, types, log_types) = |
116 TSig {classes = classes, default = default, types = types, |
113 TSig {classes = classes, default = default, types = types, log_types = log_types}; |
117 log_types = log_types, witness = witness}; |
|
118 |
114 |
119 fun build_tsig ((space, classes), default, types) = |
115 fun build_tsig ((space, classes), default, types) = |
120 let |
116 let |
121 val log_types = |
117 val log_types = |
122 Symtab.fold (fn (c, (LogicalType n, _)) => cons (c, n) | _ => I) (snd types) [] |
118 Symtab.fold (fn (c, (LogicalType n, _)) => cons (c, n) | _ => I) (snd types) [] |
123 |> Library.sort (Library.int_ord o pairself snd) |> map fst; |
119 |> Library.sort (Library.int_ord o pairself snd) |> map fst; |
124 val witness = |
120 in make_tsig ((space, classes), default, types, log_types) end; |
125 (case Sorts.witness_sorts classes log_types [] [Sorts.minimal_classes classes] of |
121 |
126 [w] => SOME w | _ => NONE); |
122 fun map_tsig f (TSig {classes, default, types, log_types = _}) = |
127 in make_tsig ((space, classes), default, types, log_types, witness) end; |
|
128 |
|
129 fun map_tsig f (TSig {classes, default, types, log_types = _, witness = _}) = |
|
130 build_tsig (f (classes, default, types)); |
123 build_tsig (f (classes, default, types)); |
131 |
124 |
132 val empty_tsig = |
125 val empty_tsig = |
133 build_tsig ((NameSpace.empty, Sorts.empty_algebra), [], NameSpace.empty_table); |
126 build_tsig ((NameSpace.empty, Sorts.empty_algebra), [], NameSpace.empty_table); |
134 |
127 |
135 |
128 |
136 (* classes and sorts *) |
129 (* classes and sorts *) |
137 |
130 |
138 fun defaultS (TSig {default, ...}) = default; |
131 fun defaultS (TSig {default, ...}) = default; |
139 fun logical_types (TSig {log_types, ...}) = log_types; |
132 fun logical_types (TSig {log_types, ...}) = log_types; |
140 fun universal_witness (TSig {witness, ...}) = witness; |
|
141 |
133 |
142 fun eq_sort (TSig {classes, ...}) = Sorts.sort_eq (#2 classes); |
134 fun eq_sort (TSig {classes, ...}) = Sorts.sort_eq (#2 classes); |
143 fun subsort (TSig {classes, ...}) = Sorts.sort_le (#2 classes); |
135 fun subsort (TSig {classes, ...}) = Sorts.sort_le (#2 classes); |
144 fun of_sort (TSig {classes, ...}) = Sorts.of_sort (#2 classes); |
136 fun of_sort (TSig {classes, ...}) = Sorts.of_sort (#2 classes); |
145 fun inter_sort (TSig {classes, ...}) = Sorts.inter_sort (#2 classes); |
137 fun inter_sort (TSig {classes, ...}) = Sorts.inter_sort (#2 classes); |
623 (* merge type signatures *) |
615 (* merge type signatures *) |
624 |
616 |
625 fun merge_tsigs pp (tsig1, tsig2) = |
617 fun merge_tsigs pp (tsig1, tsig2) = |
626 let |
618 let |
627 val (TSig {classes = (space1, classes1), default = default1, types = types1, |
619 val (TSig {classes = (space1, classes1), default = default1, types = types1, |
628 log_types = _, witness = _}) = tsig1; |
620 log_types = _}) = tsig1; |
629 val (TSig {classes = (space2, classes2), default = default2, types = types2, |
621 val (TSig {classes = (space2, classes2), default = default2, types = types2, |
630 log_types = _, witness = _}) = tsig2; |
622 log_types = _}) = tsig2; |
631 |
623 |
632 val space' = NameSpace.merge (space1, space2); |
624 val space' = NameSpace.merge (space1, space2); |
633 val classes' = Sorts.merge_algebra pp (classes1, classes2); |
625 val classes' = Sorts.merge_algebra pp (classes1, classes2); |
634 val default' = Sorts.inter_sort classes' (default1, default2); |
626 val default' = Sorts.inter_sort classes' (default1, default2); |
635 val types' = merge_types (types1, types2); |
627 val types' = merge_types (types1, types2); |