| author | wenzelm | 
| Mon, 02 Oct 2000 14:21:12 +0200 | |
| changeset 10120 | 0f315aeee16e | 
| parent 8611 | 49166d549426 | 
| child 13629 | a46362d2b19b | 
| permissions | -rw-r--r-- | 
| 
2957
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
1  | 
(* Title: Pure/type_infer.ML  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
2  | 
ID: $Id$  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
3  | 
Author: Stefan Berghofer and Markus Wenzel, TU Muenchen  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
4  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
5  | 
Type inference.  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
6  | 
*)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
7  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
8  | 
signature TYPE_INFER =  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
9  | 
sig  | 
| 8087 | 10  | 
val anyT: sort -> typ  | 
11  | 
val logicT: typ  | 
|
| 8611 | 12  | 
val polymorphicT: typ -> typ  | 
| 2979 | 13  | 
val infer_types: (term -> Pretty.T) -> (typ -> Pretty.T)  | 
14  | 
-> (string -> typ option) -> Sorts.classrel -> Sorts.arities  | 
|
| 
2957
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
15  | 
-> string list -> bool -> (indexname -> bool) -> term list -> typ list  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
16  | 
-> term list * typ list * (indexname * typ) list  | 
| 5635 | 17  | 
val appl_error: (term -> Pretty.T) -> (typ -> Pretty.T)  | 
18  | 
-> string -> term -> typ -> term -> typ -> string list  | 
|
| 
2957
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
19  | 
end;  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
20  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
21  | 
structure TypeInfer: TYPE_INFER =  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
22  | 
struct  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
23  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
24  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
25  | 
(** term encodings **)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
26  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
27  | 
(*  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
28  | 
Flavours of term encodings:  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
29  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
30  | 
parse trees (type term):  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
31  | 
A very complicated structure produced by the syntax module's  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
32  | 
read functions. Encodes types and sorts as terms; may contain  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
33  | 
explicit constraints and partial typing information (where  | 
| 8087 | 34  | 
dummies serve as wildcards).  | 
| 
2957
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
35  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
36  | 
Parse trees are INTERNAL! Users should never encounter them,  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
37  | 
except in parse / print translation functions.  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
38  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
39  | 
raw terms (type term):  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
40  | 
Provide the user interface to type inferences. They may contain  | 
| 8087 | 41  | 
partial type information (dummies are wildcards) or explicit  | 
42  | 
type constraints (introduced via constrain: term -> typ ->  | 
|
43  | 
term).  | 
|
| 
2957
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
44  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
45  | 
The type inference function also lets users specify a certain  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
46  | 
subset of TVars to be treated as non-rigid inference parameters.  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
47  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
48  | 
preterms (type preterm):  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
49  | 
The internal representation for type inference.  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
50  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
51  | 
well-typed term (type term):  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
52  | 
Fully typed lambda terms to be accepted by appropriate  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
53  | 
certification functions.  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
54  | 
*)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
55  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
56  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
57  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
58  | 
(** pretyps and preterms **)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
59  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
60  | 
(*links to parameters may get instantiated, anything else is rigid*)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
61  | 
datatype pretyp =  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
62  | 
PType of string * pretyp list |  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
63  | 
PTFree of string * sort |  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
64  | 
PTVar of indexname * sort |  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
65  | 
Param of sort |  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
66  | 
Link of pretyp ref;  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
67  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
68  | 
datatype preterm =  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
69  | 
PConst of string * pretyp |  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
70  | 
PFree of string * pretyp |  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
71  | 
PVar of indexname * pretyp |  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
72  | 
PBound of int |  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
73  | 
PAbs of string * pretyp * preterm |  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
74  | 
PAppl of preterm * preterm |  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
75  | 
Constraint of preterm * pretyp;  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
76  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
77  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
78  | 
(* utils *)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
79  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
80  | 
val mk_param = Link o ref o Param;  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
81  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
82  | 
fun deref (T as Link (ref (Param _))) = T  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
83  | 
| deref (Link (ref T)) = deref T  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
84  | 
| deref T = T;  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
85  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
86  | 
fun foldl_pretyps f (x, PConst (_, T)) = f (x, T)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
87  | 
| foldl_pretyps f (x, PFree (_, T)) = f (x, T)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
88  | 
| foldl_pretyps f (x, PVar (_, T)) = f (x, T)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
89  | 
| foldl_pretyps _ (x, PBound _) = x  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
90  | 
| foldl_pretyps f (x, PAbs (_, T, t)) = foldl_pretyps f (f (x, T), t)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
91  | 
| foldl_pretyps f (x, PAppl (t, u)) = foldl_pretyps f (foldl_pretyps f (x, t), u)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
92  | 
| foldl_pretyps f (x, Constraint (t, T)) = f (foldl_pretyps f (x, t), T);  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
93  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
94  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
95  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
96  | 
(** raw typs/terms to pretyps/preterms **)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
97  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
98  | 
(* pretyp(s)_of *)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
99  | 
|
| 8087 | 100  | 
fun anyT S = TFree ("'_dummy_", S);
 | 
