| author | wenzelm | 
| Tue, 02 Aug 2005 19:47:13 +0200 | |
| changeset 17003 | b902e11b3df1 | 
| parent 16881 | 570592642670 | 
| child 17155 | e904580c3ee0 | 
| permissions | -rw-r--r-- | 
| 2956 | 1 | (* Title: Pure/sorts.ML | 
| 2 | ID: $Id$ | |
| 3 | Author: Markus Wenzel and Stefan Berghofer, TU Muenchen | |
| 4 | ||
| 5 | Type classes and sorts. | |
| 6 | *) | |
| 7 | ||
| 8 | signature SORTS = | |
| 9 | sig | |
| 16598 
59381032be14
removed obsolete eq_sort, mem_sort, subset_sort, eq_set_sort, ins_sort, union_sort, rems_sort;
 wenzelm parents: 
16400diff
changeset | 10 | (*operations on ordered lists*) | 
| 
59381032be14
removed obsolete eq_sort, mem_sort, subset_sort, eq_set_sort, ins_sort, union_sort, rems_sort;
 wenzelm parents: 
16400diff
changeset | 11 | val eq_set: sort list * sort list -> bool | 
| 
59381032be14
removed obsolete eq_sort, mem_sort, subset_sort, eq_set_sort, ins_sort, union_sort, rems_sort;
 wenzelm parents: 
16400diff
changeset | 12 | val union: sort list -> sort list -> sort list | 
| 
59381032be14
removed obsolete eq_sort, mem_sort, subset_sort, eq_set_sort, ins_sort, union_sort, rems_sort;
 wenzelm parents: 
16400diff
changeset | 13 | val subtract: sort list -> sort list -> sort list | 
| 
59381032be14
removed obsolete eq_sort, mem_sort, subset_sort, eq_set_sort, ins_sort, union_sort, rems_sort;
 wenzelm parents: 
16400diff
changeset | 14 | val insert_sort: sort -> sort list -> sort list | 
| 
59381032be14
removed obsolete eq_sort, mem_sort, subset_sort, eq_set_sort, ins_sort, union_sort, rems_sort;
 wenzelm parents: 
16400diff
changeset | 15 | val insert_typ: typ -> sort list -> sort list | 
| 
59381032be14
removed obsolete eq_sort, mem_sort, subset_sort, eq_set_sort, ins_sort, union_sort, rems_sort;
 wenzelm parents: 
16400diff
changeset | 16 | val insert_typs: typ list -> sort list -> sort list | 
| 
59381032be14
removed obsolete eq_sort, mem_sort, subset_sort, eq_set_sort, ins_sort, union_sort, rems_sort;
 wenzelm parents: 
16400diff
changeset | 17 | val insert_term: term -> sort list -> sort list | 
| 
59381032be14
removed obsolete eq_sort, mem_sort, subset_sort, eq_set_sort, ins_sort, union_sort, rems_sort;
 wenzelm parents: 
16400diff
changeset | 18 | val insert_terms: term list -> sort list -> sort list | 
| 
59381032be14
removed obsolete eq_sort, mem_sort, subset_sort, eq_set_sort, ins_sort, union_sort, rems_sort;
 wenzelm parents: 
