147 let |
147 let |
148 val tyenv = Envir.type_env env; |
148 val tyenv = Envir.type_env env; |
149 val (Ts, U) = split_type (Envir.norm_type tyenv T, n, []); |
149 val (Ts, U) = split_type (Envir.norm_type tyenv T, n, []); |
150 in map (nth Ts) is ---> U end; |
150 in map (nth Ts) is ---> U end; |
151 |
151 |
152 fun mkhnf (binders,is,G,js) = mkabs (binders, is, app(G,js)); |
152 fun mk_hnf (binders,is,G,js) = mkabs (binders, is, app(G,js)); |
153 |
153 |
154 fun mknewhnf(env,binders,is,F as (a,_),T,js) = |
154 fun mk_new_hnf(env,binders,is,F as (a,_),T,js) = |
155 let val (env',G) = Envir.genvar a (env,type_of_G env (T,length is,js)) |
155 let val (env',G) = Envir.genvar a (env,type_of_G env (T,length is,js)) |
156 in Envir.update ((F, T), mkhnf (binders, is, G, js)) env' end; |
156 in Envir.update ((F, T), mk_hnf (binders, is, G, js)) env' end; |
157 |
157 |
158 |
158 |
159 (*predicate: downto0 (is, n) <=> is = [n, n - 1, ..., 0]*) |
159 (*predicate: downto0 (is, n) <=> is = [n, n - 1, ..., 0]*) |
160 fun downto0 (i :: is, n) = i = n andalso downto0 (is, n - 1) |
160 fun downto0 (i :: is, n) = i = n andalso downto0 (is, n - 1) |
161 | downto0 ([], n) = n = ~1; |
161 | downto0 ([], n) = n = ~1; |
188 val ks = mk_proj_list js'; |
188 val ks = mk_proj_list js'; |
189 val ls = map_filter I js' |
189 val ls = map_filter I js' |
190 val Hty = type_of_G env (Fty,length js,ks) |
190 val Hty = type_of_G env (Fty,length js,ks) |
191 val (env',H) = Envir.genvar a (env,Hty) |
191 val (env',H) = Envir.genvar a (env,Hty) |
192 val env'' = |
192 val env'' = |
193 Envir.update ((F, Fty), mkhnf (binders, js, H, ks)) env' |
193 Envir.update ((F, Fty), mk_hnf (binders, js, H, ks)) env' |
194 in (app(H,ls),env'') end |
194 in (app(H,ls),env'') end |
195 | _ => raise Pattern)) |
195 | _ => raise Pattern)) |
196 and prs(s::ss,env,d,binders) = |
196 and prs(s::ss,env,d,binders) = |
197 let val (s',env1) = pr(s,env,d,binders) |
197 let val (s',env1) = pr(s,env,d,binders) |
198 val (ss',env2) = prs(ss,env1,d,binders) |
198 val (ss',env2) = prs(ss,env1,d,binders) |
212 in mk(is,js,length is-1) end; |
212 in mk(is,js,length is-1) end; |
213 |
213 |
214 fun flexflex1(env,binders,F,Fty,is,js) = |
214 fun flexflex1(env,binders,F,Fty,is,js) = |
215 if is=js then env |
215 if is=js then env |
216 else let val ks = mk_ff_list(is,js) |
216 else let val ks = mk_ff_list(is,js) |
217 in mknewhnf(env,binders,is,F,Fty,ks) end; |
217 in mk_new_hnf(env,binders,is,F,Fty,ks) end; |
218 |
218 |
219 fun flexflex2(env,binders,F,Fty,is,G,Gty,js) = |
219 fun flexflex2(env,binders,F,Fty,is,G,Gty,js) = |
220 let fun ff(F,Fty,is,G as (a,_),Gty,js) = |
220 let fun ff(F,Fty,is,G as (a,_),Gty,js) = |
221 if subset (op =) (js, is) |
221 if subset (op =) (js, is) |
222 then let val t= mkabs(binders,is,app(Var(G,Gty),map (idx is) js)) |
222 then let val t= mkabs(binders,is,app(Var(G,Gty),map (idx is) js)) |