| author | wenzelm | 
| Fri, 24 Oct 1997 17:14:02 +0200 | |
| changeset 3992 | 8b87ba92f7a1 | 
| parent 3975 | ddeb5a0fd08d | 
| child 3995 | 88fc1015d241 | 
| permissions | -rw-r--r-- | 
| 19 | 1 | (* Title: Pure/sign.ML | 
| 0 | 2 | ID: $Id$ | 
| 251 | 3 | Author: Lawrence C Paulson and Markus Wenzel | 
| 0 | 4 | |
| 251 | 5 | The abstract type "sg" of signatures. | 
| 0 | 6 | *) | 
| 7 | ||
| 3956 | 8 | (*base names*) | 
| 9 | type bstring = string; | |
| 10 | type bclass = class; | |
| 11 | (*external forms -- partially qualified names*) | |
| 3805 | 12 | type xstring = string; | 
| 13 | type xclass = class; | |
| 14 | type xsort = sort; | |
| 15 | type xtyp = typ; | |
| 16 | type xterm = term; | |
| 17 | ||
| 19 | 18 | signature SIGN = | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 19 | sig | 
| 1501 | 20 | type sg | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 21 | type sg_ref | 
| 2197 | 22 | val rep_sg: sg -> | 
| 3975 | 23 |    {self: sg_ref,
 | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 24 | tsig: Type.type_sig, | 
| 2197 | 25 | const_tab: typ Symtab.table, | 
| 26 | syn: Syntax.syntax, | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 27 | path: string list, | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 28 | spaces: (string * NameSpace.T) list, | 
| 3975 | 29 | data: Data.T} | 
| 30 | val name_of: sg -> string | |
| 31 | val stamp_names_of: sg -> string list | |
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 32 | val tsig_of: sg -> Type.type_sig | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 33 | val deref: sg_ref -> sg | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 34 | val self_ref: sg -> sg_ref | 
| 1501 | 35 | val subsig: sg * sg -> bool | 
| 36 | val eq_sg: sg * sg -> bool | |
| 37 | val same_sg: sg * sg -> bool | |
| 38 | val is_draft: sg -> bool | |
| 39 | val const_type: sg -> string -> typ option | |
| 40 | val classes: sg -> class list | |
| 41 | val subsort: sg -> sort * sort -> bool | |
| 42 | val nodup_Vars: term -> unit | |
| 43 | val norm_sort: sg -> sort -> sort | |
| 44 | val nonempty_sort: sg -> sort list -> sort -> bool | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 45 | val long_names: bool ref | 
| 3810 | 46 | val classK: string | 
| 47 | val typeK: string | |
| 48 | val constK: string | |
| 3956 | 49 | val full_name: sg -> bstring -> string | 
| 50 | val base_name: string -> bstring | |
| 3810 | 51 | val intern: sg -> string -> xstring -> string | 
| 52 | val extern: sg -> string -> string -> xstring | |
| 3937 | 53 | val cond_extern: sg -> string -> string -> xstring | 
| 3805 | 54 | val intern_class: sg -> xclass -> class | 
| 55 | val intern_tycon: sg -> xstring -> string | |
| 56 | val intern_const: sg -> xstring -> string | |
| 3937 | 57 | val intern_sort: sg -> xsort -> sort | 
| 58 | val intern_typ: sg -> xtyp -> typ | |
| 59 | val intern_term: sg -> xterm -> term | |
| 60 | val intern_tycons: sg -> xtyp -> typ | |
| 1501 | 61 | val print_sg: sg -> unit | 
| 62 | val pretty_sg: sg -> Pretty.T | |
| 63 | val pprint_sg: sg -> pprint_args -> unit | |
| 64 | val pretty_term: sg -> term -> Pretty.T | |
| 65 | val pretty_typ: sg -> typ -> Pretty.T | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 66 | val pretty_sort: sg -> sort -> Pretty.T | 
| 1501 | 67 | val string_of_term: sg -> term -> string | 
| 68 | val string_of_typ: sg -> typ -> string | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 69 | val string_of_sort: sg -> sort -> string | 
| 3855 | 70 | val str_of_sort: sg -> sort -> string | 
| 71 | val str_of_classrel: sg -> class * class -> string | |
| 72 | val str_of_arity: sg -> string * sort list * sort -> string | |
| 1501 | 73 | val pprint_term: sg -> term -> pprint_args -> unit | 
| 74 | val pprint_typ: sg -> typ -> pprint_args -> unit | |
| 75 | val certify_typ: sg -> typ -> typ | |
| 76 | val certify_term: sg -> term -> term * typ * int | |
| 77 | val read_typ: sg * (indexname -> sort option) -> string -> typ | |
| 78 | val infer_types: sg -> (indexname -> typ option) -> | |
| 79 | (indexname -> sort option) -> string list -> bool | |
| 3805 | 80 | -> xterm list * typ -> int * term * (indexname * typ) list | 
| 3956 | 81 | val add_classes: (bclass * xclass list) list -> sg -> sg | 
| 82 | val add_classes_i: (bclass * class list) list -> sg -> sg | |
| 3805 | 83 | val add_classrel: (xclass * xclass) list -> sg -> sg | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 84 | val add_classrel_i: (class * class) list -> sg -> sg | 
| 3805 | 85 | val add_defsort: xsort -> sg -> sg | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 86 | val add_defsort_i: sort -> sg -> sg | 
| 3956 | 87 | val add_types: (bstring * int * mixfix) list -> sg -> sg | 
| 88 | val add_tyabbrs: (bstring * string list * string * mixfix) list -> sg -> sg | |
| 89 | val add_tyabbrs_i: (bstring * string list * typ * mixfix) list -> sg -> sg | |
| 3805 | 90 | val add_arities: (xstring * xsort list * xsort) list -> sg -> sg | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 91 | val add_arities_i: (string * sort list * sort) list -> sg -> sg | 
| 3956 | 92 | val add_consts: (bstring * string * mixfix) list -> sg -> sg | 
| 93 | val add_consts_i: (bstring * typ * mixfix) list -> sg -> sg | |
| 94 | val add_syntax: (bstring * string * mixfix) list -> sg -> sg | |
| 95 | val add_syntax_i: (bstring * typ * mixfix) list -> sg -> sg | |
| 96 | val add_modesyntax: (string * bool) * (bstring * string * mixfix) list -> sg -> sg | |
| 97 | val add_modesyntax_i: (string * bool) * (bstring * typ * mixfix) list -> sg -> sg | |
| 1501 | 98 | val add_trfuns: | 
| 3956 | 99 | (bstring * (ast list -> ast)) list * | 
| 100 | (bstring * (term list -> term)) list * | |
| 101 | (bstring * (term list -> term)) list * | |
| 102 | (bstring * (ast list -> ast)) list -> sg -> sg | |
| 2385 | 103 | val add_trfunsT: | 
| 3956 | 104 | (bstring * (typ -> term list -> term)) list -> sg -> sg | 
| 2693 | 105 | val add_tokentrfuns: | 
| 106 | (string * string * (string -> string * int)) list -> sg -> sg | |
| 1810 
0eef167ebe1b
Translation infixes <->, etc., no longer available at top-level
 paulson parents: 
1580diff
changeset | 107 | val add_trrules: (string * string) Syntax.trrule list -> sg -> sg | 
| 
0eef167ebe1b
Translation infixes <->, etc., no longer available at top-level
 paulson parents: 