16400diff
changeset | 19 | (*signature information*) | 
| 14782 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 20 | type classes | 
| 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 21 | type arities | 
| 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 22 | val class_eq: classes -> class * class -> bool | 
| 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 23 | val class_less: classes -> class * class -> bool | 
| 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 24 | val class_le: classes -> class * class -> bool | 
| 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 25 | val sort_eq: classes -> sort * sort -> bool | 
| 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 26 | val sort_less: classes -> sort * sort -> bool | 
| 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 27 | val sort_le: classes -> sort * sort -> bool | 
| 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 28 | val sorts_le: classes -> sort list * sort list -> bool | 
| 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 29 | val inter_sort: classes -> sort * sort -> sort | 
| 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 30 | val norm_sort: classes -> sort -> sort | 
| 14986 | 31 | val certify_class: classes -> class -> class | 
| 32 | val certify_sort: classes -> sort -> sort | |
| 14782 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 33 | val of_sort: classes * arities -> typ * sort -> bool | 
| 7643 | 34 | exception DOMAIN of string * class | 
| 14782 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 35 | val mg_domain: classes * arities -> string -> sort -> sort list (*exception DOMAIN*) | 
| 14828 | 36 | val witness_sorts: classes * arities -> string list -> | 
| 37 | sort list -> sort list -> (typ * sort) list | |
| 2956 | 38 | end; | 
| 39 | ||
| 40 | structure Sorts: SORTS = | |
| 41 | struct | |
| 42 | ||
| 43 | (** type classes and sorts **) | |
| 44 | ||
| 45 | (* | |
| 46 | Classes denote (possibly empty) collections of types that are | |
| 47 | partially ordered by class inclusion. They are represented | |
| 48 | symbolically by strings. | |
| 49 | ||
| 50 | Sorts are intersections of finitely many classes. They are | |
| 51 | represented by lists of classes. Normal forms of sorts are sorted | |
| 52 | lists of minimal classes (wrt. current class inclusion). | |
| 53 | ||
| 14782 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 54 | (types already defined in Pure/term.ML) | 
| 2956 | 55 | *) | 
| 56 | ||
| 57 | ||
| 16598 
59381032be14
removed obsolete eq_sort, mem_sort, subset_sort, eq_set_sort, ins_sort, union_sort, rems_sort;
 wenzelm parents: 
16400diff
changeset | 58 | (* ordered lists of sorts *) | 
| 14782 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 59 | |
| 16598 
59381032be14
removed obsolete eq_sort, mem_sort, subset_sort, eq_set_sort, ins_sort, union_sort, rems_sort;
 wenzelm parents: 
16400diff
changeset | 60 | val eq_set = OrdList.eq_set Term.sort_ord; | 
| 
59381032be14
removed obsolete eq_sort, mem_sort, subset_sort, eq_set_sort, ins_sort, union_sort, rems_sort;
 wenzelm parents: 
16400diff
changeset | 61 | val op union = OrdList.union Term.sort_ord; | 
| 
59381032be14
removed obsolete eq_sort, mem_sort, subset_sort, eq_set_sort, ins_sort, union_sort, rems_sort;
 wenzelm parents: 
16400diff
changeset | 62 | val subtract = OrdList.subtract Term.sort_ord; | 
| 14782 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 63 | |
| 16598 
59381032be14
removed obsolete eq_sort, mem_sort, subset_sort, eq_set_sort, ins_sort, union_sort, rems_sort;
 wenzelm parents: 
16400diff
changeset | 64 | val insert_sort = OrdList.insert Term.sort_ord; | 
| 14782 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 65 | |
| 16598 
59381032be14
removed obsolete eq_sort, mem_sort, subset_sort, eq_set_sort, ins_sort, union_sort, rems_sort;
 wenzelm parents: 
16400diff
changeset | 66 | fun insert_typ (TFree (_, S)) Ss = insert_sort S Ss | 
| 
59381032be14
removed obsolete eq_sort, mem_sort, subset_sort, eq_set_sort, ins_sort, union_sort, rems_sort;
 wenzelm parents: 
16400diff
changeset | 67 | | insert_typ (TVar (_, S)) Ss = insert_sort S Ss | 
| 
59381032be14
removed obsolete eq_sort, mem_sort, subset_sort, eq_set_sort, ins_sort, union_sort, rems_sort;
 wenzelm parents: 
16400diff
changeset | 68 | | insert_typ (Type (_, Ts)) Ss = insert_typs Ts Ss | 
| 
59381032be14
removed obsolete eq_sort, mem_sort, subset_sort, eq_set_sort, ins_sort, union_sort, rems_sort;
 wenzelm parents: 
16400diff
changeset | 69 | and insert_typs [] Ss = Ss | 
| 
59381032be14
removed obsolete eq_sort, mem_sort, subset_sort, eq_set_sort, ins_sort, union_sort, rems_sort;
 wenzelm parents: 
16400diff
changeset | 70 | | insert_typs (T :: Ts) Ss = insert_typs Ts (insert_typ T Ss); | 
| 14782 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 71 | |
| 16598 
59381032be14
removed obsolete eq_sort, mem_sort, subset_sort, eq_set_sort, ins_sort, union_sort, rems_sort;
 wenzelm parents: 
