135 |
135 |
136 |
136 |
137 (* split_type ([T1,....,Tn]---> T,n,[]) = ([Tn,...,T1],T) *) |
137 (* split_type ([T1,....,Tn]---> T,n,[]) = ([Tn,...,T1],T) *) |
138 fun split_type (T,0,Ts) = (Ts,T) |
138 fun split_type (T,0,Ts) = (Ts,T) |
139 | split_type (Type ("fun",[T1,T2]),n,Ts) = split_type (T2,n-1,T1::Ts) |
139 | split_type (Type ("fun",[T1,T2]),n,Ts) = split_type (T2,n-1,T1::Ts) |
140 | split_type _ = error("split_type"); |
140 | split_type _ = raise Fail "split_type"; |
141 |
141 |
142 fun type_of_G env (T, n, is) = |
142 fun type_of_G env (T, n, is) = |
143 let |
143 let |
144 val tyenv = Envir.type_env env; |
144 val tyenv = Envir.type_env env; |
145 val (Ts, U) = split_type (Envir.norm_type tyenv T, n, []); |
145 val (Ts, U) = split_type (Envir.norm_type tyenv T, n, []); |
202 (* mk_ff_list(is,js) = [ length(is) - k | 1 <= k <= |is| and is[k] = js[k] ] *) |
202 (* mk_ff_list(is,js) = [ length(is) - k | 1 <= k <= |is| and is[k] = js[k] ] *) |
203 fun mk_ff_list(is,js) = |
203 fun mk_ff_list(is,js) = |
204 let fun mk([],[],_) = [] |
204 let fun mk([],[],_) = [] |
205 | mk(i::is,j::js, k) = if (i:int) = j then k :: mk(is,js,k-1) |
205 | mk(i::is,j::js, k) = if (i:int) = j then k :: mk(is,js,k-1) |
206 else mk(is,js,k-1) |
206 else mk(is,js,k-1) |
207 | mk _ = error"mk_ff_list" |
207 | mk _ = raise Fail "mk_ff_list" |
208 in mk(is,js,length is-1) end; |
208 in mk(is,js,length is-1) end; |
209 |
209 |
210 fun flexflex1(env,binders,F,Fty,is,js) = |
210 fun flexflex1(env,binders,F,Fty,is,js) = |
211 if is=js then env |
211 if is=js then env |
212 else let val ks = mk_ff_list(is,js) |
212 else let val ks = mk_ff_list(is,js) |