1580diff
changeset | 108 | val add_trrules_i: ast Syntax.trrule list -> sg -> sg | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 109 | val add_path: string -> sg -> sg | 
| 3810 | 110 | val add_space: string * string list -> sg -> sg | 
| 1501 | 111 | val add_name: string -> sg -> sg | 
| 3877 | 112 | val init_data: string * exn * (exn -> exn) * (exn * exn -> exn) * | 
| 113 | (string -> exn -> unit) -> sg -> sg | |
| 3867 | 114 | val get_data: sg -> string -> exn | 
| 115 | val put_data: string * exn -> sg -> sg | |
| 3877 | 116 | val print_data: sg -> string -> unit | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 117 | val merge_refs: sg_ref * sg_ref -> sg_ref | 
| 3975 | 118 | val prep_ext: sg -> sg | 
| 1501 | 119 | val merge: sg * sg -> sg | 
| 120 | val proto_pure: sg | |
| 121 | val pure: sg | |
| 122 | val cpure: sg | |
| 123 | val const_of_class: class -> string | |
| 124 | val class_of_const: string -> class | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 125 | end; | 
| 0 | 126 | |
| 1501 | 127 | structure Sign : SIGN = | 
| 143 | 128 | struct | 
| 0 | 129 | |
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 130 | |
| 251 | 131 | (** datatype sg **) | 
| 132 | ||
| 19 | 133 | datatype sg = | 
| 3975 | 134 | Sg of | 
| 135 |    {id: string ref,                             (*id*)
 | |
| 136 | stamps: string ref list} * (*unique theory indentifier*) | |
| 137 |    {self: sg_ref,                               (*mutable self reference*)
 | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 138 | tsig: Type.type_sig, (*order-sorted signature of types*) | 
| 3805 | 139 | const_tab: typ Symtab.table, (*type schemes of constants*) | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 140 | syn: Syntax.syntax, (*syntax for parsing and printing*) | 
| 3975 | 141 | path: string list, (*current name space entry prefix*) | 
| 142 | spaces: (string * NameSpace.T) list, (*name spaces for consts, types etc.*) | |
| 143 | data: Data.T} (*additional data*) | |
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 144 | and sg_ref = | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 145 | SgRef of sg ref option; | 
| 0 | 146 | |
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 147 | (*make signature*) | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 148 | fun make_sign (id, self, tsig, const_tab, syn, path, spaces, data, stamps) = | 
| 3975 | 149 |   Sg ({id = id, stamps = stamps}, {self = self, tsig = tsig, const_tab = const_tab,
 | 
| 150 | syn = syn, path = path, spaces = spaces, data = data}); | |
| 151 | ||
| 152 | ||
| 153 | (* basic components *) | |
| 154 | ||
| 155 | fun rep_sg (Sg (_, args)) = args; | |
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 156 | |
| 3975 | 157 | (*show stamps*) | 
| 158 | fun stamp_names_of (Sg ({stamps, ...}, _)) = rev (map ! stamps);
 | |
| 159 | fun pretty_sg sg = Pretty.str_list "{" "}" (stamp_names_of sg);
 | |
| 160 | val str_of_sg = Pretty.str_of o pretty_sg; | |
| 161 | val pprint_sg = Pretty.pprint o pretty_sg; | |
| 162 | ||
| 163 | ||
| 402 | 164 | val tsig_of = #tsig o rep_sg; | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 165 | val self_ref = #self o rep_sg; | 
| 3975 | 166 | val get_data = Data.get o #data o rep_sg; | 
| 167 | val print_data = Data.print o #data o rep_sg; | |
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 168 | |
| 3975 | 169 | fun const_type (Sg (_, {const_tab, ...})) c = Symtab.lookup (const_tab, c);
 | 