16400diff
changeset | 72 | fun insert_term (Const (_, T)) Ss = insert_typ T Ss | 
| 
59381032be14
removed obsolete eq_sort, mem_sort, subset_sort, eq_set_sort, ins_sort, union_sort, rems_sort;
 wenzelm parents: 
16400diff
changeset | 73 | | insert_term (Free (_, T)) Ss = insert_typ T Ss | 
| 
59381032be14
removed obsolete eq_sort, mem_sort, subset_sort, eq_set_sort, ins_sort, union_sort, rems_sort;
 wenzelm parents: 
16400diff
changeset | 74 | | insert_term (Var (_, T)) Ss = insert_typ T Ss | 
| 
59381032be14
removed obsolete eq_sort, mem_sort, subset_sort, eq_set_sort, ins_sort, union_sort, rems_sort;
 wenzelm parents: 
16400diff
changeset | 75 | | insert_term (Bound _) Ss = Ss | 
| 
59381032be14
removed obsolete eq_sort, mem_sort, subset_sort, eq_set_sort, ins_sort, union_sort, rems_sort;
 wenzelm parents: 
16400diff
changeset | 76 | | insert_term (Abs (_, T, t)) Ss = insert_term t (insert_typ T Ss) | 
| 
59381032be14
removed obsolete eq_sort, mem_sort, subset_sort, eq_set_sort, ins_sort, union_sort, rems_sort;
 wenzelm parents: 
16400diff
changeset | 77 | | insert_term (t $ u) Ss = insert_term t (insert_term u Ss); | 
| 14782 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 78 | |
| 16598 
59381032be14
removed obsolete eq_sort, mem_sort, subset_sort, eq_set_sort, ins_sort, union_sort, rems_sort;
 wenzelm parents: 
16400diff
changeset | 79 | fun insert_terms [] Ss = Ss | 
| 
59381032be14
removed obsolete eq_sort, mem_sort, subset_sort, eq_set_sort, ins_sort, union_sort, rems_sort;
 wenzelm parents: 
16400diff
changeset | 80 | | insert_terms (t :: ts) Ss = insert_terms ts (insert_term t Ss); | 
| 14782 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 81 | |
| 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 82 | |
| 2956 | 83 | (* sort signature information *) | 
| 84 | ||
| 85 | (* | |
| 14782 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 86 | classes: graph representing class declarations together with proper | 
| 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 87 | subclass relation, which needs to be transitive and acyclic. | 
| 2956 | 88 | |
| 14782 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 89 | arities: table of association lists of all type arities; (t, ars) | 
| 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 90 | means that type constructor t has the arities ars; an element (c, | 
| 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 91 | Ss) of ars represents the arity t::(Ss)c. "Coregularity" of the | 
| 14870 | 92 | arities structure requires that for any two declarations | 
| 93 | t::(Ss1)c1 and t::(Ss2)c2 such that c1 <= c2 holds Ss1 <= Ss2. | |
| 2956 | 94 | *) | 
| 95 | ||
| 14782 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 96 | type classes = stamp Graph.T; | 
| 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 97 | type arities = (class * sort list) list Symtab.table; | 
| 2956 | 98 | |
| 99 | ||
| 100 | ||
| 101 | (** equality and inclusion **) | |
| 102 | ||
| 103 | (* classes *) | |
| 104 | ||
| 14782 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 105 | fun class_eq (_: classes) (c1, c2:class) = c1 = c2; | 
| 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 106 | val class_less: classes -> class * class -> bool = Graph.is_edge; | 
| 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 107 | fun class_le classes (c1, c2) = c1 = c2 orelse class_less classes (c1, c2); | 
| 2956 | 108 | |
| 109 | ||
| 110 | (* sorts *) | |
| 111 | ||
| 14782 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 112 | fun sort_le classes (S1, S2) = | 
| 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 113 | forall (fn c2 => exists (fn c1 => class_le classes (c1, c2)) S1) S2; | 
| 2956 | 114 | |
| 14782 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 115 | fun sorts_le classes (Ss1, Ss2) = | 
| 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 116 | ListPair.all (sort_le classes) (Ss1, Ss2); | 
| 2956 | 117 | |
| 14782 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 118 | fun sort_eq classes (S1, S2) = | 
| 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 119 | sort_le classes (S1, S2) andalso sort_le classes (S2, S1); | 
| 2956 | 120 | |
| 14782 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 121 | fun sort_less classes (S1, S2) = | 
| 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 122 | sort_le classes (S1, S2) andalso not (sort_le classes (S2, S1)); | 
| 2956 | 123 | |
| 124 | ||
| 125 | (* normal forms of sorts *) | |
| 126 | ||
| 14782 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 127 | fun minimal_class classes S c = | 
| 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 128 | not (exists (fn c' => class_less classes (c', c)) S); | 
| 2956 | 129 | |
| 14986 | 130 | fun norm_sort _ [] = [] | 
| 131 | | norm_sort _ (S as [_]) = S | |
| 16881 | 132 | | norm_sort classes S = unique_strings (sort_strings (filter (minimal_class classes S) S)); | 
| 14986 | 133 | |
| 134 | ||
| 135 | (* certify *) | |
| 136 | ||
| 137 | fun certify_class classes c = | |
| 138 | if can (Graph.get_node classes) c then c | |
| 139 |   else raise TYPE ("Undeclared class: " ^ quote c, [], []);
 | |
