| author | nipkow | 
| Tue, 07 May 2002 15:03:50 +0200 | |
| changeset 13111 | 2d6782e71702 | 
| parent 12785 | 27debaf2112d | 
| child 14383 | 09aab4710789 | 
| permissions | -rw-r--r-- | 
| 19 | 1 | (* Title: Pure/sign.ML | 
| 0 | 2 | ID: $Id$ | 
| 251 | 3 | Author: Lawrence C Paulson and Markus Wenzel | 
| 12785 | 4 | License: GPL (GNU GENERAL PUBLIC LICENSE) | 
| 0 | 5 | |
| 251 | 6 | The abstract type "sg" of signatures. | 
| 0 | 7 | *) | 
| 8 | ||
| 3956 | 9 | (*base names*) | 
| 10 | type bstring = string; | |
| 11 | type bclass = class; | |
| 12 | (*external forms -- partially qualified names*) | |
| 3805 | 13 | type xstring = string; | 
| 14 | type xclass = class; | |
| 15 | type xsort = sort; | |
| 16 | type xtyp = typ; | |
| 17 | type xterm = term; | |
| 18 | ||
| 19 | 19 | signature SIGN = | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 20 | sig | 
| 1501 | 21 | type sg | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 22 | type sg_ref | 
| 4256 | 23 | type data | 
| 2197 | 24 | val rep_sg: sg -> | 
| 3975 | 25 |    {self: sg_ref,
 | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 26 | tsig: Type.type_sig, | 
| 2197 | 27 | const_tab: typ Symtab.table, | 
| 28 | syn: Syntax.syntax, | |
| 11501 | 29 | path: string list option, | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 30 | spaces: (string * NameSpace.T) list, | 
| 4256 | 31 | data: data} | 
| 3975 | 32 | val name_of: sg -> string | 
| 33 | val stamp_names_of: sg -> string list | |
| 10932 | 34 | val exists_stamp: string -> sg -> bool | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 35 | val tsig_of: sg -> Type.type_sig | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 36 | val deref: sg_ref -> sg | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 37 | val self_ref: sg -> sg_ref | 
| 1501 | 38 | val subsig: sg * sg -> bool | 
| 9031 | 39 | val joinable: sg * sg -> bool | 
| 1501 | 40 | val eq_sg: sg * sg -> bool | 
| 41 | val same_sg: sg * sg -> bool | |
| 42 | val is_draft: sg -> bool | |
| 4951 | 43 | val is_stale: sg -> bool | 
| 1501 | 44 | val const_type: sg -> string -> typ option | 
| 45 | val classes: sg -> class list | |
| 4844 | 46 | val defaultS: sg -> sort | 
| 1501 | 47 | val subsort: sg -> sort * sort -> bool | 
| 8290 
7015d6b11b56
nodup_vars: fixed omission of 2 minor cases; account for Frees as well;
 wenzelm parents: 
7640diff
changeset | 48 | val nodup_vars: term -> term | 
| 1501 | 49 | val norm_sort: sg -> sort -> sort | 
| 4568 | 50 | val of_sort: sg -> typ * sort -> bool | 
| 7640 | 51 | val witness_sorts: sg -> sort list -> sort list -> (typ * sort) list | 
| 52 | val univ_witness: sg -> (typ * sort) option | |
| 10443 
0a68dc9edba5
added certify_tycon, certify_tyabbr, certify_const;
 wenzelm parents: 
10404diff
changeset | 53 | val typ_instance: sg -> typ * typ -> bool | 
| 3810 | 54 | val classK: string | 
| 55 | val typeK: string | |
| 56 | val constK: string | |
| 3956 | 57 | val full_name: sg -> bstring -> string | 
| 4844 | 58 | val full_name_path: sg -> string -> bstring -> string | 
| 3956 | 59 | val base_name: string -> bstring | 
| 3810 | 60 | val intern: sg -> string -> xstring -> string | 
| 61 | val extern: sg -> string -> string -> xstring | |
| 3937 | 62 | val cond_extern: sg -> string -> string -> xstring | 
| 6845 | 63 | val cond_extern_table: sg -> string -> 'a Symtab.table -> (xstring * 'a) list | 
| 3805 | 64 | val intern_class: sg -> xclass -> class | 
| 65 | val intern_tycon: sg -> xstring -> string | |
| 66 | val intern_const: sg -> xstring -> string | |
| 3937 | 67 | val intern_sort: sg -> xsort -> sort | 
| 68 | val intern_typ: sg -> xtyp -> typ | |
| 69 | val intern_term: sg -> xterm -> term | |
| 70 | val intern_tycons: sg -> xtyp -> typ | |
| 1501 | 71 | val pretty_sg: sg -> Pretty.T | 
| 4051 | 72 | val str_of_sg: sg -> string | 
| 1501 | 73 | val pprint_sg: sg -> pprint_args -> unit | 
| 74 | val pretty_term: sg -> term -> Pretty.T | |
| 12068 
469f372d63db
added pretty_term', read_typ', read_typ_no_norm', read_def_terms'
 wenzelm parents: 
11720diff
changeset | 75 | val pretty_term': Syntax.syntax -> sg -> term -> Pretty.T | 
| 1501 | 76 | val pretty_typ: sg -> typ -> Pretty.T | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 77 | val pretty_sort: sg -> sort -> Pretty.T | 
| 4249 | 78 | val pretty_classrel: sg -> class * class -> Pretty.T | 
| 79 | val pretty_arity: sg -> string * sort list * sort -> Pretty.T | |
| 1501 | 80 | val string_of_term: sg -> term -> string | 
| 81 | val string_of_typ: sg -> typ -> string | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 82 | val string_of_sort: sg -> sort -> string | 
| 3855 | 83 | val str_of_sort: sg -> sort -> string | 
| 84 | val str_of_classrel: sg -> class * class -> string | |
| 85 | val str_of_arity: sg -> string * sort list * sort -> string | |
| 1501 | 86 | val pprint_term: sg -> term -> pprint_args -> unit | 
| 87 | val pprint_typ: sg -> typ -> pprint_args -> unit | |
| 8898 | 88 | val certify_class: sg -> class -> class | 
| 89 | val certify_sort: sg -> sort -> sort | |
| 1501 | 90 | val certify_typ: sg -> typ -> typ | 
| 9504 | 91 | val certify_typ_no_norm: sg -> typ -> typ | 
| 10443 
0a68dc9edba5
added certify_tycon, certify_tyabbr, certify_const;
 wenzelm parents: 
10404diff
changeset | 92 | val certify_tycon: sg -> string -> string | 
| 
0a68dc9edba5
added certify_tycon, certify_tyabbr, certify_const;
 wenzelm parents: 
10404diff
changeset | 93 | val certify_tyabbr: sg -> string -> string | 
| 11720 | 94 | val certify_tyname: sg -> string -> string | 
| 10443 
0a68dc9edba5
added certify_tycon, certify_tyabbr, certify_const;
 wenzelm parents: 
10404diff
changeset | 95 | val certify_const: sg -> string -> string | 
| 1501 | 96 | val certify_term: sg -> term -> term * typ * int | 
| 8898 | 97 | val read_sort: sg -> string -> sort | 
| 4227 | 98 | val read_raw_typ: sg * (indexname -> sort option) -> string -> typ | 
| 1501 | 99 | val read_typ: sg * (indexname -> sort option) -> string -> typ | 
| 12068 
469f372d63db
added pretty_term', read_typ', read_typ_no_norm', read_def_terms'
 wenzelm parents: 
11720diff
changeset | 100 | val read_typ': Syntax.syntax -> sg * (indexname -> sort option) -> string -> typ | 
| 
469f372d63db
added pretty_term', read_typ', read_typ_no_norm', read_def_terms'
 wenzelm parents: 
11720diff
changeset | 101 | val read_typ_no_norm': Syntax.syntax -> sg * (indexname -> sort option) -> string -> typ | 
| 1501 | 102 | val infer_types: sg -> (indexname -> typ option) -> | 
| 103 | (indexname -> sort option) -> string list -> bool | |
| 4249 | 104 | -> xterm list * typ -> term * (indexname * typ) list | 
| 105 | val infer_types_simult: sg -> (indexname -> typ option) -> | |
| 106 | (indexname -> sort option) -> string list -> bool | |
| 107 | -> (xterm list * typ) list -> term list * (indexname * typ) list | |
| 12068 
469f372d63db
added pretty_term', read_typ', read_typ_no_norm', read_def_terms'
 wenzelm parents: 
11720diff
changeset | 108 | val read_def_terms': | 
| 
469f372d63db
added pretty_term', read_typ', read_typ_no_norm', read_def_terms'
 wenzelm parents: 
11720diff
changeset | 109 | Syntax.syntax -> sg * (indexname -> typ option) * (indexname -> sort option) -> | 
| 
469f372d63db
added pretty_term', read_typ', read_typ_no_norm', read_def_terms'
 wenzelm parents: 
11720diff
changeset | 110 | string list -> bool -> (string * typ) list -> term list * (indexname * typ) list | 
| 8607 | 111 | val read_def_terms: | 
| 112 | sg * (indexname -> typ option) * (indexname -> sort option) -> | |
| 113 | string list -> bool -> (string * typ) list -> term list * (indexname * typ) list | |
| 8802 | 114 | val simple_read_term: sg -> typ -> string -> term | 
| 3956 | 115 | val add_classes: (bclass * xclass list) list -> sg -> sg | 
| 116 | val add_classes_i: (bclass * class list) list -> sg -> sg | |
| 3805 | 117 | val add_classrel: (xclass * xclass) list -> sg -> sg | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 118 | val add_classrel_i: (class * class) list -> sg -> sg | 
| 8898 | 119 | val add_defsort: string -> sg -> sg | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 120 | val add_defsort_i: sort -> sg -> sg | 
| 3956 | 121 | val add_types: (bstring * int * mixfix) list -> sg -> sg | 
| 4844 | 122 | val add_nonterminals: bstring list -> sg -> sg | 
| 3956 | 123 | val add_tyabbrs: (bstring * string list * string * mixfix) list -> sg -> sg | 
| 124 | val add_tyabbrs_i: (bstring * string list * typ * mixfix) list -> sg -> sg | |
| 8898 | 125 | val add_arities: (xstring * string list * string) list -> sg -> sg | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 126 | val add_arities_i: (string * sort list * sort) list -> sg -> sg | 
| 3956 | 127 | val add_consts: (bstring * string * mixfix) list -> sg -> sg | 
| 128 | val add_consts_i: (bstring * typ * mixfix) list -> sg -> sg | |
| 129 | val add_syntax: (bstring * string * mixfix) list -> sg -> sg | |
| 130 | val add_syntax_i: (bstring * typ * mixfix) list -> sg -> sg | |
| 131 | val add_modesyntax: (string * bool) * (bstring * string * mixfix) list -> sg -> sg | |
| 132 | val add_modesyntax_i: (string * bool) * (bstring * typ * mixfix) list -> sg -> sg | |
| 1501 | 133 | val add_trfuns: | 
| 4344 | 134 | (string * (ast list -> ast)) list * | 
| 135 | (string * (term list -> term)) list * | |
| 136 | (string * (term list -> term)) list * | |
| 137 | (string * (ast list -> ast)) list -> sg -> sg | |
| 2385 | 138 | val add_trfunsT: | 
| 4344 | 139 | (string * (bool -> typ -> term list -> term)) list -> sg -> sg | 
| 2693 | 140 | val add_tokentrfuns: | 
| 6311 | 141 | (string * string * (string -> string * real)) list -> sg -> sg | 
| 4619 | 142 | val add_trrules: (xstring * string) Syntax.trrule list -> sg -> sg | 
| 1810 
0eef167ebe1b
Translation infixes <->, etc., no longer available at top-level
 paulson parents: 