| 170 | val classes = #classes o Type.rep_tsig o tsig_of; | |
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 171 | |
| 3975 | 172 | val subsort = Type.subsort o tsig_of; | 
| 173 | val norm_sort = Type.norm_sort o tsig_of; | |
| 174 | val nonempty_sort = Type.nonempty_sort o tsig_of; | |
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 175 | |
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 176 | |
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 177 | (* signature id *) | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 178 | |
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 179 | fun deref (SgRef (Some (ref sg))) = sg | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 180 | | deref (SgRef None) = sys_error "Sign.deref"; | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 181 | |
| 3975 | 182 | fun check_stale (sg as Sg ({id, ...},
 | 
| 183 |         {self = SgRef (Some (ref (Sg ({id = id', ...}, _)))), ...})) =
 | |
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 184 | if id = id' then sg | 
| 3975 | 185 |       else raise TERM ("Stale signature: " ^ str_of_sg sg, [])
 | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 186 | | check_stale _ = sys_error "Sign.check_stale"; | 
| 0 | 187 | |
| 3975 | 188 | fun name_of (sg as Sg ({id = ref name, ...}, _)) =
 | 
| 189 | if name = "" orelse name = "#" then | |
| 190 |     raise TERM ("Nameless signature " ^ str_of_sg sg, [])
 | |
| 191 | else name; | |
| 192 | ||
| 206 
0d624d1ba9cc
added subsig: sg * sg -> bool to test if one signature is contained in another.
 nipkow parents: 
200diff
changeset | 193 | |
| 2979 | 194 | (* inclusion and equality *) | 
| 2180 
934572a94139
Removal of polymorphic equality via mem, subset, eq_set, etc
 paulson parents: 
2144diff
changeset | 195 | |
| 2185 | 196 | local | 
| 197 | (*avoiding polymorphic equality: factor 10 speedup*) | |
| 198 | fun mem_stamp (_:string ref, []) = false | |
| 199 | | mem_stamp (x, y :: ys) = x = y orelse mem_stamp (x, ys); | |
| 200 | ||
| 201 | fun subset_stamp ([], ys) = true | |
| 202 | | subset_stamp (x :: xs, ys) = | |
| 203 | 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 | 204 | |
| 2185 | 205 | (*fast partial test*) | 
| 206 | fun fast_sub ([]: string ref list, _) = true | |
| 207 | | fast_sub (_, []) = false | |
| 208 | | fast_sub (x :: xs, y :: ys) = | |
| 209 | if x = y then fast_sub (xs, ys) | |
| 210 | else fast_sub (x :: xs, ys); | |
| 211 | in | |
| 3975 | 212 |   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 | 213 | (check_stale sg1; check_stale sg2; id1 = id2); | 
| 2185 | 214 | |
| 3975 | 215 |   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 | 216 | 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 | 217 | |
| 3975 | 218 |   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 | 219 | eq_sg (sg1, sg2) orelse fast_sub (s1, s2); | 
| 2185 | 220 | end; | 
| 221 | ||
| 402 | 222 | |
| 2185 | 223 | (*test if same theory names are contained in signatures' stamps, | 
| 224 | i.e. if signatures belong to same theory but not necessarily to the | |
| 225 | same version of it*) | |
| 3975 | 226 | 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 | 227 | eq_sg (sg1, sg2) orelse eq_set_string (pairself (map (op !)) (s1, s2)); | 
| 2185 | 228 | |
| 229 | (*test for drafts*) | |
| 3975 | 230 | fun is_draft (Sg ({stamps = ref "#" :: _, ...}, _)) = true
 | 
| 386 | 231 | | is_draft _ = false; | 
| 232 | ||
| 0 | 233 | |
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 234 | (* build signature *) | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 235 | |
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 236 | fun ext_stamps stamps (id as ref name) = | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 237 | 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 | 238 | if exists (equal name o !) stmps then | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 239 |       error ("Theory already contains a " ^ quote name ^ " component")
 | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 240 | else id :: stmps | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 241 | end; | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 242 | |
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 243 | 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 | 244 | let | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 245 | val id = ref name; | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 246 | val sign = | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 247 | 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 | 248 | in | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 249 | (case self of | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 250 | SgRef (Some r) => r := sign | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 251 | | _ => sys_error "Sign.create_sign"); | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 252 | sign | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 253 | end; | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 254 | |
| 3975 | 255 | fun extend_sign keep extfun name decls | 
| 256 |     (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 | 257 | let | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 258 | val _ = check_stale sg; | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 259 | val (self', data') = | 
| 3975 | 260 | if is_draft sg andalso keep then (self, data) | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 261 | else (SgRef (Some (ref sg)), Data.prep_ext data); | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 262 | in | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 263 | create_sign self' stamps name | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 264 | (extfun (syn, tsig, const_tab, (path, spaces), data') decls) | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 265 | end; | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 266 | |
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 267 | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 268 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 269 | (** name spaces **) | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 270 | |
| 3805 | 271 | (*prune names on output by default*) | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 272 | val long_names = ref false; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 273 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 274 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 275 | (* kinds *) | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 276 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 277 | val classK = "class"; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 278 | val typeK = "type"; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 279 | val constK = "const"; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 280 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 281 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 282 | (* add and retrieve names *) | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 283 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 284 | fun space_of spaces kind = | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 285 | if_none (assoc (spaces, kind)) NameSpace.empty; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 286 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 287 | (*input and output of qualified names*) | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 288 | fun intrn spaces kind = NameSpace.lookup (space_of spaces kind); | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 289 | fun extrn spaces kind = NameSpace.prune (space_of spaces kind); | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 290 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 291 | (*add names*) | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 292 | fun add_names spaces kind names = | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 293 | let val space' = NameSpace.extend (names, space_of spaces kind) in | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 294 | overwrite (spaces, (kind, space')) | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 295 | end; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 296 | |
| 3810 | 297 | (*make full names*) | 
| 3937 | 298 | fun full path name = | 
| 299 | if NameSpace.qualified name then | |
| 300 |     error ("Attempt to declare qualified name " ^ quote name)
 | |
| 301 | else NameSpace.pack (path @ [name]); | |
| 302 | ||
| 303 | (*base name*) | |
| 304 | val base_name = NameSpace.base; | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 305 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 306 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 307 | (* intern / extern names *) | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 308 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 309 | local | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 310 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 311 | fun add_typ_classes (Type (_, Ts), cs) = foldr add_typ_classes (Ts, cs) | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 312 | | add_typ_classes (TFree (_, S), cs) = S union cs | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 313 | | add_typ_classes (TVar (_, S), cs) = S union cs; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 314 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 315 | fun add_typ_tycons (Type (c, Ts), cs) = foldr add_typ_tycons (Ts, c ins cs) | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 316 | | add_typ_tycons (_, cs) = cs; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 317 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 318 | val add_term_classes = it_term_types add_typ_classes; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 319 | val add_term_tycons = it_term_types add_typ_tycons; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 320 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 321 | fun add_term_consts (Const (c, _), cs) = c ins cs | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 322 | | add_term_consts (t $ u, cs) = add_term_consts (t, add_term_consts (u, cs)) | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 323 | | add_term_consts (Abs (_, _, t), cs) = add_term_consts (t, cs) | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 324 | | add_term_consts (_, cs) = cs; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 325 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 326 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 327 | (*map classes, tycons*) | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 328 | fun map_typ f g (Type (c, Ts)) = Type (g c, map (map_typ f g) Ts) | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 329 | | map_typ f _ (TFree (x, S)) = TFree (x, map f S) | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 330 | | map_typ f _ (TVar (xi, S)) = TVar (xi, map f S); | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 331 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 332 | (*map classes, tycons, consts*) | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 333 | fun map_term f g h (Const (c, T)) = Const (h c, map_typ f g T) | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 334 | | map_term f g _ (Free (x, T)) = Free (x, map_typ f g T) | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 335 | | map_term f g _ (Var (xi, T)) = Var (xi, map_typ f g T) | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 336 | | map_term _ _ _ (t as Bound _) = t | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 337 | | map_term f g h (Abs (x, T, t)) = Abs (x, map_typ f g T, map_term f g h t) | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 338 | | map_term f g h (t $ u) = map_term f g h t $ map_term f g h u; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 339 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 340 | (*prepare mapping of names*) | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 341 | fun mapping f add_xs t = | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 342 | let | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 343 | 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 | 344 | val table = mapfilter f' (add_xs (t, [])); | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 345 | fun lookup x = if_none (assoc (table, x)) x; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 346 | in lookup end; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 347 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 348 | (*intern / extern typ*) | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 349 | fun trn_typ trn T = | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 350 | T |> map_typ | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 351 | (mapping (trn classK) add_typ_classes T) | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 352 | (mapping (trn typeK) add_typ_tycons T); | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 353 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 354 | (*intern / extern term*) | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 355 | fun trn_term trn t = | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 356 | t |> map_term | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 357 | (mapping (trn classK) add_term_classes t) | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 358 | (mapping (trn typeK) add_term_tycons t) | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 359 | (mapping (trn constK) add_term_consts t); | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 360 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 361 | |
| 3975 | 362 | val spaces_of = #spaces o rep_sg; | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 363 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 364 | in | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 365 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 366 | fun intrn_class spaces = intrn spaces classK; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 367 | fun extrn_class spaces = extrn spaces classK; | 
| 3937 | 368 | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 369 | val intrn_sort = map o intrn_class; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 370 | val intrn_typ = trn_typ o intrn; | 
| 3937 | 371 | val intrn_term = trn_term o intrn; | 
| 372 | ||
| 373 | val extrn_sort = map o extrn_class; | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 374 | val extrn_typ = trn_typ o extrn; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 375 | val extrn_term = trn_term o extrn; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 376 | |
| 3805 | 377 | fun intrn_tycons spaces T = | 
| 378 | map_typ I (mapping (intrn spaces typeK) add_typ_tycons T) T; | |
| 379 | ||
| 3810 | 380 | val intern = intrn o spaces_of; | 
| 3855 | 381 | val extern = extrn o spaces_of; | 
| 3937 | 382 | fun cond_extern sg kind = if ! long_names then I else extern sg kind; | 
| 383 | ||
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 384 | val intern_class = intrn_class o spaces_of; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 385 | val intern_sort = intrn_sort o spaces_of; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 386 | val intern_typ = intrn_typ o spaces_of; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 387 | val intern_term = intrn_term o spaces_of; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 388 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 389 | fun intern_tycon sg = intrn (spaces_of sg) typeK; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 390 | fun intern_const sg = intrn (spaces_of sg) constK; | 
| 3937 | 391 | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 392 | val intern_tycons = intrn_tycons o spaces_of; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 393 | |
| 3975 | 394 | val full_name = full o #path o rep_sg; | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 395 | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 396 | end; | 
| 620 | 397 | |
| 402 | 398 | |
| 0 | 399 | |
| 3937 | 400 | (** pretty printing of terms and types **) | 
| 401 | ||
| 3975 | 402 | fun pretty_term (sg as Sg (_, {syn, spaces, ...})) t =
 | 
| 3937 | 403 | Syntax.pretty_term syn | 
| 3975 | 404 |     ("CPure" mem_string (stamp_names_of sg))
 | 
| 3937 | 405 | (if ! long_names then t else extrn_term spaces t); | 
| 406 | ||
| 3975 | 407 | fun pretty_typ (Sg (_, {syn, spaces, ...})) T =
 | 
| 3937 | 408 | Syntax.pretty_typ syn | 
| 409 | (if ! long_names then T else extrn_typ spaces T); | |
| 410 | ||
| 3975 | 411 | fun pretty_sort (Sg (_, {syn, spaces, ...})) S =
 | 
| 3937 | 412 | Syntax.pretty_sort syn | 
| 413 | (if ! long_names then S else extrn_sort spaces S); | |
| 414 | ||
| 415 | fun pretty_classrel sg (c1, c2) = Pretty.block | |
| 416 | [pretty_sort sg [c1], Pretty.str " <", Pretty.brk 1, pretty_sort sg [c2]]; | |
| 417 | ||
| 418 | fun pretty_arity sg (t, Ss, S) = | |
| 419 | let | |
| 420 | val t' = cond_extern sg typeK t; | |
| 421 | val dom = | |
| 422 | if null Ss then [] | |
| 423 |       else [Pretty.list "(" ")" (map (pretty_sort sg) Ss), Pretty.brk 1];
 | |
| 424 | in | |
| 425 | Pretty.block | |
| 426 | ([Pretty.str (t' ^ " ::"), Pretty.brk 1] @ dom @ [pretty_sort sg S]) | |
| 427 | end; | |
| 428 | ||
| 429 | fun string_of_term sg t = Pretty.string_of (pretty_term sg t); | |
| 430 | fun string_of_typ sg T = Pretty.string_of (pretty_typ sg T); | |
| 431 | fun string_of_sort sg S = Pretty.string_of (pretty_sort sg S); | |
| 432 | ||
| 433 | fun str_of_sort sg S = Pretty.str_of (pretty_sort sg S); | |
| 434 | fun str_of_classrel sg c1_c2 = Pretty.str_of (pretty_classrel sg c1_c2); | |
| 435 | fun str_of_arity sg ar = Pretty.str_of (pretty_arity sg ar); | |
| 436 | ||
| 437 | fun pprint_term sg = Pretty.pprint o Pretty.quote o (pretty_term sg); | |
| 438 | fun pprint_typ sg = Pretty.pprint o Pretty.quote o (pretty_typ sg); | |
| 439 | ||
| 440 | ||
| 441 | ||
| 251 | 442 | (** print signature **) | 
| 443 | ||
| 444 | fun print_sg sg = | |
| 445 | let | |
| 3937 | 446 | fun prt_cls c = pretty_sort sg [c]; | 
| 447 | fun prt_sort S = pretty_sort sg S; | |
| 448 | fun prt_arity t (c, Ss) = pretty_arity sg (t, Ss, [c]); | |
| 449 | fun prt_typ ty = Pretty.quote (pretty_typ sg ty); | |
| 3975 | 450 | |
| 451 | val ext_class = cond_extern sg classK; | |
| 452 | val ext_tycon = cond_extern sg typeK; | |
| 453 | val ext_const = cond_extern sg constK; | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 454 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 455 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 456 | fun pretty_space (kind, space) = Pretty.block (Pretty.breaks | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 457 | (map Pretty.str (kind ^ ":" :: map quote (NameSpace.dest space)))); | 
| 251 | 458 | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 459 | fun pretty_classes cs = Pretty.block | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 460 | (Pretty.breaks (Pretty.str "classes:" :: map prt_cls cs)); | 
| 251 | 461 | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 462 | fun pretty_classrel (c, cs) = Pretty.block | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 463 | (prt_cls c :: Pretty.str " <" :: Pretty.brk 1 :: | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 464 | Pretty.commas (map prt_cls cs)); | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 465 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 466 | fun pretty_default S = Pretty.block | 
| 3937 | 467 | [Pretty.str "default:", Pretty.brk 1, pretty_sort sg S]; | 
| 251 | 468 | |
| 3937 | 469 | fun pretty_ty (t, n) = Pretty.block | 
| 3975 | 470 |       [Pretty.str (ext_tycon t), Pretty.str (" " ^ string_of_int n)];
 | 
| 251 | 471 | |
| 3937 | 472 | fun pretty_abbr (t, (vs, rhs)) = Pretty.block | 
| 473 | [prt_typ (Type (t, map (fn v => TVar ((v, 0), [])) vs)), | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 474 | Pretty.str " =", Pretty.brk 1, prt_typ rhs]; | 
| 251 | 475 | |
| 3937 | 476 | fun pretty_arities (t, ars) = map (prt_arity t) ars; | 
| 251 | 477 | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 478 | fun pretty_const (c, ty) = Pretty.block | 
| 3975 | 479 | [Pretty.str c, Pretty.str " ::", Pretty.brk 1, prt_typ ty]; | 
| 251 | 480 | |
| 3975 | 481 |     val Sg (_, {self = _, tsig, const_tab, syn = _, path, spaces, data}) = sg;
 | 
| 3810 | 482 | val spaces' = sort (fn ((k1, _), (k2, _)) => k1 < k2) spaces; | 
| 2963 | 483 |     val {classes, classrel, default, tycons, abbrs, arities} =
 | 
| 2185 | 484 | Type.rep_tsig tsig; | 
| 3975 | 485 | val consts = sort_wrt fst (map (apfst ext_const) (Symtab.dest const_tab)); | 
| 251 | 486 | in | 
| 3975 | 487 |     Pretty.writeln (Pretty.strs ("stamps:" :: stamp_names_of sg));
 | 
| 3877 | 488 |     Pretty.writeln (Pretty.strs ("data:" :: Data.kinds data));
 | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 489 | Pretty.writeln (Pretty.strs ["name entry path:", NameSpace.pack path]); | 
| 3810 | 490 | Pretty.writeln (Pretty.big_list "name spaces:" (map pretty_space spaces')); | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 491 | Pretty.writeln (pretty_classes classes); | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 492 | Pretty.writeln (Pretty.big_list "class relation:" (map pretty_classrel classrel)); | 
| 251 | 493 | Pretty.writeln (pretty_default default); | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 494 | Pretty.writeln (Pretty.big_list "type constructors:" (map pretty_ty tycons)); | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 495 | Pretty.writeln (Pretty.big_list "type abbreviations:" (map pretty_abbr abbrs)); | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 496 | Pretty.writeln (Pretty.big_list "type arities:" (flat (map pretty_arities arities))); | 
| 3975 | 497 | Pretty.writeln (Pretty.big_list "consts:" (map pretty_const consts)) | 
| 251 | 498 | end; | 
| 499 | ||
| 500 | ||
| 501 | ||
| 562 | 502 | (** read types **) (*exception ERROR*) | 
| 503 | ||
| 504 | fun err_in_type s = | |
| 505 |   error ("The error(s) above occurred in type " ^ quote s);
 | |
| 506 | ||
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 507 | fun read_raw_typ syn tsig spaces def_sort str = | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 508 | intrn_tycons spaces | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 509 | (Syntax.read_typ syn (Type.get_sort tsig def_sort (intrn_sort spaces)) str | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 510 | handle ERROR => err_in_type str); | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 511 | |
| 562 | 512 | (*read and certify typ wrt a signature*) | 
| 3975 | 513 | fun read_typ (sg as Sg (_, {tsig, syn, spaces, ...}), def_sort) str =
 | 
| 3969 | 514 | (check_stale sg; | 
| 515 | Type.cert_typ tsig (read_raw_typ syn tsig spaces def_sort str) | |
| 516 | handle TYPE (msg, _, _) => (error_msg msg; err_in_type str)); | |
| 562 | 517 | |
| 518 | ||
| 519 | ||
| 386 | 520 | (** certify types and terms **) (*exception TYPE*) | 
| 251 | 521 | |
| 3975 | 522 | val certify_typ = Type.cert_typ o tsig_of; | 
| 251 | 523 | |
| 2979 | 524 | (*check for duplicate TVars with distinct sorts*) | 
| 525 | fun nodup_TVars (tvars, T) = | |
| 526 | (case T of | |
| 527 | Type (_, Ts) => nodup_TVars_list (tvars, Ts) | |
| 528 | | TFree _ => tvars | |
| 529 | | TVar (v as (a, S)) => | |
| 530 | (case assoc_string_int (tvars, a) of | |
| 531 | Some S' => | |
| 532 | if S = S' then tvars | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 533 |           else raise TYPE ("Type variable " ^ Syntax.string_of_vname a ^
 | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 534 | " has two distinct sorts", [TVar (a, S'), T], []) | 
| 2979 | 535 | | None => v :: tvars)) | 
| 536 | (*equivalent to foldl nodup_TVars_list, but 3X faster under Poly/ML*) | |
| 537 | and nodup_TVars_list (tvars, []) = tvars | |
| 538 | | nodup_TVars_list (tvars, T :: Ts) = | |
| 539 | nodup_TVars_list (nodup_TVars (tvars, T), Ts); | |
| 1494 
22f67e796445
added nodup_Vars check in cterm_of. Prevents same var with distinct types.
 nipkow parents: 
1460diff
changeset | 540 | |
| 2979 | 541 | (*check for duplicate Vars with distinct types*) | 
| 1494 
22f67e796445
added nodup_Vars check in cterm_of. Prevents same var with distinct types.
 nipkow parents: 
1460diff
changeset | 542 | fun nodup_Vars tm = | 
| 2979 | 543 | let | 
| 544 | fun nodups vars tvars tm = | |
| 545 | (case tm of | |
| 546 | Const (c, T) => (vars, nodup_TVars (tvars, T)) | |
| 547 | | Free (a, T) => (vars, nodup_TVars (tvars, T)) | |
| 548 | | Var (v as (ixn, T)) => | |
| 549 | (case assoc_string_int (vars, ixn) of | |
| 550 | Some T' => | |
| 551 | if T = T' then (vars, nodup_TVars (tvars, T)) | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 552 |               else raise TYPE ("Variable " ^ Syntax.string_of_vname ixn ^
 | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 553 | " has two distinct types", [T', T], []) | 
| 2979 | 554 | | None => (v :: vars, tvars)) | 
| 555 | | Bound _ => (vars, tvars) | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 556 | | Abs (_, T, t) => nodups vars (nodup_TVars (tvars, T)) t | 
| 2979 | 557 | | s $ t => | 
| 558 | let val (vars',tvars') = nodups vars tvars s in | |
| 559 | nodups vars' tvars' t | |
| 560 | end); | |
| 561 | in nodups [] [] tm; () end; | |
| 562 | ||
| 251 | 563 | |
| 386 | 564 | fun mapfilt_atoms f (Abs (_, _, t)) = mapfilt_atoms f t | 
| 565 | | mapfilt_atoms f (t $ u) = mapfilt_atoms f t @ mapfilt_atoms f u | |
| 566 | | mapfilt_atoms f a = (case f a of Some y => [y] | None => []); | |
| 0 | 567 | |
| 2979 | 568 | |
| 3975 | 569 | fun certify_term sg tm = | 
| 251 | 570 | let | 
| 3969 | 571 | val _ = check_stale sg; | 
| 3975 | 572 | val tsig = tsig_of sg; | 
| 3969 | 573 | |
| 3975 | 574 | fun show_const a T = quote a ^ " :: " ^ quote (string_of_typ sg T); | 
| 169 | 575 | |
| 251 | 576 | fun atom_err (Const (a, T)) = | 
| 3975 | 577 | (case const_type sg a of | 
| 578 |           None => Some ("Undeclared constant " ^ show_const a T)
 | |
| 579 | | Some U => | |
| 580 | if Type.typ_instance (tsig, T, U) then None | |
| 581 |             else Some ("Illegal type for constant " ^ show_const a T))
 | |
| 251 | 582 | | atom_err (Var ((x, i), _)) = | 
| 583 |           if i < 0 then Some ("Negative index for Var " ^ quote x) else None
 | |
| 584 | | atom_err _ = None; | |
| 585 | ||
| 586 | val norm_tm = | |
| 2185 | 587 | (case it_term_types (Type.typ_errors tsig) (tm, []) of | 
| 588 | [] => map_term_types (Type.norm_typ tsig) tm | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 589 | | errs => raise TYPE (cat_lines errs, [], [tm])); | 
| 1494 
22f67e796445
added nodup_Vars check in cterm_of. Prevents same var with distinct types.
 nipkow parents: 
1460diff
changeset | 590 | val _ = nodup_Vars norm_tm; | 
| 251 | 591 | in | 
| 386 | 592 | (case mapfilt_atoms atom_err norm_tm of | 
| 251 | 593 | [] => (norm_tm, type_of norm_tm, maxidx_of_term norm_tm) | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 594 | | errs => raise TYPE (cat_lines errs, [], [norm_tm])) | 
| 251 | 595 | end; | 
| 596 | ||
| 597 | ||
| 598 | ||
| 583 | 599 | (** infer_types **) (*exception ERROR*) | 
| 251 | 600 | |
| 2979 | 601 | (* | 
| 602 | ts: list of alternative parses (hopefully only one is type-correct) | |
| 603 | T: expected type | |
| 604 | ||
| 605 | def_type: partial map from indexnames to types (constrains Frees, Vars) | |
| 606 | def_sort: partial map from indexnames to sorts (constrains TFrees, TVars) | |
| 607 | used: list of already used type variables | |
| 608 | freeze: if true then generated parameters are turned into TFrees, else TVars | |
| 609 | *) | |
| 610 | ||
| 611 | fun infer_types sg def_type def_sort used freeze (ts, T) = | |
| 251 | 612 | let | 
| 3975 | 613 | val tsig = tsig_of sg; | 
| 3810 | 614 | val prt = | 
| 615 | setmp Syntax.show_brackets true | |
| 616 | (setmp long_names true (pretty_term sg)); | |
| 617 | val prT = setmp long_names true (pretty_typ sg); | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 618 | val infer = Type.infer_types prt prT tsig (const_type sg) def_type def_sort | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 619 | (intern_const sg) (intern_tycons sg) (intern_sort sg) used freeze; | 
| 169 | 620 | |
| 2979 | 621 | val T' = certify_typ sg T handle TYPE (msg, _, _) => error msg; | 
| 623 | 622 | |
| 2979 | 623 | fun warn () = | 
| 624 | if length ts > 1 andalso length ts <= ! Syntax.ambiguity_level | |
| 952 
9e10962866b0
Removed an old bug which made some simultaneous instantiations fail if they
 nipkow parents: 
949diff
changeset | 625 | then (*no warning shown yet*) | 
| 3805 | 626 | warning "Got more than one parse tree.\n\ | 
| 627 | \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 | 628 | else (); | 
| 623 | 629 | |
| 2979 | 630 | datatype result = | 
| 631 | One of int * term * (indexname * typ) list | | |
| 632 | Errs of string list | | |
| 633 | Ambigs of term list; | |
| 623 | 634 | |
| 2979 | 635 | fun process_term (res, (t, i)) = | 
| 636 | let val ([u], tye) = infer [T'] [t] in | |
| 637 | (case res of | |
| 638 | One (_, t0, _) => Ambigs ([u, t0]) | |
| 639 | | Errs _ => One (i, u, tye) | |
| 640 | | Ambigs us => Ambigs (u :: us)) | |
| 641 | end handle TYPE (msg, _, _) => | |
| 642 | (case res of | |
| 643 | Errs errs => Errs (msg :: errs) | |
| 644 | | _ => res); | |
| 645 | in | |
| 646 | (case foldl process_term (Errs [], ts ~~ (0 upto (length ts - 1))) of | |
| 647 | One res => | |
| 648 | (if length ts > ! Syntax.ambiguity_level then | |
| 3552 | 649 | warning "Fortunately, only one parse tree is type correct.\n\ | 
| 3805 | 650 | \You may still want to disambiguate your grammar or your input." | 
| 2979 | 651 | else (); res) | 
| 652 | | Errs errs => (warn (); error (cat_lines errs)) | |
| 653 | | Ambigs us => | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 654 |         (warn (); error ("More than one term is type correct:\n" ^
 | 
| 2979 | 655 | (cat_lines (map (Pretty.string_of o prt) us))))) | 
| 623 | 656 | end; | 
| 251 | 657 | |
| 658 | ||
| 2979 | 659 | |
| 623 | 660 | (** extend signature **) (*exception ERROR*) | 
| 661 | ||
| 620 | 662 | (** signature extension functions **) (*exception ERROR*) | 
| 386 | 663 | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 664 | fun decls_of path name_of mfixs = | 
| 3810 | 665 | 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 | 666 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 667 | fun no_read _ _ _ decl = decl; | 
| 386 | 668 | |
| 669 | ||
| 670 | (* add default sort *) | |
| 671 | ||
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 672 | fun ext_defsort int (syn, tsig, ctab, (path, spaces), data) S = | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 673 | (syn, Type.ext_tsig_defsort tsig (if int then intrn_sort spaces S else S), | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 674 | ctab, (path, spaces), data); | 
| 386 | 675 | |
| 676 | ||
| 677 | (* add type constructors *) | |
| 678 | ||
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 679 | fun ext_types (syn, tsig, ctab, (path, spaces), data) types = | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 680 | let val decls = decls_of path Syntax.type_name types in | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 681 | (Syntax.extend_type_gram syn types, | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 682 | Type.ext_tsig_types tsig decls, ctab, | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 683 | (path, add_names spaces typeK (map fst decls)), data) | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 684 | end; | 
| 386 | 685 | |
| 686 | ||
| 687 | (* add type abbreviations *) | |
| 688 | ||
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 689 | fun read_abbr syn tsig spaces (t, vs, rhs_src) = | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 690 | (t, vs, read_raw_typ syn tsig spaces (K None) rhs_src) | 
| 386 | 691 |     handle ERROR => error ("in type abbreviation " ^ t);
 | 
| 692 | ||
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 693 | fun ext_abbrs rd_abbr (syn, tsig, ctab, (path, spaces), data) abbrs = | 
| 386 | 694 | let | 
| 695 | fun mfix_of (t, vs, _, mx) = (t, length vs, mx); | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 696 | val syn' = Syntax.extend_type_gram syn (map mfix_of abbrs); | 
| 386 | 697 | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 698 | val abbrs' = | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 699 | map (fn (t, vs, rhs, mx) => | 
| 3810 | 700 | (full path (Syntax.type_name t mx), vs, rhs)) abbrs; | 
| 3805 | 701 | val spaces' = add_names spaces typeK (map #1 abbrs'); | 
| 702 | val decls = map (rd_abbr syn' tsig spaces') abbrs'; | |
| 386 | 703 | in | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 704 | (syn', Type.ext_tsig_abbrs tsig decls, ctab, (path, spaces'), data) | 
| 386 | 705 | end; | 
| 706 | ||
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 707 | fun ext_tyabbrs abbrs = ext_abbrs read_abbr abbrs; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 708 | fun ext_tyabbrs_i abbrs = ext_abbrs no_read abbrs; | 
| 386 | 709 | |
| 710 | ||
| 711 | (* add type arities *) | |
| 712 | ||
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 713 | fun ext_arities int (syn, tsig, ctab, (path, spaces), data) arities = | 
| 386 | 714 | let | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 715 | fun intrn_arity (c, Ss, S) = | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 716 | (intrn spaces typeK c, map (intrn_sort spaces) Ss, intrn_sort spaces S); | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 717 | val intrn = if int then map intrn_arity else I; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 718 | val tsig' = Type.ext_tsig_arities tsig (intrn arities); | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 719 | val log_types = Type.logical_types tsig'; | 
| 386 | 720 | in | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 721 | (Syntax.extend_log_types syn log_types, tsig', ctab, (path, spaces), data) | 
| 386 | 722 | end; | 
| 723 | ||
| 724 | ||
| 725 | (* add term constants and syntax *) | |
| 726 | ||
| 3805 | 727 | fun const_name path c mx = | 
| 3810 | 728 | full path (Syntax.const_name c mx); | 
| 3805 | 729 | |
| 386 | 730 | fun err_in_const c = | 
| 731 |   error ("in declaration of constant " ^ quote c);
 | |
| 732 | ||
| 733 | fun err_dup_consts cs = | |
| 734 |   error ("Duplicate declaration of constant(s) " ^ commas_quote cs);
 | |
| 735 | ||
| 251 | 736 | |
| 3805 | 737 | fun read_const syn tsig (path, spaces) (c, ty_src, mx) = | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 738 | (c, read_raw_typ syn tsig spaces (K None) ty_src, mx) | 
| 3805 | 739 | handle ERROR => err_in_const (const_name path c mx); | 
| 386 | 740 | |
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 741 | fun ext_cnsts rd_const syn_only prmode (syn, tsig, ctab, (path, spaces), data) raw_consts = | 
| 386 | 742 | let | 
| 2979 | 743 | fun prep_const (c, ty, mx) = | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 744 | (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 | 745 | handle TYPE (msg, _, _) => | 
| 3805 | 746 | (error_msg msg; err_in_const (const_name path c mx)); | 
| 386 | 747 | |
| 3805 | 748 | val consts = map (prep_const o rd_const syn tsig (path, spaces)) raw_consts; | 
| 386 | 749 | val decls = | 
| 750 | if syn_only then [] | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 751 | else decls_of path Syntax.const_name consts; | 
| 386 | 752 | in | 
| 2197 | 753 | (Syntax.extend_const_gram syn prmode consts, tsig, | 
| 386 | 754 | Symtab.extend_new (ctab, decls) | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 755 | handle Symtab.DUPS cs => err_dup_consts cs, | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 756 | (path, add_names spaces constK (map fst decls)), data) | 
| 386 | 757 | end; | 
| 758 | ||
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 759 | val ext_consts_i = ext_cnsts no_read false ("", true);
 | 
| 2359 | 760 | val ext_consts = ext_cnsts read_const false ("", true);
 | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 761 | val ext_syntax_i = ext_cnsts no_read true ("", true);
 | 
| 2359 | 762 | val ext_syntax = ext_cnsts read_const true ("", true);
 | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 763 | fun ext_modesyntax_i sg (prmode, consts) = ext_cnsts no_read true prmode sg consts; | 
| 2197 | 764 | fun ext_modesyntax sg (prmode, consts) = ext_cnsts read_const true prmode sg consts; | 
| 386 | 765 | |
| 766 | ||
| 767 | (* add type classes *) | |
| 768 | ||
| 769 | fun const_of_class c = c ^ "_class"; | |
| 770 | ||
| 771 | fun class_of_const c_class = | |
| 772 | let | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 773 | val c = implode (take (size c_class - size "_class", explode c_class)); | 
| 386 | 774 | in | 
| 775 | if const_of_class c = c_class then c | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 776 |     else raise TERM ("class_of_const: bad name " ^ quote c_class, [])
 | 
| 386 | 777 | end; | 
| 778 | ||
| 779 | ||
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 780 | fun ext_classes int (syn, tsig, ctab, (path, spaces), data) classes = | 
| 386 | 781 | let | 
| 562 | 782 | val names = map fst classes; | 
| 386 | 783 | val consts = | 
| 784 | 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 | 785 | |
| 3810 | 786 | val full_names = map (full path) names; | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 787 | val spaces' = add_names spaces classK full_names; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 788 | val intrn = if int then map (intrn_class spaces') else I; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 789 | val classes' = | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 790 | ListPair.map (fn (c, (_, cs)) => (c, intrn cs)) (full_names, classes); | 
| 386 | 791 | in | 
| 792 | ext_consts_i | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 793 | (Syntax.extend_consts syn names, | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 794 | Type.ext_tsig_classes tsig classes', ctab, (path, spaces'), data) | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 795 | consts | 
| 386 | 796 | end; | 
| 797 | ||
| 798 | ||
| 2963 | 799 | (* add to classrel *) | 
| 421 | 800 | |
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 801 | fun ext_classrel int (syn, tsig, ctab, (path, spaces), data) pairs = | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 802 | 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 | 803 | (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 | 804 | end; | 
| 421 | 805 | |
| 806 | ||
| 1159 | 807 | (* add to syntax *) | 
| 386 | 808 | |
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 809 | fun ext_syn extfun (syn, tsig, ctab, names, data) args = | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 810 | (extfun syn args, tsig, ctab, names, data); | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 811 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 812 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 813 | (* add to path *) | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 814 | |
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 815 | fun ext_path (syn, tsig, ctab, (path, spaces), data) elem = | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 816 | let | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 817 | val path' = | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 818 | if elem = ".." andalso not (null path) then fst (split_last path) | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 819 | else if elem = "/" then [] | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 820 | else path @ NameSpace.unpack elem; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 821 | in | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 822 | (syn, tsig, ctab, (path', spaces), data) | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 823 | end; | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 824 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 825 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 826 | (* add to name space *) | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 827 | |
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 828 | fun ext_space (syn, tsig, ctab, (path, spaces), data) (kind, names) = | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 829 | (syn, tsig, ctab, (path, add_names spaces kind names), data); | 
| 386 | 830 | |
| 831 | ||
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 832 | (* signature data *) | 
| 386 | 833 | |
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 834 | fun ext_init_data (syn, tsig, ctab, names, data) (kind, e, ext, mrg, prt) = | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 835 | (syn, tsig, ctab, names, Data.init data kind e ext mrg prt); | 
| 386 | 836 | |
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 837 | fun ext_put_data (syn, tsig, ctab, names, data) (kind, e) = | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 838 | (syn, tsig, ctab, names, Data.put data kind e); | 
| 386 | 839 | |
| 840 | ||
| 841 | (* the external interfaces *) | |
| 842 | ||
| 3975 | 843 | val add_classes = extend_sign true (ext_classes true) "#"; | 
| 844 | val add_classes_i = extend_sign true (ext_classes false) "#"; | |
| 845 | val add_classrel = extend_sign true (ext_classrel true) "#"; | |
| 846 | val add_classrel_i = extend_sign true (ext_classrel false) "#"; | |
| 847 | val add_defsort = extend_sign true (ext_defsort true) "#"; | |
| 848 | val add_defsort_i = extend_sign true (ext_defsort false) "#"; | |
| 849 | val add_types = extend_sign true ext_types "#"; | |
| 850 | val add_tyabbrs = extend_sign true ext_tyabbrs "#"; | |
| 851 | val add_tyabbrs_i = extend_sign true ext_tyabbrs_i "#"; | |
| 852 | val add_arities = extend_sign true (ext_arities true) "#"; | |
| 853 | val add_arities_i = extend_sign true (ext_arities false) "#"; | |
| 854 | val add_consts = extend_sign true ext_consts "#"; | |
| 855 | val add_consts_i = extend_sign true ext_consts_i "#"; | |
| 856 | val add_syntax = extend_sign true ext_syntax "#"; | |
| 857 | val add_syntax_i = extend_sign true ext_syntax_i "#"; | |
| 858 | val add_modesyntax = extend_sign true ext_modesyntax "#"; | |
| 859 | val add_modesyntax_i = extend_sign true ext_modesyntax_i "#"; | |
| 860 | val add_trfuns = extend_sign true (ext_syn Syntax.extend_trfuns) "#"; | |
| 861 | val add_trfunsT = extend_sign true (ext_syn Syntax.extend_trfunsT) "#"; | |
| 862 | val add_tokentrfuns = extend_sign true (ext_syn Syntax.extend_tokentrfuns) "#"; | |
| 863 | val add_trrules = extend_sign true (ext_syn Syntax.extend_trrules) "#"; | |
| 864 | val add_trrules_i = extend_sign true (ext_syn Syntax.extend_trrules_i) "#"; | |
| 865 | val add_path = extend_sign true ext_path "#"; | |
| 866 | val add_space = extend_sign true ext_space "#"; | |
| 867 | val init_data = extend_sign true ext_init_data "#"; | |
| 868 | val put_data = extend_sign true ext_put_data "#"; | |
| 869 | fun add_name name sg = extend_sign true K name () sg; | |
| 870 | fun prep_ext sg = extend_sign false K "#" () sg; | |
| 386 | 871 | |
| 872 | ||
| 3867 | 873 | |
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 874 | (** merge signatures **) (*exception TERM*) | 
| 3867 | 875 | |
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 876 | (* merge of sg_refs -- trivial only *) | 
| 3877 | 877 | |
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 878 | fun merge_refs (sgr1 as SgRef (Some (ref sg1)), | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 879 | sgr2 as SgRef (Some (ref sg2))) = | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 880 | if fast_subsig (sg2, sg1) then sgr1 | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 881 | else if fast_subsig (sg1, sg2) then sgr2 | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 882 | else if subsig (sg2, sg1) then sgr1 | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 883 | else if subsig (sg1, sg2) then sgr2 | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 884 |       else raise TERM ("Attempt to do non-trivial merge of signatures", [])
 | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 885 | | merge_refs _ = sys_error "Sign.merge_refs"; | 
| 3867 | 886 | |
| 887 | ||
| 386 | 888 | |
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 889 | (* proper merge *) | 
| 143 | 890 | |
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 891 | fun merge_aux (sg1, sg2) = | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 892 | if subsig (sg2, sg1) then sg1 | 
| 251 | 893 | else if subsig (sg1, sg2) then sg2 | 
| 386 | 894 | 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 | 895 |     raise TERM ("Attempt to merge draft signatures", [])
 | 
| 251 | 896 | else | 
| 897 | (*neither is union already; must form union*) | |
| 898 | let | |
| 3975 | 899 |       val Sg ({id = _, stamps = stamps1}, {self = _, tsig = tsig1, const_tab = const_tab1,
 | 
| 900 | syn = syn1, path = _, spaces = spaces1, data = data1}) = sg1; | |
| 901 |       val Sg ({id = _, stamps = stamps2}, {self = _, tsig = tsig2, const_tab = const_tab2,
 | |
| 902 | syn = syn2, path = _, spaces = spaces2, data = data2}) = sg2; | |
| 386 | 903 | |
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 904 | val id = ref ""; | 
| 3975 | 905 | val self_ref = ref sg1; (*dummy value*) | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 906 | val self = SgRef (Some self_ref); | 
| 402 | 907 | val stamps = merge_rev_lists stamps1 stamps2; | 
| 908 | val _ = | |
| 3975 | 909 | (case duplicates (map ! stamps) of | 
| 402 | 910 | [] => () | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 911 |         | dups => raise TERM ("Attempt to merge different versions of theories "
 | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 912 | ^ commas_quote dups, [])); | 
| 402 | 913 | |
| 2185 | 914 | val tsig = Type.merge_tsigs (tsig1, tsig2); | 
| 251 | 915 | val const_tab = Symtab.merge (op =) (const_tab1, const_tab2) | 
| 386 | 916 | handle Symtab.DUPS cs => | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 917 |           raise TERM ("Incompatible types for constant(s) " ^ commas_quote cs, []);
 | 
| 386 | 918 | val syn = Syntax.merge_syntaxes syn1 syn2; | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 919 | |
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 920 | val path = []; | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 921 | val kinds = distinct (map fst (spaces1 @ spaces2)); | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 922 | val spaces = | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 923 | kinds ~~ | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 924 | ListPair.map NameSpace.merge | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 925 | (map (space_of spaces1) kinds, map (space_of spaces2) kinds); | 
| 3867 | 926 | |
| 927 | val data = Data.merge (data1, data2); | |
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 928 | |
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 929 | val sign = make_sign (id, self, tsig, const_tab, syn, path, spaces, data, stamps); | 
| 251 | 930 | in | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 931 | self_ref := sign; sign | 
| 251 | 932 | end; | 
| 143 | 933 | |
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 934 | fun merge sg1_sg2 = | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 935 | (case handle_error merge_aux sg1_sg2 of | 
| 3805 | 936 | OK sg => sg | 
| 937 | | Error msg => raise TERM (msg, [])); | |
| 938 | ||
| 0 | 939 | |
| 940 | ||
| 251 | 941 | (** the Pure signature **) | 
| 0 | 942 | |
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 943 | val dummy_sg = make_sign (ref "", SgRef None, Type.tsig0, | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 944 | Symtab.null, Syntax.pure_syn, [], [], Data.empty, []); | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 945 | |
| 922 
196ca0973a6d
added CPure (curried functions) and ProtoPure (ancestor of Pure and CPure)
 clasohm parents: 
901diff
changeset | 946 | val proto_pure = | 
| 3967 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 947 | create_sign (SgRef (Some (ref dummy_sg))) [] "#" | 
| 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 wenzelm parents: 
3956diff
changeset | 948 | (Syntax.pure_syn, Type.tsig0, Symtab.null, ([], []), Data.empty) | 
| 410 | 949 | |> add_types | 
| 386 | 950 |    (("fun", 2, NoSyn) ::
 | 
| 951 |     ("prop", 0, NoSyn) ::
 | |
| 952 |     ("itself", 1, NoSyn) ::
 | |
| 562 | 953 | Syntax.pure_types) | 
| 3937 | 954 | |> add_classes_i [(logicC, [])] | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 955 | |> add_defsort_i logicS | 
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 956 | |> add_arities_i | 
| 386 | 957 |    [("fun", [logicS, logicS], logicS),
 | 
| 958 |     ("prop", [], logicS),
 | |
| 959 |     ("itself", [logicS], logicS)]
 | |
| 562 | 960 | |> add_syntax Syntax.pure_syntax | 
| 2359 | 961 |   |> add_modesyntax (("symbols", true), Syntax.pure_sym_syntax)
 | 
| 410 | 962 | |> add_trfuns Syntax.pure_trfuns | 
| 2693 | 963 | |> add_trfunsT Syntax.pure_trfunsT | 
| 3810 | 964 | |> add_syntax | 
| 965 |    [("==>", "[prop, prop] => prop", Delimfix "op ==>")]
 | |
| 410 | 966 | |> add_consts | 
| 2197 | 967 |    [("==", "['a::{}, 'a] => prop", InfixrName ("==", 2)),
 | 
| 968 |     ("=?=", "['a::{}, 'a] => prop", InfixrName ("=?=", 2)),
 | |
| 2211 | 969 |     ("==>", "[prop, prop] => prop", Mixfix ("(_/ ==> _)", [2, 1], 1)),
 | 
| 865 | 970 |     ("all", "('a => prop) => prop", Binder ("!!", 0, 0)),
 | 
| 573 | 971 |     ("TYPE", "'a itself", NoSyn)]
 | 
| 922 
196ca0973a6d
added CPure (curried functions) and ProtoPure (ancestor of Pure and CPure)
 clasohm parents: 
901diff
changeset | 972 | |> add_name "ProtoPure"; | 
| 
196ca0973a6d
added CPure (curried functions) and ProtoPure (ancestor of Pure and CPure)
 clasohm parents: 
901diff
changeset | 973 | |
| 
196ca0973a6d
added CPure (curried functions) and ProtoPure (ancestor of Pure and CPure)
 clasohm parents: 
901diff
changeset | 974 | val pure = proto_pure | 
| 1180 | 975 | |> add_syntax Syntax.pure_appl_syntax | 
| 410 | 976 | |> add_name "Pure"; | 
| 0 | 977 | |
| 922 
196ca0973a6d
added CPure (curried functions) and ProtoPure (ancestor of Pure and CPure)
 clasohm parents: 
901diff
changeset | 978 | val cpure = proto_pure | 
| 1180 | 979 | |> add_syntax Syntax.pure_applC_syntax | 
| 922 
196ca0973a6d
added CPure (curried functions) and ProtoPure (ancestor of Pure and CPure)
 clasohm parents: 
901diff
changeset | 980 | |> add_name "CPure"; | 
| 0 | 981 | |
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 982 | |
| 0 | 983 | end; | 
| 3791 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 984 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 985 | |
| 
c5db2c87a646
now supports qualified names (intern vs. extern) !!!
 wenzelm parents: 
3552diff
changeset | 986 | val long_names = Sign.long_names; |