| 140 | ||
| 141 | fun certify_sort classes = norm_sort classes o map (certify_class classes); | |
| 2956 | 142 | |
| 143 | ||
| 144 | ||
| 145 | (** intersection **) | |
| 146 | ||
| 7643 | 147 | (*intersect class with sort (preserves minimality)*) | 
| 16881 | 148 | fun inter_class classes c S = | 
| 2956 | 149 | let | 
| 150 | fun intr [] = [c] | |
| 151 | | intr (S' as c' :: c's) = | |
| 14782 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 152 | if class_le classes (c', c) then S' | 
| 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 153 | else if class_le classes (c, c') then intr c's | 
| 2956 | 154 | else c' :: intr c's | 
| 155 | in intr S end; | |
| 156 | ||
| 157 | (*instersect sorts (preserves minimality)*) | |
| 16881 | 158 | fun inter_sort classes (S1, S2) = | 
| 159 | sort_strings (fold (inter_class classes) S1 S2); | |
| 2956 | 160 | |
| 161 | ||
| 162 | ||
| 163 | (** sorts of types **) | |
| 164 | ||
| 7643 | 165 | (* mg_domain *) | 
| 166 | ||
| 167 | exception DOMAIN of string * class; | |
| 2956 | 168 | |
| 16881 | 169 | fun mg_domain (classes, arities) a S = | 
| 170 | let | |
| 171 | fun dom c = | |
| 172 | (case Library.assoc_string (Symtab.lookup_multi (arities, a), c) of | |
| 173 | NONE => raise DOMAIN (a, c) | |
| 174 | | SOME Ss => Ss); | |
| 175 | fun dom_inter c Ss = ListPair.map (inter_sort classes) (dom c, Ss); | |
| 176 | in | |
| 177 | (case S of | |
| 178 | [] => sys_error "mg_domain" (*don't know number of args!*) | |
| 179 | | c :: cs => fold dom_inter cs (dom c)) | |
| 180 | end; | |
| 2956 | 181 | |
| 182 | ||
| 2990 | 183 | (* of_sort *) | 
| 184 | ||
| 14782 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 185 | fun of_sort (classes, arities) = | 
| 2990 | 186 | let | 
| 187 | fun ofS (_, []) = true | |
| 14782 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 188 | | ofS (TFree (_, S), S') = sort_le classes (S, S') | 
| 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 189 | | ofS (TVar (_, S), S') = sort_le classes (S, S') | 
| 2990 | 190 | | ofS (Type (a, Ts), S) = | 
| 14782 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 191 | let val Ss = mg_domain (classes, arities) a S in | 
| 2990 | 192 | ListPair.all ofS (Ts, Ss) | 
| 7643 | 193 | end handle DOMAIN _ => false; | 
| 2990 | 194 | in ofS end; | 
| 195 | ||
| 196 | ||
| 2956 | 197 | |
| 7643 | 198 | (** witness_sorts **) | 
| 199 | ||
| 14828 | 200 | local | 
| 201 | ||
| 202 | fun witness_aux (classes, arities) log_types hyps sorts = | |
| 7643 | 203 | let | 
| 204 | val top_witn = (propT, []); | |
| 14782 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 205 | fun le S1 S2 = sort_le classes (S1, S2); | 
| 15531 | 206 | fun get_solved S2 (T, S1) = if le S1 S2 then SOME (T, S2) else NONE; | 
| 207 |     fun get_hyp S2 S1 = if le S1 S2 then SOME (TFree ("'hyp", S1), S2) else NONE;
 | |
| 208 | fun mg_dom t S = SOME (mg_domain (classes, arities) t S) handle DOMAIN _ => NONE; | |
| 7643 | 209 | |
| 15531 | 210 | fun witn_sort _ (solved_failed, []) = (solved_failed, SOME top_witn) | 
| 7643 | 211 | | witn_sort path ((solved, failed), S) = | 
| 15531 | 212 | if exists (le S) failed then ((solved, failed), NONE) | 
| 7643 | 213 | else | 
| 214 | (case get_first (get_solved S) solved of | |
| 15531 | 215 | SOME w => ((solved, failed), SOME w) | 
| 216 | | NONE => | |
| 7643 | 217 | (case get_first (get_hyp S) hyps of | 
| 15531 | 218 | SOME w => ((w :: solved, failed), SOME w) | 
| 219 | | NONE => witn_types path log_types ((solved, failed), S))) | |
| 7643 | 220 | |
| 221 | and witn_sorts path x = foldl_map (witn_sort path) x | |
| 2956 | 222 | |
| 15531 | 223 | and witn_types _ [] ((solved, failed), S) = ((solved, S :: failed), NONE) | 
| 7643 | 224 | | witn_types path (t :: ts) (solved_failed, S) = | 
| 225 | (case mg_dom t S of | |
| 15531 | 226 | SOME SS => | 
| 7643 | 227 | (*do not descend into stronger args (achieving termination)*) | 
| 228 | if exists (fn D => le D S orelse exists (le D) path) SS then | |
| 229 | witn_types path ts (solved_failed, S) | |
| 230 | else | |
| 231 | let val ((solved', failed'), ws) = witn_sorts (S :: path) (solved_failed, SS) in | |
| 15570 | 232 | if forall isSome ws then | 
| 233 | let val w = (Type (t, map (#1 o valOf) ws), S) | |
| 15531 | 234 | in ((w :: solved', failed'), SOME w) end | 
| 7643 | 235 | else witn_types path ts ((solved', failed'), S) | 
| 236 | end | |
| 15531 | 237 | | NONE => witn_types path ts (solved_failed, S)); | 
| 7643 | 238 | |
| 239 | in witn_sorts [] (([], []), sorts) end; | |
| 240 | ||
| 14828 | 241 | fun str_of_sort [c] = c | 
| 242 |   | str_of_sort cs = enclose "{" "}" (commas cs);
 | |
| 243 | ||
| 244 | in | |
| 7643 | 245 | |
| 14782 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 246 | fun witness_sorts (classes, arities) log_types hyps sorts = | 
| 7643 | 247 | let | 
| 16881 | 248 | (*double check result of witness construction*) | 
| 15531 | 249 | fun check_result NONE = NONE | 
| 250 | | check_result (SOME (T, S)) = | |
| 251 | if of_sort (classes, arities) (T, S) then SOME (T, S) | |
| 14782 
d6ce35a1c386
incorporate sort ops from term.ML; use Graph.T; misc cleanup;
 wenzelm parents: 
9281diff
changeset | 252 |           else sys_error ("Sorts.witness_sorts: bad witness for sort " ^ str_of_sort S);
 | 
| 15570 | 253 | in List.mapPartial check_result (#2 (witness_aux (classes, arities) log_types hyps sorts)) end; | 
| 2956 | 254 | |
| 255 | end; | |
| 14828 | 256 | |
| 257 | end; |