1580diff
changeset | 143 | val add_trrules_i: ast Syntax.trrule list -> sg -> sg | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 144 | val add_path: string -> sg -> sg | 
| 3810 | 145 | val add_space: string * string list -> sg -> sg | 
| 12588 | 146 | val hide_space: bool -> string * string list -> sg -> sg | 
| 147 | val hide_space_i: bool -> string * string list -> sg -> sg | |
| 1501 | 148 | val add_name: string -> sg -> sg | 
| 4256 | 149 | val data_kinds: data -> string list | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 150 | val merge_refs: sg_ref * sg_ref -> sg_ref | 
| 4627 | 151 | val merge: sg * sg -> sg | 
| 12123 | 152 | val copy: sg -> sg | 
| 3975 | 153 | val prep_ext: sg -> sg | 
| 10932 | 154 | val PureN: string | 
| 155 | val CPureN: string | |
| 4627 | 156 | val nontriv_merge: sg * sg -> sg | 
| 3995 | 157 | val pre_pure: sg | 
| 1501 | 158 | val const_of_class: class -> string | 
| 159 | val class_of_const: string -> class | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 160 | end; | 
| 0 | 161 | |
| 6191 | 162 | signature PRIVATE_SIGN = | 
| 5642 | 163 | sig | 
| 164 | include SIGN | |
| 6546 | 165 | val init_data: Object.kind * (Object.T * (Object.T -> Object.T) * (Object.T -> Object.T) * | 
| 12310 | 166 | (Object.T * Object.T -> Object.T) * (sg -> Object.T -> unit)) -> sg -> sg | 
| 5642 | 167 | val get_data: Object.kind -> (Object.T -> 'a) -> sg -> 'a | 
| 168 |   val put_data: Object.kind -> ('a -> Object.T) -> 'a -> sg -> sg
 | |
| 169 | val print_data: Object.kind -> sg -> unit | |
| 170 | end; | |
| 171 | ||
| 6191 | 172 | structure Sign: PRIVATE_SIGN = | 
| 143 | 173 | struct | 
| 0 | 174 | |
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 175 | |
| 251 | 176 | (** datatype sg **) | 
| 177 | ||
| 4256 | 178 | (* types sg, data, sg_ref *) | 
| 179 | ||
| 19 | 180 | datatype sg = | 
| 3975 | 181 | Sg of | 
| 182 |    {id: string ref,                             (*id*)
 | |
| 183 | stamps: string ref list} * (*unique theory indentifier*) | |
| 184 |    {self: sg_ref,                               (*mutable self reference*)
 | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 185 | tsig: Type.type_sig, (*order-sorted signature of types*) | 
| 3805 | 186 | const_tab: typ Symtab.table, (*type schemes of constants*) | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 187 | syn: Syntax.syntax, (*syntax for parsing and printing*) | 
| 11501 | 188 | path: string list option, (*current name space entry prefix*) | 
| 3975 | 189 | spaces: (string * NameSpace.T) list, (*name spaces for consts, types etc.*) | 
| 4256 | 190 | data: data} (*anytype data*) | 
| 191 | and data = | |
| 192 | Data of | |
| 10404 | 193 | (Object.kind * (*kind (for authorization)*) | 
| 194 | (Object.T * (*value*) | |
| 12123 | 195 | ((Object.T -> Object.T) * (*copy method*) | 
| 196 | (Object.T -> Object.T) * (*prepare extend method*) | |
| 4998 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 197 | (Object.T * Object.T -> Object.T) * (*merge and prepare extend method*) | 
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 198 | (sg -> Object.T -> unit)))) (*print method*) | 
| 4256 | 199 | Symtab.table | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 200 | and sg_ref = | 
| 4998 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 201 | SgRef of sg ref option; | 
| 0 | 202 | |
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 203 | (*make signature*) | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 204 | fun make_sign (id, self, tsig, const_tab, syn, path, spaces, data, stamps) = | 
| 3975 | 205 |   Sg ({id = id, stamps = stamps}, {self = self, tsig = tsig, const_tab = const_tab,
 | 
| 206 | syn = syn, path = path, spaces = spaces, data = data}); | |
| 207 | ||
| 208 | ||
| 4256 | 209 | (* basic operations *) | 
| 3975 | 210 | |
| 211 | fun rep_sg (Sg (_, args)) = args; | |
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 212 | |
| 3975 | 213 | (*show stamps*) | 
| 214 | fun stamp_names_of (Sg ({stamps, ...}, _)) = rev (map ! stamps);
 | |
| 10932 | 215 | fun exists_stamp name (Sg ({stamps, ...}, _)) = exists (equal name o !) stamps;
 | 
| 3975 | 216 | fun pretty_sg sg = Pretty.str_list "{" "}" (stamp_names_of sg);
 | 
| 217 | val str_of_sg = Pretty.str_of o pretty_sg; | |
| 218 | val pprint_sg = Pretty.pprint o pretty_sg; | |
| 219 | ||
| 402 | 220 | val tsig_of = #tsig o rep_sg; | 
| 12068 
469f372d63db
added pretty_term', read_typ', read_typ_no_norm', read_def_terms'
 wenzelm parents: 
11720diff
changeset | 221 | val syn_of = #syn o rep_sg; | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 222 | |
| 3975 | 223 | fun const_type (Sg (_, {const_tab, ...})) c = Symtab.lookup (const_tab, c);
 | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 224 | |
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 225 | |
| 3995 | 226 | (* id and self *) | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 227 | |
| 3975 | 228 | fun check_stale (sg as Sg ({id, ...},
 | 
| 229 |         {self = SgRef (Some (ref (Sg ({id = id', ...}, _)))), ...})) =
 | |
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 230 | if id = id' then sg | 
| 3975 | 231 |       else raise TERM ("Stale signature: " ^ str_of_sg sg, [])
 | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 232 | | check_stale _ = sys_error "Sign.check_stale"; | 
| 0 | 233 | |
| 4951 | 234 | fun is_stale sg = (check_stale sg; false) handle TERM _ => true; | 
| 235 | ||
| 3995 | 236 | fun self_ref (sg as Sg (_, {self, ...})) = (check_stale sg; self);
 | 
| 237 | ||
| 238 | fun deref (SgRef (Some (ref sg))) = sg | |
| 239 | | deref (SgRef None) = sys_error "Sign.deref"; | |
| 240 | ||
| 3975 | 241 | fun name_of (sg as Sg ({id = ref name, ...}, _)) =
 | 
| 4844 | 242 | if name = "" orelse ord name = ord "#" then | 
| 3975 | 243 |     raise TERM ("Nameless signature " ^ str_of_sg sg, [])
 | 
| 244 | else name; | |
| 245 | ||
| 206 
0d624d1ba9cc
added subsig: sg * sg -> bool to test if one signature is contained in another.
 nipkow parents: 
200diff
changeset | 246 | |
| 2979 | 247 | (* inclusion and equality *) | 
| 2180 
934572a94139
Removal of polymorphic equality via mem, subset, eq_set, etc
 paulson parents: 
2144diff
changeset | 248 | |
| 2185 | 249 | local | 
| 250 | (*avoiding polymorphic equality: factor 10 speedup*) | |
| 251 | fun mem_stamp (_:string ref, []) = false | |
| 252 | | mem_stamp (x, y :: ys) = x = y orelse mem_stamp (x, ys); | |
| 253 | ||
| 254 | fun subset_stamp ([], ys) = true | |
| 255 | | subset_stamp (x :: xs, ys) = | |
| 256 | mem_stamp (x, ys) andalso subset_stamp (xs, ys); | |
| 2180 
934572a94139
Removal of polymorphic equality via mem, subset, eq_set, etc
 paulson parents: 
2144diff
changeset | 257 | |
| 2185 | 258 | (*fast partial test*) | 
| 259 | fun fast_sub ([]: string ref list, _) = true | |
| 260 | | fast_sub (_, []) = false | |
| 261 | | fast_sub (x :: xs, y :: ys) = | |
| 262 | if x = y then fast_sub (xs, ys) | |
| 263 | else fast_sub (x :: xs, ys); | |
| 264 | in | |
| 3975 | 265 |   fun eq_sg (sg1 as Sg ({id = id1, ...}, _), sg2 as Sg ({id = id2, ...}, _)) =
 | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 266 | (check_stale sg1; check_stale sg2; id1 = id2); | 
| 2185 | 267 | |
| 3975 | 268 |   fun subsig (sg1 as Sg ({stamps = s1, ...}, _), sg2 as Sg ({stamps = s2, ...}, _)) =
 | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 269 | eq_sg (sg1, sg2) orelse subset_stamp (s1, s2); | 
| 2180 
934572a94139
Removal of polymorphic equality via mem, subset, eq_set, etc
 paulson parents: 
2144diff
changeset | 270 | |
| 3975 | 271 |   fun fast_subsig (sg1 as Sg ({stamps = s1, ...}, _), sg2 as Sg ({stamps = s2, ...}, _)) =
 | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 272 | eq_sg (sg1, sg2) orelse fast_sub (s1, s2); | 
| 2185 | 273 | end; | 
| 274 | ||
| 402 | 275 | |
| 9031 | 276 | fun joinable (sg1, sg2) = subsig (sg1, sg2) orelse subsig (sg2, sg1); | 
| 277 | ||
| 2185 | 278 | (*test if same theory names are contained in signatures' stamps, | 
| 279 | i.e. if signatures belong to same theory but not necessarily to the | |
| 280 | same version of it*) | |
| 3975 | 281 | fun same_sg (sg1 as Sg ({stamps = s1, ...}, _), sg2 as Sg ({stamps = s2, ...}, _)) =
 | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 282 | eq_sg (sg1, sg2) orelse eq_set_string (pairself (map (op !)) (s1, s2)); | 
| 2185 | 283 | |
| 284 | (*test for drafts*) | |
| 4844 | 285 | fun is_draft (Sg ({stamps = ref name :: _, ...}, _)) = name = "" orelse ord name = ord "#";
 | 
| 386 | 286 | |
| 0 | 287 | |
| 4568 | 288 | (* classes and sorts *) | 
| 289 | ||
| 7640 | 290 | val classes = Type.classes o tsig_of; | 
| 4844 | 291 | val defaultS = Type.defaultS o tsig_of; | 
| 4568 | 292 | val subsort = Type.subsort o tsig_of; | 
| 293 | val norm_sort = Type.norm_sort o tsig_of; | |
| 7640 | 294 | val of_sort = Type.of_sort o tsig_of; | 
| 295 | val witness_sorts = Type.witness_sorts o tsig_of; | |
| 296 | val univ_witness = Type.univ_witness o tsig_of; | |
| 10443 
0a68dc9edba5
added certify_tycon, certify_tyabbr, certify_const;
 wenzelm parents: 
10404diff
changeset | 297 | fun typ_instance sg (T, U) = Type.typ_instance (tsig_of sg, T, U); | 
| 4568 | 298 | |
| 4256 | 299 | |
| 300 | (** signature data **) | |
| 301 | ||
| 302 | (* errors *) | |
| 303 | ||
| 4261 | 304 | fun of_theory sg = "\nof theory " ^ str_of_sg sg; | 
| 4256 | 305 | |
| 4998 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 306 | fun err_inconsistent kinds = | 
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 307 |   error ("Attempt to merge different versions of " ^ commas_quote kinds ^ " data");
 | 
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 308 | |
| 6961 | 309 | fun err_method name kind e = | 
| 310 |   (writeln ("Error while invoking " ^ quote kind ^ " " ^ name ^ " method"); raise e);
 | |
| 4256 | 311 | |
| 312 | fun err_dup_init sg kind = | |
| 313 |   error ("Duplicate initialization of " ^ quote kind ^ " data" ^ of_theory sg);
 | |
| 314 | ||
| 315 | fun err_uninit sg kind = | |
| 10404 | 316 |   error ("Tried to access uninitialized " ^ quote kind ^ " data" ^
 | 
| 317 | of_theory sg); | |
| 4256 | 318 | |
| 6040 | 319 | (*Trying to access theory data using get / put operations from a different | 
| 320 | instance of the TheoryDataFun result. Typical cure: re-load all files*) | |
| 4998 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 321 | fun err_access sg kind = | 
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 322 |   error ("Unauthorized access to " ^ quote kind ^ " data" ^ of_theory sg);
 | 
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 323 | |
| 4256 | 324 | |
| 325 | (* prepare data *) | |
| 326 | ||
| 4489 | 327 | val empty_data = Data Symtab.empty; | 
| 4256 | 328 | |
| 329 | fun merge_data (Data tab1, Data tab2) = | |
| 330 | let | |
| 4998 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 331 | val data1 = map snd (Symtab.dest tab1); | 
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 332 | val data2 = map snd (Symtab.dest tab2); | 
| 4256 | 333 | val all_data = data1 @ data2; | 
| 4998 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 334 | val kinds = gen_distinct Object.eq_kind (map fst all_data); | 
| 4256 | 335 | |
| 336 | fun entry data kind = | |
| 4998 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 337 | (case gen_assoc Object.eq_kind (data, kind) of | 
| 4256 | 338 | None => [] | 
| 339 | | Some x => [(kind, x)]); | |
| 340 | ||
| 12310 | 341 | fun merge_entries [(kind, (e, mths as (_, ext, _, _)))] = | 
| 6961 | 342 | (kind, (ext e handle exn => err_method "prep_ext" (Object.name_of_kind kind) exn, mths)) | 
| 12310 | 343 | | merge_entries [(kind, (e1, mths as (_, _, mrg, _))), (_, (e2, _))] = | 
| 6961 | 344 | (kind, (mrg (e1, e2) | 
| 345 | handle exn => err_method "merge" (Object.name_of_kind kind) exn, mths)) | |
| 4256 | 346 | | merge_entries _ = sys_error "merge_entries"; | 
| 347 | ||
| 348 | val data = map (fn k => merge_entries (entry data1 k @ entry data2 k)) kinds; | |
| 4998 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 349 | val data_idx = map (fn (k, x) => (Object.name_of_kind k, (k, x))) data; | 
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 350 | in | 
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 351 | Data (Symtab.make data_idx) | 
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 352 | handle Symtab.DUPS dups => err_inconsistent dups | 
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 353 | end; | 
| 4256 | 354 | |
| 355 | fun prep_ext_data data = merge_data (data, empty_data); | |
| 356 | ||
| 12310 | 357 | fun init_data_sg sg (Data tab) kind e cp ext mrg prt = | 
| 4998 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 358 | let val name = Object.name_of_kind kind in | 
| 12310 | 359 | Data (Symtab.update_new ((name, (kind, (e, (cp, ext, mrg, prt)))), tab)) | 
| 4998 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 360 | handle Symtab.DUP _ => err_dup_init sg name | 
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 361 | end; | 
| 4256 | 362 | |
| 363 | ||
| 364 | (* access data *) | |
| 365 | ||
| 366 | fun data_kinds (Data tab) = map fst (Symtab.dest tab); | |
| 367 | ||
| 368 | fun lookup_data sg tab kind = | |
| 4998 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 369 | let val name = Object.name_of_kind kind in | 
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 370 | (case Symtab.lookup (tab, name) of | 
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 371 | Some (k, x) => | 
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 372 | if Object.eq_kind (kind, k) then x | 
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 373 | else err_access sg name | 
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 374 | | None => err_uninit sg name) | 
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 375 | end; | 
| 4256 | 376 | |
| 4998 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 377 | fun get_data kind f (sg as Sg (_, {data = Data tab, ...})) =
 | 
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 378 | let val x = fst (lookup_data sg tab kind) | 
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 379 | in f x handle Match => Object.kind_error kind end; | 
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 380 | |
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 381 | fun print_data kind (sg as Sg (_, {data = Data tab, ...})) =
 | 
| 12310 | 382 | let val (e, (_, _, _, prt)) = lookup_data sg tab kind | 
| 6961 | 383 |   in prt sg e handle exn => err_method ("print" ^ of_theory sg) (Object.name_of_kind kind) exn end;
 | 
| 4256 | 384 | |
| 4998 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 385 | fun put_data_sg sg (Data tab) kind f x = | 
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 386 | Data (Symtab.update ((Object.name_of_kind kind, | 
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 387 | (kind, (f x, snd (lookup_data sg tab kind)))), tab)); | 
| 4256 | 388 | |
| 389 | ||
| 390 | ||
| 391 | (** build signatures **) | |
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 392 | |
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 393 | fun ext_stamps stamps (id as ref name) = | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 394 | let val stmps = (case stamps of ref "#" :: ss => ss | ss => ss) in | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 395 | if exists (equal name o !) stmps then | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 396 |       error ("Theory already contains a " ^ quote name ^ " component")
 | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 397 | else id :: stmps | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 398 | end; | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 399 | |
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 400 | fun create_sign self stamps name (syn, tsig, ctab, (path, spaces), data) = | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 401 | let | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 402 | val id = ref name; | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 403 | val sign = | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 404 | make_sign (id, self, tsig, ctab, syn, path, spaces, data, ext_stamps stamps id); | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 405 | in | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 406 | (case self of | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 407 | SgRef (Some r) => r := sign | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 408 | | _ => sys_error "Sign.create_sign"); | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 409 | sign | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 410 | end; | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 411 | |
| 3975 | 412 | fun extend_sign keep extfun name decls | 
| 413 |     (sg as Sg ({id = _, stamps}, {self, tsig, const_tab, syn, path, spaces, data})) =
 | |
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 414 | let | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 415 | val _ = check_stale sg; | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 416 | val (self', data') = | 
| 3975 | 417 | if is_draft sg andalso keep then (self, data) | 
| 4256 | 418 | else (SgRef (Some (ref sg)), prep_ext_data data); | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 419 | in | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 420 | create_sign self' stamps name | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 421 | (extfun (syn, tsig, const_tab, (path, spaces), data') decls) | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 422 | end; | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 423 | |
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 424 | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 425 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 426 | (** name spaces **) | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 427 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 428 | (* kinds *) | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 429 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 430 | val classK = "class"; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 431 | val typeK = "type"; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 432 | val constK = "const"; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 433 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 434 | |
| 8725 | 435 | (* declare and retrieve names *) | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 436 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 437 | fun space_of spaces kind = | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 438 | if_none (assoc (spaces, kind)) NameSpace.empty; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 439 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 440 | (*input and output of qualified names*) | 
| 3995 | 441 | fun intrn spaces kind = NameSpace.intern (space_of spaces kind); | 
| 442 | fun extrn spaces kind = NameSpace.extern (space_of spaces kind); | |
| 5175 | 443 | fun cond_extrn spaces kind = NameSpace.cond_extern (space_of spaces kind); | 
| 6845 | 444 | fun cond_extrn_table spaces kind tab = NameSpace.cond_extern_table (space_of spaces kind) tab; | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 445 | |
| 8725 | 446 | (*add / hide names*) | 
| 447 | fun change_space f spaces kind x = overwrite (spaces, (kind, f (space_of spaces kind, x))); | |
| 8730 | 448 | fun add_names x = change_space NameSpace.extend x; | 
| 12588 | 449 | fun hide_names b x = change_space (NameSpace.hide b) x; | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 450 | |
| 3810 | 451 | (*make full names*) | 
| 11501 | 452 | fun full _ "" = error "Attempt to declare empty name \"\"" | 
| 453 | | full None name = name | |
| 454 | | full (Some path) name = | |
| 455 | if NameSpace.is_qualified name then | |
| 456 |         error ("Attempt to declare qualified name " ^ quote name)
 | |
| 457 | else NameSpace.pack (path @ [name]); | |
| 3937 | 458 | |
| 459 | (*base name*) | |
| 460 | val base_name = NameSpace.base; | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 461 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 462 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 463 | (* intern / extern names *) | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 464 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 465 | local | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 466 | (*prepare mapping of names*) | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 467 | fun mapping f add_xs t = | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 468 | let | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 469 | fun f' x = let val y = f x in if x = y then None else Some (x, y) end; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 470 | val table = mapfilter f' (add_xs (t, [])); | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 471 | fun lookup x = if_none (assoc (table, x)) x; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 472 | in lookup end; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 473 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 474 | (*intern / extern typ*) | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 475 | fun trn_typ trn T = | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 476 | T |> map_typ | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 477 | (mapping (trn classK) add_typ_classes T) | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 478 | (mapping (trn typeK) add_typ_tycons T); | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 479 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 480 | (*intern / extern term*) | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 481 | fun trn_term trn t = | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 482 | t |> map_term | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 483 | (mapping (trn classK) add_term_classes t) | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 484 | (mapping (trn typeK) add_term_tycons t) | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 485 | (mapping (trn constK) add_term_consts t); | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 486 | |
| 3975 | 487 | val spaces_of = #spaces o rep_sg; | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 488 | in | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 489 | fun intrn_class spaces = intrn spaces classK; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 490 | fun extrn_class spaces = extrn spaces classK; | 
| 3937 | 491 | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 492 | val intrn_sort = map o intrn_class; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 493 | val intrn_typ = trn_typ o intrn; | 
| 3937 | 494 | val intrn_term = trn_term o intrn; | 
| 495 | ||
| 496 | val extrn_sort = map o extrn_class; | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 497 | val extrn_typ = trn_typ o extrn; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 498 | val extrn_term = trn_term o extrn; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 499 | |
| 3805 | 500 | fun intrn_tycons spaces T = | 
| 501 | map_typ I (mapping (intrn spaces typeK) add_typ_tycons T) T; | |
| 502 | ||
| 3810 | 503 | val intern = intrn o spaces_of; | 
| 3855 | 504 | val extern = extrn o spaces_of; | 
| 5175 | 505 | val cond_extern = cond_extrn o spaces_of; | 
| 6845 | 506 | fun cond_extern_table sg = cond_extrn_table (spaces_of sg); | 
| 3937 | 507 | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 508 | val intern_class = intrn_class o spaces_of; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 509 | val intern_sort = intrn_sort o spaces_of; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 510 | val intern_typ = intrn_typ o spaces_of; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 511 | val intern_term = intrn_term o spaces_of; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 512 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 513 | fun intern_tycon sg = intrn (spaces_of sg) typeK; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 514 | fun intern_const sg = intrn (spaces_of sg) constK; | 
| 3937 | 515 | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 516 | val intern_tycons = intrn_tycons o spaces_of; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 517 | |
| 3975 | 518 | val full_name = full o #path o rep_sg; | 
| 11501 | 519 | |
| 520 | fun full_name_path sg elems = | |
| 521 | full (Some (if_none (#path (rep_sg sg)) [] @ NameSpace.unpack elems)); | |
| 522 | ||
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 523 | end; | 
| 620 | 524 | |
| 402 | 525 | |
| 0 | 526 | |
| 4249 | 527 | (** pretty printing of terms, types etc. **) | 
| 3937 | 528 | |
| 12068 
469f372d63db
added pretty_term', read_typ', read_typ_no_norm', read_def_terms'
 wenzelm parents: 
11720diff
changeset | 529 | fun pretty_term' syn (sg as Sg ({stamps, ...}, {spaces, ...})) t =
 | 
| 3937 | 530 | Syntax.pretty_term syn | 
| 4249 | 531 | (exists (equal "CPure" o !) stamps) | 
| 5175 | 532 | (if ! NameSpace.long_names then t else extrn_term spaces t); | 
| 3937 | 533 | |
| 12068 
469f372d63db
added pretty_term', read_typ', read_typ_no_norm', read_def_terms'
 wenzelm parents: 
11720diff
changeset | 534 | fun pretty_term sg = pretty_term' (syn_of sg) sg; | 
| 
469f372d63db
added pretty_term', read_typ', read_typ_no_norm', read_def_terms'
 wenzelm parents: 
11720diff
changeset | 535 | |
| 3975 | 536 | fun pretty_typ (Sg (_, {syn, spaces, ...})) T =
 | 
| 3937 | 537 | Syntax.pretty_typ syn | 
| 5175 | 538 | (if ! NameSpace.long_names then T else extrn_typ spaces T); | 
| 3937 | 539 | |
| 3975 | 540 | fun pretty_sort (Sg (_, {syn, spaces, ...})) S =
 | 
| 3937 | 541 | Syntax.pretty_sort syn | 
| 5175 | 542 | (if ! NameSpace.long_names then S else extrn_sort spaces S); | 
| 3937 | 543 | |
| 544 | fun pretty_classrel sg (c1, c2) = Pretty.block | |
| 545 | [pretty_sort sg [c1], Pretty.str " <", Pretty.brk 1, pretty_sort sg [c2]]; | |
| 546 | ||
| 547 | fun pretty_arity sg (t, Ss, S) = | |
| 548 | let | |
| 549 | val t' = cond_extern sg typeK t; | |
| 550 | val dom = | |
| 551 | if null Ss then [] | |
| 552 |       else [Pretty.list "(" ")" (map (pretty_sort sg) Ss), Pretty.brk 1];
 | |
| 553 | in | |
| 554 | Pretty.block | |
| 555 | ([Pretty.str (t' ^ " ::"), Pretty.brk 1] @ dom @ [pretty_sort sg S]) | |
| 556 | end; | |
| 557 | ||
| 558 | fun string_of_term sg t = Pretty.string_of (pretty_term sg t); | |
| 559 | fun string_of_typ sg T = Pretty.string_of (pretty_typ sg T); | |
| 560 | fun string_of_sort sg S = Pretty.string_of (pretty_sort sg S); | |
| 561 | ||
| 562 | fun str_of_sort sg S = Pretty.str_of (pretty_sort sg S); | |
| 563 | fun str_of_classrel sg c1_c2 = Pretty.str_of (pretty_classrel sg c1_c2); | |
| 564 | fun str_of_arity sg ar = Pretty.str_of (pretty_arity sg ar); | |
| 565 | ||
| 566 | fun pprint_term sg = Pretty.pprint o Pretty.quote o (pretty_term sg); | |
| 567 | fun pprint_typ sg = Pretty.pprint o Pretty.quote o (pretty_typ sg); | |
| 568 | ||
| 569 | ||
| 570 | ||
| 8898 | 571 | (** read sorts **) (*exception ERROR*) | 
| 572 | ||
| 573 | fun err_in_sort s = | |
| 574 |   error ("The error(s) above occurred in sort " ^ quote s);
 | |
| 575 | ||
| 576 | fun rd_sort syn tsig spaces str = | |
| 577 | let val S = intrn_sort spaces (Syntax.read_sort syn str handle ERROR => err_in_sort str) | |
| 578 | in Type.cert_sort tsig S handle TYPE (msg, _, _) => (error_msg msg; err_in_sort str) end; | |
| 579 | ||
| 580 | (*read and certify sort wrt a signature*) | |
| 581 | fun read_sort (sg as Sg (_, {tsig, syn, spaces, ...})) str =
 | |
| 582 | (check_stale sg; rd_sort syn tsig spaces str); | |
| 583 | ||
| 584 | fun cert_sort _ tsig _ = Type.cert_sort tsig; | |
| 585 | ||
| 586 | ||
| 587 | ||
| 562 | 588 | (** read types **) (*exception ERROR*) | 
| 589 | ||
| 590 | fun err_in_type s = | |
| 591 |   error ("The error(s) above occurred in type " ^ quote s);
 | |
| 592 | ||
| 4227 | 593 | fun rd_raw_typ syn tsig spaces def_sort str = | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 594 | intrn_tycons spaces | 
| 12313 | 595 | (Syntax.read_typ syn (Type.get_sort tsig def_sort (intrn_sort spaces)) (intrn_sort spaces) str | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 596 | handle ERROR => err_in_type str); | 
| 4227 | 597 | |
| 12068 
469f372d63db
added pretty_term', read_typ', read_typ_no_norm', read_def_terms'
 wenzelm parents: 
11720diff
changeset | 598 | fun read_raw_typ' syn (sg as Sg (_, {tsig, spaces, ...}), def_sort) str =
 | 
| 4227 | 599 | (check_stale sg; rd_raw_typ syn tsig spaces def_sort str); | 
| 600 | ||
| 12068 
469f372d63db
added pretty_term', read_typ', read_typ_no_norm', read_def_terms'
 wenzelm parents: 
11720diff
changeset | 601 | fun read_raw_typ (sg, def_sort) = read_raw_typ' (syn_of sg) (sg, def_sort); | 
| 
469f372d63db
added pretty_term', read_typ', read_typ_no_norm', read_def_terms'
 wenzelm parents: 
11720diff
changeset | 602 | |
| 562 | 603 | (*read and certify typ wrt a signature*) | 
| 9504 | 604 | local | 
| 12068 
469f372d63db
added pretty_term', read_typ', read_typ_no_norm', read_def_terms'
 wenzelm parents: 
11720diff
changeset | 605 | fun read_typ_aux rd cert (sg, def_sort) str = | 
| 
469f372d63db
added pretty_term', read_typ', read_typ_no_norm', read_def_terms'
 wenzelm parents: 
11720diff
changeset | 606 | (cert (tsig_of sg) (rd (sg, def_sort) str) | 
| 
469f372d63db
added pretty_term', read_typ', read_typ_no_norm', read_def_terms'
 wenzelm parents: 
11720diff
changeset | 607 | handle TYPE (msg, _, _) => (error_msg msg; err_in_type str)); | 
| 9504 | 608 | in | 
| 12068 
469f372d63db
added pretty_term', read_typ', read_typ_no_norm', read_def_terms'
 wenzelm parents: 
11720diff
changeset | 609 | val read_typ = read_typ_aux read_raw_typ Type.cert_typ; | 
| 
469f372d63db
added pretty_term', read_typ', read_typ_no_norm', read_def_terms'
 wenzelm parents: 
11720diff
changeset | 610 | val read_typ_no_norm = read_typ_aux read_raw_typ Type.cert_typ_no_norm; | 
| 
469f372d63db
added pretty_term', read_typ', read_typ_no_norm', read_def_terms'
 wenzelm parents: 
11720diff
changeset | 611 | fun read_typ' syn = read_typ_aux (read_raw_typ' syn) Type.cert_typ; | 
| 
469f372d63db
added pretty_term', read_typ', read_typ_no_norm', read_def_terms'
 wenzelm parents: 
11720diff
changeset | 612 | fun read_typ_no_norm' syn = read_typ_aux (read_raw_typ' syn) Type.cert_typ_no_norm; | 
| 9504 | 613 | end; | 
| 562 | 614 | |
| 615 | ||
| 616 | ||
| 8898 | 617 | (** certify classes, sorts, types and terms **) (*exception TYPE*) | 
| 251 | 618 | |
| 8898 | 619 | val certify_class = Type.cert_class o tsig_of; | 
| 620 | val certify_sort = Type.cert_sort o tsig_of; | |
| 3975 | 621 | val certify_typ = Type.cert_typ o tsig_of; | 
| 9504 | 622 | val certify_typ_no_norm = Type.cert_typ_no_norm o tsig_of; | 
| 10443 
0a68dc9edba5
added certify_tycon, certify_tyabbr, certify_const;
 wenzelm parents: 
10404diff
changeset | 623 | |
| 
0a68dc9edba5
added certify_tycon, certify_tyabbr, certify_const;
 wenzelm parents: 
10404diff
changeset | 624 | fun certify_tycon sg c = | 
| 
0a68dc9edba5
added certify_tycon, certify_tyabbr, certify_const;
 wenzelm parents: 
10404diff
changeset | 625 | if is_some (Symtab.lookup (#tycons (Type.rep_tsig (tsig_of sg)), c)) then c | 
| 
0a68dc9edba5
added certify_tycon, certify_tyabbr, certify_const;
 wenzelm parents: 
10404diff
changeset | 626 |   else raise TYPE ("Undeclared type constructor " ^ quote c, [], []);
 | 
| 
0a68dc9edba5
added certify_tycon, certify_tyabbr, certify_const;
 wenzelm parents: 
10404diff
changeset | 627 | |
| 
0a68dc9edba5
added certify_tycon, certify_tyabbr, certify_const;
 wenzelm parents: 
10404diff
changeset | 628 | fun certify_tyabbr sg c = | 
| 
0a68dc9edba5
added certify_tycon, certify_tyabbr, certify_const;
 wenzelm parents: 
10404diff
changeset | 629 | if is_some (Symtab.lookup (#abbrs (Type.rep_tsig (tsig_of sg)), c)) then c | 
| 
0a68dc9edba5
added certify_tycon, certify_tyabbr, certify_const;
 wenzelm parents: 
10404diff
changeset | 630 |   else raise TYPE ("Unknown type abbreviation " ^ quote c, [], []);
 | 
| 
0a68dc9edba5
added certify_tycon, certify_tyabbr, certify_const;
 wenzelm parents: 
10404diff
changeset | 631 | |
| 11720 | 632 | fun certify_tyname sg c = | 
| 633 | certify_tycon sg c handle TYPE _ => certify_tyabbr sg c handle TYPE _ => | |
| 634 |     raise TYPE ("Unknown type name " ^ quote c, [], []);
 | |
| 635 | ||
| 10443 
0a68dc9edba5
added certify_tycon, certify_tyabbr, certify_const;
 wenzelm parents: 
10404diff
changeset | 636 | fun certify_const sg c = | 
| 
0a68dc9edba5
added certify_tycon, certify_tyabbr, certify_const;
 wenzelm parents: 
10404diff
changeset | 637 |   if is_some (const_type sg c) then c else raise TYPE ("Undeclared constant " ^ quote c, [], []);
 | 
| 251 | 638 | |
| 4961 
27f559b54c57
certify_term: type_check replaces Term.type_of, providing sensible
 wenzelm parents: 
4951diff
changeset | 639 | |
| 
27f559b54c57
certify_term: type_check replaces Term.type_of, providing sensible
 wenzelm parents: 
4951diff
changeset | 640 | (* certify_term *) | 
| 
27f559b54c57
certify_term: type_check replaces Term.type_of, providing sensible
 wenzelm parents: 
4951diff
changeset | 641 | |
| 8290 
7015d6b11b56
nodup_vars: fixed omission of 2 minor cases; account for Frees as well;
 wenzelm parents: 
7640diff
changeset | 642 | (*check for duplicate occurrences of TFree/TVar with distinct sorts*) | 
| 
7015d6b11b56
nodup_vars: fixed omission of 2 minor cases; account for Frees as well;
 wenzelm parents: 
7640diff
changeset | 643 | fun nodup_tvars (env, Type (_, Ts)) = nodup_tvars_list (env, Ts) | 
| 
7015d6b11b56
nodup_vars: fixed omission of 2 minor cases; account for Frees as well;
 wenzelm parents: 
7640diff
changeset | 644 | | nodup_tvars (env as (tfrees, tvars), T as TFree (v as (a, S))) = | 
| 
7015d6b11b56
nodup_vars: fixed omission of 2 minor cases; account for Frees as well;
 wenzelm parents: 
7640diff
changeset | 645 | (case assoc_string (tfrees, a) of | 
| 
7015d6b11b56
nodup_vars: fixed omission of 2 minor cases; account for Frees as well;
 wenzelm parents: 
7640diff
changeset | 646 | Some S' => | 
| 
7015d6b11b56
nodup_vars: fixed omission of 2 minor cases; account for Frees as well;
 wenzelm parents: 
7640diff
changeset | 647 | if S = S' then env | 
| 
7015d6b11b56
nodup_vars: fixed omission of 2 minor cases; account for Frees as well;
 wenzelm parents: 
7640diff
changeset | 648 |           else raise TYPE ("Type variable " ^ quote a ^
 | 
| 
7015d6b11b56
nodup_vars: fixed omission of 2 minor cases; account for Frees as well;
 wenzelm parents: 
7640diff
changeset | 649 | " has two distinct sorts", [TFree (a, S'), T], []) | 
| 
7015d6b11b56
nodup_vars: fixed omission of 2 minor cases; account for Frees as well;
 wenzelm parents: 
7640diff
changeset | 650 | | None => (v :: tfrees, tvars)) | 
| 
7015d6b11b56
nodup_vars: fixed omission of 2 minor cases; account for Frees as well;
 wenzelm parents: 
7640diff
changeset | 651 | | nodup_tvars (env as (tfrees, tvars), T as TVar (v as (a, S))) = | 
| 2979 | 652 | (case assoc_string_int (tvars, a) of | 
| 653 | Some S' => | |
| 8290 
7015d6b11b56
nodup_vars: fixed omission of 2 minor cases; account for Frees as well;
 wenzelm parents: 
7640diff
changeset | 654 | if S = S' then env | 
| 
7015d6b11b56
nodup_vars: fixed omission of 2 minor cases; account for Frees as well;
 wenzelm parents: 
7640diff
changeset | 655 |           else raise TYPE ("Type variable " ^ quote (Syntax.string_of_vname a) ^
 | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 656 | " has two distinct sorts", [TVar (a, S'), T], []) | 
| 8290 
7015d6b11b56
nodup_vars: fixed omission of 2 minor cases; account for Frees as well;
 wenzelm parents: 
7640diff
changeset | 657 | | None => (tfrees, v :: tvars)) | 
| 
7015d6b11b56
nodup_vars: fixed omission of 2 minor cases; account for Frees as well;
 wenzelm parents: 
7640diff
changeset | 658 | (*equivalent to foldl nodup_tvars_list, but 3X faster under Poly/ML*) | 
| 
7015d6b11b56
nodup_vars: fixed omission of 2 minor cases; account for Frees as well;
 wenzelm parents: 
7640diff
changeset | 659 | and nodup_tvars_list (env, []) = env | 
| 
7015d6b11b56
nodup_vars: fixed omission of 2 minor cases; account for Frees as well;
 wenzelm parents: 
7640diff
changeset | 660 | | nodup_tvars_list (env, T :: Ts) = nodup_tvars_list (nodup_tvars (env, T), Ts); | 
| 1494 
22f67e796445
added nodup_Vars check in cterm_of. Prevents same var with distinct types.
 nipkow parents: 
1460diff
changeset | 661 | |
| 8290 
7015d6b11b56
nodup_vars: fixed omission of 2 minor cases; account for Frees as well;
 wenzelm parents: 
7640diff
changeset | 662 | (*check for duplicate occurrences of Free/Var with distinct types*) | 
| 
7015d6b11b56
nodup_vars: fixed omission of 2 minor cases; account for Frees as well;
 wenzelm parents: 
7640diff
changeset | 663 | fun nodup_vars tm = | 
| 2979 | 664 | let | 
| 8290 
7015d6b11b56
nodup_vars: fixed omission of 2 minor cases; account for Frees as well;
 wenzelm parents: 
7640diff
changeset | 665 | fun nodups (envs as (env as (frees, vars), envT)) tm = | 
| 2979 | 666 | (case tm of | 
| 8290 
7015d6b11b56
nodup_vars: fixed omission of 2 minor cases; account for Frees as well;
 wenzelm parents: 
7640diff
changeset | 667 | Const (c, T) => (env, nodup_tvars (envT, T)) | 
| 
7015d6b11b56
nodup_vars: fixed omission of 2 minor cases; account for Frees as well;
 wenzelm parents: 
7640diff
changeset | 668 | | Free (v as (a, T)) => | 
| 
7015d6b11b56
nodup_vars: fixed omission of 2 minor cases; account for Frees as well;
 wenzelm parents: 
7640diff
changeset | 669 | (case assoc_string (frees, a) of | 
| 
7015d6b11b56
nodup_vars: fixed omission of 2 minor cases; account for Frees as well;
 wenzelm parents: 
7640diff
changeset | 670 | Some T' => | 
| 
7015d6b11b56
nodup_vars: fixed omission of 2 minor cases; account for Frees as well;
 wenzelm parents: 
7640diff
changeset | 671 | if T = T' then (env, nodup_tvars (envT, T)) | 
| 
7015d6b11b56
nodup_vars: fixed omission of 2 minor cases; account for Frees as well;
 wenzelm parents: 
7640diff
changeset | 672 |               else raise TYPE ("Variable " ^ quote a ^
 | 
| 
7015d6b11b56
nodup_vars: fixed omission of 2 minor cases; account for Frees as well;
 wenzelm parents: 
7640diff
changeset | 673 | " has two distinct types", [T', T], []) | 
| 
7015d6b11b56
nodup_vars: fixed omission of 2 minor cases; account for Frees as well;
 wenzelm parents: 
7640diff
changeset | 674 | | None => ((v :: frees, vars), nodup_tvars (envT, T))) | 
| 2979 | 675 | | Var (v as (ixn, T)) => | 
| 676 | (case assoc_string_int (vars, ixn) of | |
| 677 | Some T' => | |
| 8290 
7015d6b11b56
nodup_vars: fixed omission of 2 minor cases; account for Frees as well;
 wenzelm parents: 
7640diff
changeset | 678 | if T = T' then (env, nodup_tvars (envT, T)) | 
| 
7015d6b11b56
nodup_vars: fixed omission of 2 minor cases; account for Frees as well;
 wenzelm parents: 
7640diff
changeset | 679 |               else raise TYPE ("Variable " ^ quote (Syntax.string_of_vname ixn) ^
 | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 680 | " has two distinct types", [T', T], []) | 
| 8290 
7015d6b11b56
nodup_vars: fixed omission of 2 minor cases; account for Frees as well;
 wenzelm parents: 
7640diff
changeset | 681 | | None => ((frees, v :: vars), nodup_tvars (envT, T))) | 
| 
7015d6b11b56
nodup_vars: fixed omission of 2 minor cases; account for Frees as well;
 wenzelm parents: 
7640diff
changeset | 682 | | Bound _ => envs | 
| 
7015d6b11b56
nodup_vars: fixed omission of 2 minor cases; account for Frees as well;
 wenzelm parents: 
7640diff
changeset | 683 | | Abs (_, T, t) => nodups (env, nodup_tvars (envT, T)) t | 
| 
7015d6b11b56
nodup_vars: fixed omission of 2 minor cases; account for Frees as well;
 wenzelm parents: 
7640diff
changeset | 684 | | s $ t => nodups (nodups envs s) t) | 
| 
7015d6b11b56
nodup_vars: fixed omission of 2 minor cases; account for Frees as well;
 wenzelm parents: 
7640diff
changeset | 685 | in nodups (([], []), ([], [])) tm; tm end; | 
| 2979 | 686 | |
| 4961 
27f559b54c57
certify_term: type_check replaces Term.type_of, providing sensible
 wenzelm parents: 
4951diff
changeset | 687 | (*compute and check type of the term*) | 
| 
27f559b54c57
certify_term: type_check replaces Term.type_of, providing sensible
 wenzelm parents: 
4951diff
changeset | 688 | fun type_check sg tm = | 
| 
27f559b54c57
certify_term: type_check replaces Term.type_of, providing sensible
 wenzelm parents: 
4951diff
changeset | 689 | let | 
| 8725 | 690 | val prt = setmp Syntax.show_brackets true (pretty_term sg); | 
| 691 | val prT = pretty_typ sg; | |
| 251 | 692 | |
| 4961 
27f559b54c57
certify_term: type_check replaces Term.type_of, providing sensible
 wenzelm parents: 
4951diff
changeset | 693 | fun err_appl why bs t T u U = | 
| 
27f559b54c57
certify_term: type_check replaces Term.type_of, providing sensible
 wenzelm parents: 
4951diff
changeset | 694 | let | 
| 10404 | 695 | val xs = map Free bs; (*we do not rename here*) | 
| 4961 
27f559b54c57
certify_term: type_check replaces Term.type_of, providing sensible
 wenzelm parents: 
4951diff
changeset | 696 | val t' = subst_bounds (xs, t); | 
| 
27f559b54c57
certify_term: type_check replaces Term.type_of, providing sensible
 wenzelm parents: 
4951diff
changeset | 697 | val u' = subst_bounds (xs, u); | 
| 10404 | 698 | val text = cat_lines (TypeInfer.appl_error prt prT why t' T u' U); | 
| 4961 
27f559b54c57
certify_term: type_check replaces Term.type_of, providing sensible
 wenzelm parents: 
4951diff
changeset | 699 | in raise TYPE (text, [T, U], [t', u']) end; | 
| 
27f559b54c57
certify_term: type_check replaces Term.type_of, providing sensible
 wenzelm parents: 
4951diff
changeset | 700 | |
| 
27f559b54c57
certify_term: type_check replaces Term.type_of, providing sensible
 wenzelm parents: 
4951diff
changeset | 701 | fun typ_of (_, Const (_, T)) = T | 
| 
27f559b54c57
certify_term: type_check replaces Term.type_of, providing sensible
 wenzelm parents: 
4951diff
changeset | 702 | | typ_of (_, Free (_, T)) = T | 
| 
27f559b54c57
certify_term: type_check replaces Term.type_of, providing sensible
 wenzelm parents: 
4951diff
changeset | 703 | | typ_of (_, Var (_, T)) = T | 
| 
27f559b54c57
certify_term: type_check replaces Term.type_of, providing sensible
 wenzelm parents: 
4951diff
changeset | 704 | | typ_of (bs, Bound i) = snd (nth_elem (i, bs) handle LIST _ => | 
| 
27f559b54c57
certify_term: type_check replaces Term.type_of, providing sensible
 wenzelm parents: 
4951diff
changeset | 705 |           raise TYPE ("Loose bound variable: B." ^ string_of_int i, [], [Bound i]))
 | 
| 
27f559b54c57
certify_term: type_check replaces Term.type_of, providing sensible
 wenzelm parents: 
4951diff
changeset | 706 | | typ_of (bs, Abs (x, T, body)) = T --> typ_of ((x, T) :: bs, body) | 
| 
27f559b54c57
certify_term: type_check replaces Term.type_of, providing sensible
 wenzelm parents: 
4951diff
changeset | 707 | | typ_of (bs, t $ u) = | 
| 
27f559b54c57
certify_term: type_check replaces Term.type_of, providing sensible
 wenzelm parents: 
4951diff
changeset | 708 | let val T = typ_of (bs, t) and U = typ_of (bs, u) in | 
| 
27f559b54c57
certify_term: type_check replaces Term.type_of, providing sensible
 wenzelm parents: 
4951diff
changeset | 709 | (case T of | 
| 
27f559b54c57
certify_term: type_check replaces Term.type_of, providing sensible
 wenzelm parents: 
4951diff
changeset | 710 |               Type ("fun", [T1, T2]) =>
 | 
| 
27f559b54c57
certify_term: type_check replaces Term.type_of, providing sensible
 wenzelm parents: 
4951diff
changeset | 711 | if T1 = U then T2 else err_appl "Incompatible operand type." bs t T u U | 
| 
27f559b54c57
certify_term: type_check replaces Term.type_of, providing sensible
 wenzelm parents: 
4951diff
changeset | 712 | | _ => err_appl "Operator not of function type." bs t T u U) | 
| 
27f559b54c57
certify_term: type_check replaces Term.type_of, providing sensible
 wenzelm parents: 
4951diff
changeset | 713 | end; | 
| 
27f559b54c57
certify_term: type_check replaces Term.type_of, providing sensible
 wenzelm parents: 
4951diff
changeset | 714 | |
| 
27f559b54c57
certify_term: type_check replaces Term.type_of, providing sensible
 wenzelm parents: 
4951diff
changeset | 715 | in typ_of ([], tm) end; | 
| 0 | 716 | |
| 2979 | 717 | |
| 3975 | 718 | fun certify_term sg tm = | 
| 251 | 719 | let | 
| 3969 | 720 | val _ = check_stale sg; | 
| 3975 | 721 | val tsig = tsig_of sg; | 
| 3969 | 722 | |
| 3975 | 723 | fun show_const a T = quote a ^ " :: " ^ quote (string_of_typ sg T); | 
| 169 | 724 | |
| 4961 
27f559b54c57
certify_term: type_check replaces Term.type_of, providing sensible
 wenzelm parents: 
4951diff
changeset | 725 | fun atom_err (errs, Const (a, T)) = | 
| 3975 | 726 | (case const_type sg a of | 
| 4961 
27f559b54c57
certify_term: type_check replaces Term.type_of, providing sensible
 wenzelm parents: 
4951diff
changeset | 727 |           None => ("Undeclared constant " ^ show_const a T) :: errs
 | 
| 3975 | 728 | | Some U => | 
| 10404 | 729 | if typ_instance sg (T, U) then errs | 
| 4961 
27f559b54c57
certify_term: type_check replaces Term.type_of, providing sensible
 wenzelm parents: 
4951diff
changeset | 730 |             else ("Illegal type for constant " ^ show_const a T) :: errs)
 | 
| 
27f559b54c57
certify_term: type_check replaces Term.type_of, providing sensible
 wenzelm parents: 
4951diff
changeset | 731 | | atom_err (errs, Var ((x, i), _)) = | 
| 
27f559b54c57
certify_term: type_check replaces Term.type_of, providing sensible
 wenzelm parents: 
4951diff
changeset | 732 |           if i < 0 then ("Negative index for Var " ^ quote x) :: errs else errs
 | 
| 
27f559b54c57
certify_term: type_check replaces Term.type_of, providing sensible
 wenzelm parents: 
4951diff
changeset | 733 | | atom_err (errs, _) = errs; | 
| 251 | 734 | |
| 735 | val norm_tm = | |
| 2185 | 736 | (case it_term_types (Type.typ_errors tsig) (tm, []) of | 
| 7068 | 737 | [] => Type.norm_term tsig tm | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 738 | | errs => raise TYPE (cat_lines errs, [], [tm])); | 
| 8290 
7015d6b11b56
nodup_vars: fixed omission of 2 minor cases; account for Frees as well;
 wenzelm parents: 
7640diff
changeset | 739 | val _ = nodup_vars norm_tm; | 
| 251 | 740 | in | 
| 4961 
27f559b54c57
certify_term: type_check replaces Term.type_of, providing sensible
 wenzelm parents: 
4951diff
changeset | 741 | (case foldl_aterms atom_err ([], norm_tm) of | 
| 
27f559b54c57
certify_term: type_check replaces Term.type_of, providing sensible
 wenzelm parents: 
4951diff
changeset | 742 | [] => (norm_tm, type_check sg norm_tm, maxidx_of_term norm_tm) | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 743 | | errs => raise TYPE (cat_lines errs, [], [norm_tm])) | 
| 251 | 744 | end; | 
| 745 | ||
| 746 | ||
| 583 | 747 | (** infer_types **) (*exception ERROR*) | 
| 251 | 748 | |
| 2979 | 749 | (* | 
| 750 | def_type: partial map from indexnames to types (constrains Frees, Vars) | |
| 751 | def_sort: partial map from indexnames to sorts (constrains TFrees, TVars) | |
| 752 | used: list of already used type variables | |
| 753 | freeze: if true then generated parameters are turned into TFrees, else TVars | |
| 4249 | 754 | |
| 755 | termss: lists of alternative parses (only one combination should be type-correct) | |
| 756 | typs: expected types | |
| 2979 | 757 | *) | 
| 758 | ||
| 4249 | 759 | fun infer_types_simult sg def_type def_sort used freeze args = | 
| 251 | 760 | let | 
| 3975 | 761 | val tsig = tsig_of sg; | 
| 8725 | 762 | val prt = setmp Syntax.show_brackets true (pretty_term sg); | 
| 763 | val prT = pretty_typ sg; | |
| 4249 | 764 | |
| 765 | val termss = foldr multiply (map fst args, [[]]); | |
| 766 | val typs = | |
| 767 | map (fn (_, T) => certify_typ sg T handle TYPE (msg, _, _) => error msg) args; | |
| 169 | 768 | |
| 4249 | 769 | fun infer ts = OK | 
| 770 | (Type.infer_types prt prT tsig (const_type sg) def_type def_sort | |
| 771 | (intern_const sg) (intern_tycons sg) (intern_sort sg) used freeze typs ts) | |
| 772 | handle TYPE (msg, _, _) => Error msg; | |
| 623 | 773 | |
| 4249 | 774 | val err_results = map infer termss; | 
| 775 | val errs = mapfilter get_error err_results; | |
| 776 | val results = mapfilter get_ok err_results; | |
| 777 | ||
| 10404 | 778 | val ambiguity = length termss; (* FIXME !? *) | 
| 4249 | 779 | (* FIXME to syntax.ML!? *) | 
| 780 | fun ambig_msg () = | |
| 781 | if ambiguity > 1 andalso ambiguity <= ! Syntax.ambiguity_level | |
| 782 | then | |
| 783 | error_msg "Got more than one parse tree.\n\ | |
| 3805 | 784 | \Retry with smaller Syntax.ambiguity_level for more information." | 
| 952 
9e10962866b0
Removed an old bug which made some simultaneous instantiations fail if they
 nipkow parents: 
949diff
changeset | 785 | else (); | 
| 4249 | 786 | in | 
| 787 | if null results then (ambig_msg (); error (cat_lines errs)) | |
| 788 | else if length results = 1 then | |
| 789 | (if ambiguity > ! Syntax.ambiguity_level then | |
| 790 | warning "Fortunately, only one parse tree is type correct.\n\ | |
| 791 | \You may still want to disambiguate your grammar or your input." | |
| 792 | else (); hd results) | |
| 793 |     else (ambig_msg (); error ("More than one term is type correct:\n" ^
 | |
| 794 | (cat_lines (map (Pretty.string_of o prt) (flat (map fst results)))))) | |
| 795 | end; | |
| 623 | 796 | |
| 4249 | 797 | |
| 798 | fun infer_types sg def_type def_sort used freeze tsT = | |
| 799 | apfst hd (infer_types_simult sg def_type def_sort used freeze [tsT]); | |
| 251 | 800 | |
| 801 | ||
| 8607 | 802 | (** read_def_terms **) | 
| 803 | ||
| 804 | (*read terms, infer types*) | |
| 12068 
469f372d63db
added pretty_term', read_typ', read_typ_no_norm', read_def_terms'
 wenzelm parents: 
11720diff
changeset | 805 | fun read_def_terms' syn (sign, types, sorts) used freeze sTs = | 
| 8607 | 806 | let | 
| 807 | fun read (s, T) = | |
| 808 | let val T' = certify_typ sign T handle TYPE (msg, _, _) => error msg | |
| 809 | in (Syntax.read syn T' s, T') end; | |
| 810 | val tsTs = map read sTs; | |
| 811 | in infer_types_simult sign types sorts used freeze tsTs end; | |
| 812 | ||
| 12068 
469f372d63db
added pretty_term', read_typ', read_typ_no_norm', read_def_terms'
 wenzelm parents: 
11720diff
changeset | 813 | fun read_def_terms (sign, types, sorts) = read_def_terms' (syn_of sign) (sign, types, sorts); | 
| 
469f372d63db
added pretty_term', read_typ', read_typ_no_norm', read_def_terms'
 wenzelm parents: 
11720diff
changeset | 814 | |
| 8802 | 815 | fun simple_read_term sign T s = | 
| 816 | (read_def_terms (sign, K None, K None) [] true [(s, T)] | |
| 817 |     handle ERROR => error ("The error(s) above occurred for " ^ s)) |> #1 |> hd;
 | |
| 818 | ||
| 8607 | 819 | |
| 2979 | 820 | |
| 623 | 821 | (** extend signature **) (*exception ERROR*) | 
| 822 | ||
| 620 | 823 | (** signature extension functions **) (*exception ERROR*) | 
| 386 | 824 | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 825 | fun decls_of path name_of mfixs = | 
| 3810 | 826 | map (fn (x, y, mx) => (full path (name_of x mx), y)) mfixs; | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 827 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 828 | fun no_read _ _ _ decl = decl; | 
| 386 | 829 | |
| 830 | ||
| 831 | (* add default sort *) | |
| 832 | ||
| 8898 | 833 | fun ext_defS prep_sort (syn, tsig, ctab, (path, spaces), data) S = | 
| 834 | (syn, Type.ext_tsig_defsort tsig (prep_sort syn tsig spaces S), ctab, (path, spaces), data); | |
| 835 | ||
| 8927 | 836 | fun ext_defsort arg = ext_defS rd_sort arg; | 
| 837 | fun ext_defsort_i arg = ext_defS cert_sort arg; | |
| 386 | 838 | |
| 839 | ||
| 840 | (* add type constructors *) | |
| 841 | ||
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 842 | fun ext_types (syn, tsig, ctab, (path, spaces), data) types = | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 843 | let val decls = decls_of path Syntax.type_name types in | 
| 12068 
469f372d63db
added pretty_term', read_typ', read_typ_no_norm', read_def_terms'
 wenzelm parents: 
11720diff
changeset | 844 | (Syntax.extend_type_gram types syn, | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 845 | Type.ext_tsig_types tsig decls, ctab, | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 846 | (path, add_names spaces typeK (map fst decls)), data) | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 847 | end; | 
| 386 | 848 | |
| 4844 | 849 | fun ext_nonterminals sg nonterms = | 
| 850 | ext_types sg (map (fn n => (n, 0, Syntax.NoSyn)) nonterms); | |
| 851 | ||
| 386 | 852 | |
| 853 | (* add type abbreviations *) | |
| 854 | ||
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 855 | fun read_abbr syn tsig spaces (t, vs, rhs_src) = | 
| 4227 | 856 | (t, vs, rd_raw_typ syn tsig spaces (K None) rhs_src) | 
| 386 | 857 |     handle ERROR => error ("in type abbreviation " ^ t);
 | 
| 858 | ||
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 859 | fun ext_abbrs rd_abbr (syn, tsig, ctab, (path, spaces), data) abbrs = | 
| 386 | 860 | let | 
| 861 | fun mfix_of (t, vs, _, mx) = (t, length vs, mx); | |
| 12068 
469f372d63db
added pretty_term', read_typ', read_typ_no_norm', read_def_terms'
 wenzelm parents: 
11720diff
changeset | 862 | val syn' = Syntax.extend_type_gram (map mfix_of abbrs) syn; | 
| 386 | 863 | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 864 | val abbrs' = | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 865 | map (fn (t, vs, rhs, mx) => | 
| 3810 | 866 | (full path (Syntax.type_name t mx), vs, rhs)) abbrs; | 
| 3805 | 867 | val spaces' = add_names spaces typeK (map #1 abbrs'); | 
| 868 | val decls = map (rd_abbr syn' tsig spaces') abbrs'; | |
| 386 | 869 | in | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 870 | (syn', Type.ext_tsig_abbrs tsig decls, ctab, (path, spaces'), data) | 
| 386 | 871 | end; | 
| 872 | ||
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 873 | fun ext_tyabbrs abbrs = ext_abbrs read_abbr abbrs; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 874 | fun ext_tyabbrs_i abbrs = ext_abbrs no_read abbrs; | 
| 386 | 875 | |
| 876 | ||
| 877 | (* add type arities *) | |
| 878 | ||
| 8898 | 879 | fun ext_ars int prep_sort (syn, tsig, ctab, (path, spaces), data) arities = | 
| 386 | 880 | let | 
| 8898 | 881 | val prepS = prep_sort syn tsig spaces; | 
| 882 | fun prep_arity (c, Ss, S) = | |
| 883 | (if int then intrn spaces typeK c else c, map prepS Ss, prepS S); | |
| 884 | val tsig' = Type.ext_tsig_arities tsig (map prep_arity arities); | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 885 | val log_types = Type.logical_types tsig'; | 
| 386 | 886 | in | 
| 12068 
469f372d63db
added pretty_term', read_typ', read_typ_no_norm', read_def_terms'
 wenzelm parents: 
11720diff
changeset | 887 | (Syntax.extend_log_types log_types syn, tsig', ctab, (path, spaces), data) | 
| 386 | 888 | end; | 
| 889 | ||
| 8927 | 890 | fun ext_arities arg = ext_ars true rd_sort arg; | 
| 891 | fun ext_arities_i arg = ext_ars false cert_sort arg; | |
| 8898 | 892 | |
| 386 | 893 | |
| 894 | (* add term constants and syntax *) | |
| 895 | ||
| 3805 | 896 | fun const_name path c mx = | 
| 3810 | 897 | full path (Syntax.const_name c mx); | 
| 3805 | 898 | |
| 386 | 899 | fun err_in_const c = | 
| 900 |   error ("in declaration of constant " ^ quote c);
 | |
| 901 | ||
| 902 | fun err_dup_consts cs = | |
| 903 |   error ("Duplicate declaration of constant(s) " ^ commas_quote cs);
 | |
| 904 | ||
| 251 | 905 | |
| 3805 | 906 | fun read_const syn tsig (path, spaces) (c, ty_src, mx) = | 
| 4227 | 907 | (c, rd_raw_typ syn tsig spaces (K None) ty_src, mx) | 
| 3805 | 908 | handle ERROR => err_in_const (const_name path c mx); | 
| 386 | 909 | |
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 910 | fun ext_cnsts rd_const syn_only prmode (syn, tsig, ctab, (path, spaces), data) raw_consts = | 
| 386 | 911 | let | 
| 2979 | 912 | fun prep_const (c, ty, mx) = | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 913 | (c, compress_type (Type.varifyT (Type.cert_typ tsig (Type.no_tvars ty))), mx) | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 914 | handle TYPE (msg, _, _) => | 
| 3805 | 915 | (error_msg msg; err_in_const (const_name path c mx)); | 
| 386 | 916 | |
| 3805 | 917 | val consts = map (prep_const o rd_const syn tsig (path, spaces)) raw_consts; | 
| 386 | 918 | val decls = | 
| 919 | if syn_only then [] | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 920 | else decls_of path Syntax.const_name consts; | 
| 386 | 921 | in | 
| 12068 
469f372d63db
added pretty_term', read_typ', read_typ_no_norm', read_def_terms'
 wenzelm parents: 
11720diff
changeset | 922 | (Syntax.extend_const_gram prmode consts syn, tsig, | 
| 4489 | 923 | Symtab.extend (ctab, decls) | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 924 | handle Symtab.DUPS cs => err_dup_consts cs, | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 925 | (path, add_names spaces constK (map fst decls)), data) | 
| 386 | 926 | end; | 
| 927 | ||
| 4007 | 928 | fun ext_consts_i sg = ext_cnsts no_read false ("", true) sg;
 | 
| 929 | fun ext_consts sg = ext_cnsts read_const false ("", true) sg;
 | |
| 930 | fun ext_syntax_i sg = ext_cnsts no_read true ("", true) sg;
 | |
| 931 | fun ext_syntax sg = ext_cnsts read_const true ("", true) sg;
 | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 932 | fun ext_modesyntax_i sg (prmode, consts) = ext_cnsts no_read true prmode sg consts; | 
| 2197 | 933 | fun ext_modesyntax sg (prmode, consts) = ext_cnsts read_const true prmode sg consts; | 
| 386 | 934 | |
| 935 | ||
| 936 | (* add type classes *) | |
| 937 | ||
| 938 | fun const_of_class c = c ^ "_class"; | |
| 939 | ||
| 940 | fun class_of_const c_class = | |
| 941 | let | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 942 | val c = implode (take (size c_class - size "_class", explode c_class)); | 
| 386 | 943 | in | 
| 944 | if const_of_class c = c_class then c | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 945 |     else raise TERM ("class_of_const: bad name " ^ quote c_class, [])
 | 
| 386 | 946 | end; | 
| 947 | ||
| 948 | ||
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 949 | fun ext_classes int (syn, tsig, ctab, (path, spaces), data) classes = | 
| 386 | 950 | let | 
| 562 | 951 | val names = map fst classes; | 
| 386 | 952 | val consts = | 
| 953 | map (fn c => (const_of_class c, a_itselfT --> propT, NoSyn)) names; | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 954 | |
| 3810 | 955 | val full_names = map (full path) names; | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 956 | val spaces' = add_names spaces classK full_names; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 957 | val intrn = if int then map (intrn_class spaces') else I; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 958 | val classes' = | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 959 | ListPair.map (fn (c, (_, cs)) => (c, intrn cs)) (full_names, classes); | 
| 386 | 960 | in | 
| 961 | ext_consts_i | |
| 12068 
469f372d63db
added pretty_term', read_typ', read_typ_no_norm', read_def_terms'
 wenzelm parents: 
11720diff
changeset | 962 | (Syntax.extend_consts names syn, | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 963 | Type.ext_tsig_classes tsig classes', ctab, (path, spaces'), data) | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 964 | consts | 
| 386 | 965 | end; | 
| 966 | ||
| 967 | ||
| 2963 | 968 | (* add to classrel *) | 
| 421 | 969 | |
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 970 | fun ext_classrel int (syn, tsig, ctab, (path, spaces), data) pairs = | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 971 | let val intrn = if int then map (pairself (intrn_class spaces)) else I in | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 972 | (syn, Type.ext_tsig_classrel tsig (intrn pairs), ctab, (path, spaces), data) | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 973 | end; | 
| 421 | 974 | |
| 975 | ||
| 4619 | 976 | (* add translation rules *) | 
| 977 | ||
| 978 | fun ext_trrules (syn, tsig, ctab, (path, spaces), data) args = | |
| 12068 
469f372d63db
added pretty_term', read_typ', read_typ_no_norm', read_def_terms'
 wenzelm parents: 
11720diff
changeset | 979 | (syn |> Syntax.extend_trrules | 
| 4619 | 980 | (map (Syntax.map_trrule (fn (root, str) => (intrn spaces typeK root, str))) args), | 
| 981 | tsig, ctab, (path, spaces), data); | |
| 982 | ||
| 983 | ||
| 1159 | 984 | (* add to syntax *) | 
| 386 | 985 | |
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 986 | fun ext_syn extfun (syn, tsig, ctab, names, data) args = | 
| 12068 
469f372d63db
added pretty_term', read_typ', read_typ_no_norm', read_def_terms'
 wenzelm parents: 
11720diff
changeset | 987 | (extfun args syn, tsig, ctab, names, data); | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 988 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 989 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 990 | (* add to path *) | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 991 | |
| 4844 | 992 | fun ext_path (syn, tsig, ctab, (path, spaces), data) elems = | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 993 | let | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 994 | val path' = | 
| 11501 | 995 | if elems = "//" then None | 
| 996 | else if elems = "/" then Some [] | |
| 997 | else if elems = ".." andalso is_some path andalso path <> Some [] then | |
| 998 | Some (fst (split_last (the path))) | |
| 999 | else Some (if_none path [] @ NameSpace.unpack elems); | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 1000 | in | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 1001 | (syn, tsig, ctab, (path', spaces), data) | 
| 10404 | 1002 | end; | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 1003 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 1004 | |
| 8725 | 1005 | (* change name space *) | 
| 1006 | ||
| 1007 | fun ext_add_space (syn, tsig, ctab, (path, spaces), data) (kind, names) = | |
| 1008 | (syn, tsig, ctab, (path, add_names spaces kind names), data); | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 1009 | |
| 12588 | 1010 | fun ext_hide_space (syn, tsig, ctab, (path, spaces), data) (b, (kind, xnames)) = | 
| 1011 | (syn, tsig, ctab, (path, hide_names b spaces kind (map (intrn spaces kind) xnames)), data); | |
| 8725 | 1012 | |
| 12588 | 1013 | fun ext_hide_space_i (syn, tsig, ctab, (path, spaces), data) (b, (kind, names)) = | 
| 1014 | (syn, tsig, ctab, (path, hide_names b spaces kind names), data); | |
| 386 | 1015 | |
| 1016 | ||
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 1017 | (* signature data *) | 
| 386 | 1018 | |
| 12310 | 1019 | fun ext_init_data sg (syn, tsig, ctab, names, data) (kind, (e, cp, ext, mrg, prt)) = | 
| 1020 | (syn, tsig, ctab, names, init_data_sg sg data kind e cp ext mrg prt); | |
| 386 | 1021 | |
| 4998 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 1022 | fun ext_put_data sg (syn, tsig, ctab, names, data) (kind, f, x) = | 
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 1023 | (syn, tsig, ctab, names, put_data_sg sg data kind f x); | 
| 386 | 1024 | |
| 1025 | ||
| 12310 | 1026 | fun copy_data (k, (e, mths as (cp, _, _, _))) = | 
| 6961 | 1027 | (k, (cp e handle exn => err_method "copy" (Object.name_of_kind k) exn, mths)); | 
| 6546 | 1028 | |
| 1029 | fun copy (sg as Sg ({id = _, stamps}, {self, tsig, const_tab, syn, path, spaces, data})) =
 | |
| 1030 | let | |
| 1031 | val _ = check_stale sg; | |
| 1032 | val self' = SgRef (Some (ref sg)); | |
| 1033 | val Data tab = data; | |
| 1034 | val data' = Data (Symtab.map copy_data tab); | |
| 1035 | in create_sign self' stamps "#" (syn, tsig, const_tab, (path, spaces), data') end; | |
| 1036 | ||
| 1037 | ||
| 386 | 1038 | (* the external interfaces *) | 
| 1039 | ||
| 4998 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 1040 | val add_classes = extend_sign true (ext_classes true) "#"; | 
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 1041 | val add_classes_i = extend_sign true (ext_classes false) "#"; | 
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 1042 | val add_classrel = extend_sign true (ext_classrel true) "#"; | 
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 1043 | val add_classrel_i = extend_sign true (ext_classrel false) "#"; | 
| 8898 | 1044 | val add_defsort = extend_sign true ext_defsort "#"; | 
| 1045 | val add_defsort_i = extend_sign true ext_defsort_i "#"; | |
| 4998 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 1046 | val add_types = extend_sign true ext_types "#"; | 
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 1047 | val add_nonterminals = extend_sign true ext_nonterminals "#"; | 
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 1048 | val add_tyabbrs = extend_sign true ext_tyabbrs "#"; | 
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 1049 | val add_tyabbrs_i = extend_sign true ext_tyabbrs_i "#"; | 
| 8898 | 1050 | val add_arities = extend_sign true ext_arities "#"; | 
| 1051 | val add_arities_i = extend_sign true ext_arities_i "#"; | |
| 4998 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 1052 | val add_consts = extend_sign true ext_consts "#"; | 
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 1053 | val add_consts_i = extend_sign true ext_consts_i "#"; | 
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 1054 | val add_syntax = extend_sign true ext_syntax "#"; | 
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 1055 | val add_syntax_i = extend_sign true ext_syntax_i "#"; | 
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 1056 | val add_modesyntax = extend_sign true ext_modesyntax "#"; | 
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 1057 | val add_modesyntax_i = extend_sign true ext_modesyntax_i "#"; | 
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 1058 | val add_trfuns = extend_sign true (ext_syn Syntax.extend_trfuns) "#"; | 
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 1059 | val add_trfunsT = extend_sign true (ext_syn Syntax.extend_trfunsT) "#"; | 
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 1060 | val add_tokentrfuns = extend_sign true (ext_syn Syntax.extend_tokentrfuns) "#"; | 
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 1061 | val add_trrules = extend_sign true ext_trrules "#"; | 
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 1062 | val add_trrules_i = extend_sign true (ext_syn Syntax.extend_trrules_i) "#"; | 
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 1063 | val add_path = extend_sign true ext_path "#"; | 
| 8725 | 1064 | val add_space = extend_sign true ext_add_space "#"; | 
| 12588 | 1065 | val hide_space = curry (extend_sign true ext_hide_space "#"); | 
| 1066 | val hide_space_i = curry (extend_sign true ext_hide_space_i "#"); | |
| 4998 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 1067 | fun init_data arg sg = extend_sign true (ext_init_data sg) "#" arg sg; | 
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 1068 | fun put_data k f x sg = extend_sign true (ext_put_data sg) "#" (k, f, x) sg; | 
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 1069 | fun add_name name sg = extend_sign true K name () sg; | 
| 
28fe46a570d7
improved data: secure version using Object.T and Object.kind;
 wenzelm parents: 
4961diff
changeset | 1070 | fun prep_ext sg = extend_sign false K "#" () sg; | 
| 386 | 1071 | |
| 1072 | ||
| 3867 | 1073 | |
| 10404 | 1074 | (** merge signatures **) (*exception TERM*) | 
| 3867 | 1075 | |
| 4228 
22e3f0368c85
merge_refs: check for different versions of theories;
 wenzelm parents: 
4227diff
changeset | 1076 | (* merge_stamps *) | 
| 
22e3f0368c85
merge_refs: check for different versions of theories;
 wenzelm parents: 
4227diff
changeset | 1077 | |
| 
22e3f0368c85
merge_refs: check for different versions of theories;
 wenzelm parents: 
4227diff
changeset | 1078 | fun merge_stamps stamps1 stamps2 = | 
| 12296 | 1079 | let val stamps = merge_lists' stamps1 stamps2 in | 
| 4228 
22e3f0368c85
merge_refs: check for different versions of theories;
 wenzelm parents: 
4227diff
changeset | 1080 | (case duplicates (map ! stamps) of | 
| 
22e3f0368c85
merge_refs: check for different versions of theories;
 wenzelm parents: 
4227diff
changeset | 1081 | [] => stamps | 
| 
22e3f0368c85
merge_refs: check for different versions of theories;
 wenzelm parents: 
4227diff
changeset | 1082 |     | dups => raise TERM ("Attempt to merge different versions of theories "
 | 
| 
22e3f0368c85
merge_refs: check for different versions of theories;
 wenzelm parents: 
4227diff
changeset | 1083 | ^ commas_quote dups, [])) | 
| 
22e3f0368c85
merge_refs: check for different versions of theories;
 wenzelm parents: 
4227diff
changeset | 1084 | end; | 
| 
22e3f0368c85
merge_refs: check for different versions of theories;
 wenzelm parents: 
4227diff
changeset | 1085 | |
| 
22e3f0368c85
merge_refs: check for different versions of theories;
 wenzelm parents: 
4227diff
changeset | 1086 | |
| 4627 | 1087 | (* implicit merge -- trivial only *) | 
| 3877 | 1088 | |
| 4228 
22e3f0368c85
merge_refs: check for different versions of theories;
 wenzelm parents: 
4227diff
changeset | 1089 | fun merge_refs (sgr1 as SgRef (Some (ref (sg1 as Sg ({stamps = s1, ...}, _)))),
 | 
| 
22e3f0368c85
merge_refs: check for different versions of theories;
 wenzelm parents: 
4227diff
changeset | 1090 |         sgr2 as SgRef (Some (ref (sg2 as Sg ({stamps = s2, ...}, _))))) =
 | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 1091 | if fast_subsig (sg2, sg1) then sgr1 | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 1092 | else if fast_subsig (sg1, sg2) then sgr2 | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 1093 | else if subsig (sg2, sg1) then sgr1 | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 1094 | else if subsig (sg1, sg2) then sgr2 | 
| 4228 
22e3f0368c85
merge_refs: check for different versions of theories;
 wenzelm parents: 
4227diff
changeset | 1095 | else (merge_stamps s1 s2; (*check for different versions*) | 
| 
22e3f0368c85
merge_refs: check for different versions of theories;
 wenzelm parents: 
4227diff
changeset | 1096 |         raise TERM ("Attempt to do non-trivial merge of signatures", []))
 | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 1097 | | merge_refs _ = sys_error "Sign.merge_refs"; | 
| 3867 | 1098 | |
| 4627 | 1099 | val merge = deref o merge_refs o pairself self_ref; | 
| 1100 | ||
| 3867 | 1101 | |
| 10404 | 1102 | (* proper merge *) (*exception TERM/ERROR*) | 
| 143 | 1103 | |
| 10932 | 1104 | val PureN = "Pure"; | 
| 1105 | val CPureN = "CPure"; | |
| 1106 | ||
| 6961 | 1107 | fun nontriv_merge (sg1, sg2) = | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 1108 | if subsig (sg2, sg1) then sg1 | 
| 251 | 1109 | else if subsig (sg1, sg2) then sg2 | 
| 386 | 1110 | else if is_draft sg1 orelse is_draft sg2 then | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 1111 |     raise TERM ("Attempt to merge draft signatures", [])
 | 
| 10932 | 1112 | else if exists_stamp PureN sg1 andalso exists_stamp CPureN sg2 orelse | 
| 1113 | exists_stamp CPureN sg1 andalso exists_stamp PureN sg2 then | |
| 1114 |     raise TERM ("Cannot merge Pure and CPure signatures", [])
 | |
| 251 | 1115 | else | 
| 1116 | (*neither is union already; must form union*) | |
| 1117 | let | |
| 3975 | 1118 |       val Sg ({id = _, stamps = stamps1}, {self = _, tsig = tsig1, const_tab = const_tab1,
 | 
| 1119 | syn = syn1, path = _, spaces = spaces1, data = data1}) = sg1; | |
| 1120 |       val Sg ({id = _, stamps = stamps2}, {self = _, tsig = tsig2, const_tab = const_tab2,
 | |
| 1121 | syn = syn2, path = _, spaces = spaces2, data = data2}) = sg2; | |
| 386 | 1122 | |
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 1123 | val id = ref ""; | 
| 3975 | 1124 | val self_ref = ref sg1; (*dummy value*) | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 1125 | val self = SgRef (Some self_ref); | 
| 402 | 1126 | |
| 4228 
22e3f0368c85
merge_refs: check for different versions of theories;
 wenzelm parents: 
4227diff
changeset | 1127 | val stamps = merge_stamps stamps1 stamps2; | 
| 2185 | 1128 | val tsig = Type.merge_tsigs (tsig1, tsig2); | 
| 251 | 1129 | val const_tab = Symtab.merge (op =) (const_tab1, const_tab2) | 
| 386 | 1130 | handle Symtab.DUPS cs => | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 1131 |           raise TERM ("Incompatible types for constant(s) " ^ commas_quote cs, []);
 | 
| 386 | 1132 | val syn = Syntax.merge_syntaxes syn1 syn2; | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 1133 | |
| 11501 | 1134 | val path = Some []; | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 1135 | val kinds = distinct (map fst (spaces1 @ spaces2)); | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 1136 | val spaces = | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 1137 | kinds ~~ | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 1138 | ListPair.map NameSpace.merge | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 1139 | (map (space_of spaces1) kinds, map (space_of spaces2) kinds); | 
| 3867 | 1140 | |
| 4256 | 1141 | val data = merge_data (data1, data2); | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 1142 | |
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 1143 | val sign = make_sign (id, self, tsig, const_tab, syn, path, spaces, data, stamps); | 
| 251 | 1144 | in | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 1145 | self_ref := sign; sign | 
| 251 | 1146 | end; | 
| 143 | 1147 | |
| 0 | 1148 | |
| 1149 | ||
| 3995 | 1150 | (** partial Pure signature **) | 
| 0 | 1151 | |
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 1152 | val dummy_sg = make_sign (ref "", SgRef None, Type.tsig0, | 
| 11501 | 1153 | Symtab.empty, Syntax.pure_syn, Some [], [], empty_data, []); | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 1154 | |
| 3995 | 1155 | val pre_pure = | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 1156 | create_sign (SgRef (Some (ref dummy_sg))) [] "#" | 
| 11501 | 1157 | (Syntax.pure_syn, Type.tsig0, Symtab.empty, (Some [], []), empty_data); | 
| 0 | 1158 | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 1159 | |
| 0 | 1160 | end; |