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