101  | 
val logicT = anyT logicS;  | 
|
102  | 
||
| 8611 | 103  | 
(*indicate polymorphic Vars*)  | 
104  | 
fun polymorphicT T = Type ("_polymorphic_", [T]);
 | 
|
105  | 
||
| 
2957
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
106  | 
fun pretyp_of is_param (params, typ) =  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
107  | 
let  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
108  | 
fun add_parms (ps, TVar (xi as (x, _), S)) =  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
109  | 
if is_param xi andalso is_none (assoc (ps, xi))  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
110  | 
then (xi, mk_param S) :: ps else ps  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
111  | 
| add_parms (ps, TFree _) = ps  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
112  | 
| add_parms (ps, Type (_, Ts)) = foldl add_parms (ps, Ts);  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
113  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
114  | 
val params' = add_parms (params, typ);  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
115  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
116  | 
fun pre_of (TVar (v as (xi, _))) =  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
117  | 
(case assoc (params', xi) of  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
118  | 
None => PTVar v  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
119  | 
| Some p => p)  | 
| 8087 | 120  | 
      | pre_of (TFree ("'_dummy_", S)) = mk_param S
 | 
| 
2957
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
121  | 
| pre_of (TFree v) = PTFree v  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
122  | 
| pre_of (T as Type (a, Ts)) =  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
123  | 
if T = dummyT then mk_param []  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
124  | 
else PType (a, map pre_of Ts);  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
125  | 
in (params', pre_of typ) end;  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
126  | 
|
| 
4957
 
30c49821e61f
remove seq2, scan (use seq2, foldl_map from library.ML);
 
wenzelm 
parents: 
3784 
diff
changeset
 | 
127  | 
fun pretyps_of is_param = foldl_map (pretyp_of is_param);  | 
| 
2957
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
128  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
129  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
130  | 
(* preterm(s)_of *)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
131  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
132  | 
fun preterm_of const_type is_param ((vparams, params), tm) =  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
133  | 
let  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
134  | 
fun add_vparm (ps, xi) =  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
135  | 
if is_none (assoc (ps, xi)) then  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
136  | 
(xi, mk_param []) :: ps  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
137  | 
else ps;  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
138  | 
|
| 8611 | 139  | 
    fun add_vparms (ps, Var (xi, Type ("_polymorphic_", _))) = ps
 | 
140  | 
| add_vparms (ps, Var (xi, _)) = add_vparm (ps, xi)  | 
|
| 
2957
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
141  | 
| add_vparms (ps, Free (x, _)) = add_vparm (ps, (x, ~1))  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
142  | 
| add_vparms (ps, Abs (_, _, t)) = add_vparms (ps, t)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
143  | 
| add_vparms (ps, t $ u) = add_vparms (add_vparms (ps, t), u)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
144  | 
| add_vparms (ps, _) = ps;  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
145  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
146  | 
val vparams' = add_vparms (vparams, tm);  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
147  | 
fun var_param xi = the (assoc (vparams', xi));  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
148  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
149  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
150  | 
val preT_of = pretyp_of is_param;  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
151  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
152  | 
fun constrain (ps, t) T =  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
153  | 
if T = dummyT then (ps, t)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
154  | 
else  | 
| 8087 | 155  | 
let val (ps', T') = preT_of (ps, T)  | 
156  | 
in (ps', Constraint (t, T')) end;  | 
|
| 
2957
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
157  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
158  | 
fun pre_of (ps, Const (c, T)) =  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
159  | 
(case const_type c of  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
160  | 
Some U => constrain (ps, PConst (c, snd (pretyp_of (K true) ([], U)))) T  | 
| 3784 | 161  | 
          | None => raise TYPE ("No such constant: " ^ quote c, [], []))
 | 
| 8611 | 162  | 
      | pre_of (ps, Var (xi, Type ("_polymorphic_", [T]))) =
 | 
163  | 
(ps, PVar (xi, snd (pretyp_of (K true) ([], T))))  | 
|
164  | 
| pre_of (ps, Var (xi, T)) = constrain (ps, PVar (xi, var_param xi)) T  | 
|
| 
2957
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
165  | 
| pre_of (ps, Free (x, T)) = constrain (ps, PFree (x, var_param (x, ~1))) T  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
166  | 
      | pre_of (ps, Const ("_type_constraint_", T) $ t) = constrain (pre_of (ps, t)) T
 | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
167  | 
| pre_of (ps, Bound i) = (ps, PBound i)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
168  | 
| pre_of (ps, Abs (x, T, t)) =  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
169  | 
let  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
170  | 
val (ps', T') = preT_of (ps, T);  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
171  | 
val (ps'', t') = pre_of (ps', t);  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
172  | 
in (ps'', PAbs (x, T', t')) end  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
173  | 
| pre_of (ps, t $ u) =  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
174  | 
let  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
175  | 
val (ps', t') = pre_of (ps, t);  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
176  | 
val (ps'', u') = pre_of (ps', u);  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
177  | 
in (ps'', PAppl (t', u')) end;  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
178  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
179  | 
val (params', tm') = pre_of (params, tm);  | 
| 8611 | 180  | 
in ((vparams', params'), tm') end;  | 
| 
2957
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
181  | 
|
| 
4957
 
30c49821e61f
remove seq2, scan (use seq2, foldl_map from library.ML);
 
wenzelm 
parents: 
3784 
diff
changeset
 | 
182  | 
fun preterms_of const_type is_param = foldl_map (preterm_of const_type is_param);  | 
| 
2957
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
183  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
184  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
185  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
186  | 
(** pretyps/terms to typs/terms **)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
187  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
188  | 
(* add_parms *)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
189  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
190  | 
fun add_parmsT (rs, PType (_, Ts)) = foldl add_parmsT (rs, Ts)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
191  | 
| add_parmsT (rs, Link (r as ref (Param _))) = r ins rs  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
192  | 
| add_parmsT (rs, Link (ref T)) = add_parmsT (rs, T)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
193  | 
| add_parmsT (rs, _) = rs;  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
194  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
195  | 
val add_parms = foldl_pretyps add_parmsT;  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
196  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
197  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
198  | 
(* add_names *)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
199  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
200  | 
fun add_namesT (xs, PType (_, Ts)) = foldl add_namesT (xs, Ts)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
201  | 
| add_namesT (xs, PTFree (x, _)) = x ins xs  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
202  | 
| add_namesT (xs, PTVar ((x, _), _)) = x ins xs  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
203  | 
| add_namesT (xs, Link (ref T)) = add_namesT (xs, T)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
204  | 
| add_namesT (xs, Param _) = xs;  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
205  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
206  | 
val add_names = foldl_pretyps add_namesT;  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
207  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
208  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
209  | 
(* simple_typ/term_of *)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
210  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
211  | 
(*deref links, fail on params*)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
212  | 
fun simple_typ_of (PType (a, Ts)) = Type (a, map simple_typ_of Ts)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
213  | 
| simple_typ_of (PTFree v) = TFree v  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
214  | 
| simple_typ_of (PTVar v) = TVar v  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
215  | 
| simple_typ_of (Link (ref T)) = simple_typ_of T  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
216  | 
| simple_typ_of (Param _) = sys_error "simple_typ_of: illegal Param";  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
217  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
218  | 
(*convert types, drop constraints*)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
219  | 
fun simple_term_of (PConst (c, T)) = Const (c, simple_typ_of T)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
220  | 
| simple_term_of (PFree (x, T)) = Free (x, simple_typ_of T)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
221  | 
| simple_term_of (PVar (xi, T)) = Var (xi, simple_typ_of T)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
222  | 
| simple_term_of (PBound i) = Bound i  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
223  | 
| simple_term_of (PAbs (x, T, t)) = Abs (x, simple_typ_of T, simple_term_of t)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
224  | 
| simple_term_of (PAppl (t, u)) = simple_term_of t $ simple_term_of u  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
225  | 
| simple_term_of (Constraint (t, _)) = simple_term_of t;  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
226  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
227  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
228  | 
(* typs_terms_of *) (*DESTRUCTIVE*)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
229  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
230  | 
fun typs_terms_of used mk_var prfx (Ts, ts) =  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
231  | 
let  | 
| 
4957
 
30c49821e61f
remove seq2, scan (use seq2, foldl_map from library.ML);
 
wenzelm 
parents: 
3784 
diff
changeset
 | 
232  | 
fun elim (r as ref (Param S), x) = r := mk_var (x, S)  | 
| 
 
30c49821e61f
remove seq2, scan (use seq2, foldl_map from library.ML);
 
wenzelm 
parents: 
3784 
diff
changeset
 | 
233  | 
| elim _ = ();  | 
| 
2957
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
234  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
235  | 
val used' = foldl add_names (foldl add_namesT (used, Ts), ts);  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
236  | 
val parms = rev (foldl add_parms (foldl add_parmsT ([], Ts), ts));  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
237  | 
val pre_names = replicate (length parms) (prfx ^ "'");  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
238  | 
val names = variantlist (pre_names, prfx ^ "'" :: used');  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
239  | 
in  | 
| 
4957
 
30c49821e61f
remove seq2, scan (use seq2, foldl_map from library.ML);
 
wenzelm 
parents: 
3784 
diff
changeset
 | 
240  | 
seq2 elim (parms, names);  | 
| 
2957
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
241  | 
(map simple_typ_of Ts, map simple_term_of ts)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
242  | 
end;  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
243  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
244  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
245  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
246  | 
(** order-sorted unification of types **) (*DESTRUCTIVE*)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
247  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
248  | 
exception NO_UNIFIER of string;  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
249  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
250  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
251  | 
fun unify classrel arities =  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
252  | 
let  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
253  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
254  | 
(* adjust sorts of parameters *)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
255  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
256  | 
fun not_in_sort x S' S =  | 
| 2989 | 257  | 
"Variable " ^ x ^ "::" ^ Sorts.str_of_sort S' ^ " not of sort " ^  | 
| 2979 | 258  | 
Sorts.str_of_sort S ^ ".";  | 
| 
2957
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
259  | 
|
| 7639 | 260  | 
fun no_domain (a, c) = "No way to get " ^ a ^ "::" ^ c ^ ".";  | 
261  | 
||
| 
4957
 
30c49821e61f
remove seq2, scan (use seq2, foldl_map from library.ML);
 
wenzelm 
parents: 
3784 
diff
changeset
 | 
262  | 
fun meet (_, []) = ()  | 
| 
 
30c49821e61f
remove seq2, scan (use seq2, foldl_map from library.ML);
 
wenzelm 
parents: 
3784 
diff
changeset
 | 
263  | 
| meet (Link (r as (ref (Param S'))), S) =  | 
| 
2957
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
264  | 
if Sorts.sort_le classrel (S', S) then ()  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
265  | 
else r := mk_param (Sorts.inter_sort classrel (S', S))  | 
| 
4957
 
30c49821e61f
remove seq2, scan (use seq2, foldl_map from library.ML);
 
wenzelm 
parents: 
3784 
diff
changeset
 | 
266  | 
| meet (Link (ref T), S) = meet (T, S)  | 
| 
 
30c49821e61f
remove seq2, scan (use seq2, foldl_map from library.ML);
 
wenzelm 
parents: 
3784 
diff
changeset
 | 
267  | 
| meet (PType (a, Ts), S) =  | 
| 7639 | 268  | 
seq2 meet (Ts, Sorts.mg_domain (classrel, arities) a S  | 
269  | 
handle Sorts.DOMAIN ac => raise NO_UNIFIER (no_domain ac))  | 
|
| 
4957
 
30c49821e61f
remove seq2, scan (use seq2, foldl_map from library.ML);
 
wenzelm 
parents: 
3784 
diff
changeset
 | 
270  | 
| meet (PTFree (x, S'), S) =  | 
| 
2957
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
271  | 
if Sorts.sort_le classrel (S', S) then ()  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
272  | 
else raise NO_UNIFIER (not_in_sort x S' S)  | 
| 
4957
 
30c49821e61f
remove seq2, scan (use seq2, foldl_map from library.ML);
 
wenzelm 
parents: 
3784 
diff
changeset
 | 
273  | 
| meet (PTVar (xi, S'), S) =  | 
| 
2957
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
274  | 
if Sorts.sort_le classrel (S', S) then ()  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
275  | 
else raise NO_UNIFIER (not_in_sort (Syntax.string_of_vname xi) S' S)  | 
| 
4957
 
30c49821e61f
remove seq2, scan (use seq2, foldl_map from library.ML);
 
wenzelm 
parents: 
3784 
diff
changeset
 | 
276  | 
| meet (Param _, _) = sys_error "meet";  | 
| 
2957
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
277  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
278  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
279  | 
(* occurs check and assigment *)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
280  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
281  | 
fun occurs_check r (Link (r' as ref T)) =  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
282  | 
if r = r' then raise NO_UNIFIER "Occurs check!"  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
283  | 
else occurs_check r T  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
284  | 
| occurs_check r (PType (_, Ts)) = seq (occurs_check r) Ts  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
285  | 
| occurs_check _ _ = ();  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
286  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
287  | 
fun assign r T S =  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
288  | 
(case deref T of  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
289  | 
T' as Link (r' as ref (Param _)) =>  | 
| 8087 | 290  | 
if r = r' then () else (meet (T', S); r := T')  | 
291  | 
| T' => (occurs_check r T'; meet (T', S); r := T'));  | 
|
| 
2957
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
292  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
293  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
294  | 
(* unification *)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
295  | 
|
| 
4957
 
30c49821e61f
remove seq2, scan (use seq2, foldl_map from library.ML);
 
wenzelm 
parents: 
3784 
diff
changeset
 | 
296  | 
fun unif (Link (r as ref (Param S)), T) = assign r T S  | 
| 
 
30c49821e61f
remove seq2, scan (use seq2, foldl_map from library.ML);
 
wenzelm 
parents: 
3784 
diff
changeset
 | 
297  | 
| unif (T, Link (r as ref (Param S))) = assign r T S  | 
| 
 
30c49821e61f
remove seq2, scan (use seq2, foldl_map from library.ML);
 
wenzelm 
parents: 
3784 
diff
changeset
 | 
298  | 
| unif (Link (ref T), U) = unif (T, U)  | 
| 
 
30c49821e61f
remove seq2, scan (use seq2, foldl_map from library.ML);
 
wenzelm 
parents: 
3784 
diff
changeset
 | 
299  | 
| unif (T, Link (ref U)) = unif (T, U)  | 
| 
 
30c49821e61f
remove seq2, scan (use seq2, foldl_map from library.ML);
 
wenzelm 
parents: 
3784 
diff
changeset
 | 
300  | 
| unif (PType (a, Ts), PType (b, Us)) =  | 
| 2979 | 301  | 
if a <> b then  | 
302  | 
            raise NO_UNIFIER ("Clash of types " ^ quote a ^ " and " ^ quote b ^ ".")
 | 
|
| 
4957
 
30c49821e61f
remove seq2, scan (use seq2, foldl_map from library.ML);
 
wenzelm 
parents: 
3784 
diff
changeset
 | 
303  | 
else seq2 unif (Ts, Us)  | 
| 
 
30c49821e61f
remove seq2, scan (use seq2, foldl_map from library.ML);
 
wenzelm 
parents: 
3784 
diff
changeset
 | 
304  | 
| unif (T, U) = if T = U then () else raise NO_UNIFIER "";  | 
| 
2957
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
305  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
306  | 
in unif end;  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
307  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
308  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
309  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
310  | 
(** type inference **)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
311  | 
|
| 5635 | 312  | 
fun appl_error prt prT why t T u U =  | 
| 8087 | 313  | 
["Type error in application: " ^ why,  | 
314  | 
"",  | 
|
315  | 
Pretty.string_of (Pretty.block  | 
|
316  | 
[Pretty.str "Operator:", Pretty.brk 2, prt t, Pretty.str " ::", Pretty.brk 1, prT T]),  | 
|
317  | 
Pretty.string_of (Pretty.block  | 
|
318  | 
[Pretty.str "Operand:", Pretty.brk 3, prt u, Pretty.str " ::", Pretty.brk 1, prT U]),  | 
|
319  | 
""];  | 
|
320  | 
||
| 5635 | 321  | 
|
| 
2957
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
322  | 
(* infer *) (*DESTRUCTIVE*)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
323  | 
|
| 2979 | 324  | 
fun infer prt prT classrel arities =  | 
| 
2957
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
325  | 
let  | 
| 2979 | 326  | 
(* errors *)  | 
| 
2957
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
327  | 
|
| 2979 | 328  | 
fun unif_failed msg =  | 
329  | 
"Type unification failed" ^ (if msg = "" then "." else ": " ^ msg) ^ "\n";  | 
|
330  | 
||
331  | 
fun prep_output bs ts Ts =  | 
|
| 
2957
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
332  | 
let  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
333  | 
val (Ts_bTs', ts') = typs_terms_of [] PTFree "??" (Ts @ map snd bs, ts);  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
334  | 
val len = length Ts;  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
335  | 
val Ts' = take (len, Ts_bTs');  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
336  | 
val xs = map Free (map fst bs ~~ drop (len, Ts_bTs'));  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
337  | 
val ts'' = map (fn t => subst_bounds (xs, t)) ts';  | 
| 2979 | 338  | 
in (ts'', Ts') end;  | 
339  | 
||
340  | 
fun err_loose i =  | 
|
| 3784 | 341  | 
      raise TYPE ("Loose bound variable: B." ^ string_of_int i, [], []);
 | 
| 2979 | 342  | 
|
| 3510 | 343  | 
fun err_appl msg bs t T u U =  | 
| 2979 | 344  | 
let  | 
| 3510 | 345  | 
val ([t', u'], [T', U']) = prep_output bs [t, u] [T, U];  | 
346  | 
val why =  | 
|
347  | 
(case T' of  | 
|
348  | 
            Type ("fun", _) => "Incompatible operand type."
 | 
|
349  | 
| _ => "Operator not of function type.");  | 
|
| 5635 | 350  | 
val text = unif_failed msg ^  | 
351  | 
cat_lines (appl_error prt prT why t' T' u' U');  | 
|
| 3784 | 352  | 
in raise TYPE (text, [T', U'], [t', u']) end;  | 
| 2979 | 353  | 
|
354  | 
fun err_constraint msg bs t T U =  | 
|
355  | 
let  | 
|
356  | 
val ([t'], [T', U']) = prep_output bs [t] [T, U];  | 
|
357  | 
val text = cat_lines  | 
|
358  | 
[unif_failed msg,  | 
|
| 5635 | 359  | 
"Cannot meet type constraint:", "",  | 
360  | 
Pretty.string_of  | 
|
361  | 
(Pretty.block [Pretty.str "Term:", Pretty.brk 2, prt t',  | 
|
362  | 
Pretty.str " ::", Pretty.brk 1, prT T']),  | 
|
363  | 
Pretty.string_of  | 
|
364  | 
(Pretty.block [Pretty.str "Type:", Pretty.brk 2, prT U']), ""];  | 
|
| 3784 | 365  | 
in raise TYPE (text, [T', U'], [t']) end;  | 
| 2979 | 366  | 
|
367  | 
||
368  | 
(* main *)  | 
|
369  | 
||
370  | 
val unif = unify classrel arities;  | 
|
| 
2957
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
371  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
372  | 
fun inf _ (PConst (_, T)) = T  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
373  | 
| inf _ (PFree (_, T)) = T  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
374  | 
| inf _ (PVar (_, T)) = T  | 
| 2979 | 375  | 
| inf bs (PBound i) = snd (nth_elem (i, bs) handle LIST _ => err_loose i)  | 
| 
2957
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
376  | 
      | inf bs (PAbs (x, T, t)) = PType ("fun", [T, inf ((x, T) :: bs) t])
 | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
377  | 
| inf bs (PAppl (t, u)) =  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
378  | 
let  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
379  | 
val T = inf bs t;  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
380  | 
val U = inf bs u;  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
381  | 
val V = mk_param [];  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
382  | 
            val U_to_V = PType ("fun", [U, V]);
 | 
| 
4957
 
30c49821e61f
remove seq2, scan (use seq2, foldl_map from library.ML);
 
wenzelm 
parents: 
3784 
diff
changeset
 | 
383  | 
val _ = unif (U_to_V, T) handle NO_UNIFIER msg => err_appl msg bs t T u U;  | 
| 
2957
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
384  | 
in V end  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
385  | 
| inf bs (Constraint (t, U)) =  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
386  | 
let val T = inf bs t in  | 
| 
4957
 
30c49821e61f
remove seq2, scan (use seq2, foldl_map from library.ML);
 
wenzelm 
parents: 
3784 
diff
changeset
 | 
387  | 
unif (T, U) handle NO_UNIFIER msg => err_constraint msg bs t T U;  | 
| 
2957
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
388  | 
T  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
389  | 
end;  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
390  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
391  | 
in inf [] end;  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
392  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
393  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
394  | 
(* infer_types *)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
395  | 
|
| 2979 | 396  | 
fun infer_types prt prT const_type classrel arities used freeze is_param ts Ts =  | 
| 
2957
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
397  | 
let  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
398  | 
(*convert to preterms/typs*)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
399  | 
val (Tps, Ts') = pretyps_of (K true) ([], Ts);  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
400  | 
val ((vps, ps), ts') = preterms_of const_type is_param (([], Tps), ts);  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
401  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
402  | 
(*run type inference*)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
403  | 
val tTs' = ListPair.map Constraint (ts', Ts');  | 
| 2979 | 404  | 
val _ = seq (fn t => (infer prt prT classrel arities t; ())) tTs';  | 
| 
2957
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
405  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
406  | 
(*collect result unifier*)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
407  | 
fun ch_var (xi, Link (r as ref (Param S))) = (r := PTVar (xi, S); None)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
408  | 
| ch_var xi_T = Some xi_T;  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
409  | 
val env = mapfilter ch_var Tps;  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
410  | 
|
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
411  | 
(*convert back to terms/typs*)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
412  | 
val mk_var =  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
413  | 
if freeze then PTFree  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
414  | 
else (fn (x, S) => PTVar ((x, 0), S));  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
415  | 
val (final_Ts, final_ts) = typs_terms_of used mk_var "" (Ts', ts');  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
416  | 
val final_env = map (apsnd simple_typ_of) env;  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
417  | 
in  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
418  | 
(final_ts, final_Ts, final_env)  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
419  | 
end;  | 
| 
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
420  | 
|
| 
4957
 
30c49821e61f
remove seq2, scan (use seq2, foldl_map from library.ML);
 
wenzelm 
parents: 
3784 
diff
changeset
 | 
421  | 
|
| 
2957
 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 
wenzelm 
parents:  
diff
changeset
 | 
422  | 
end;  |