214 else let val ks = mk_ff_list(is,js) |
214 else let val ks = mk_ff_list(is,js) |
215 in mknewhnf(env,binders,is,F,Fty,ks) end; |
215 in mknewhnf(env,binders,is,F,Fty,ks) end; |
216 |
216 |
217 fun flexflex2(env,binders,F,Fty,is,G,Gty,js) = |
217 fun flexflex2(env,binders,F,Fty,is,G,Gty,js) = |
218 let fun ff(F,Fty,is,G as (a,_),Gty,js) = |
218 let fun ff(F,Fty,is,G as (a,_),Gty,js) = |
219 if gen_subset (op =) (js, is) |
219 if subset (op =) (js, is) |
220 then let val t= mkabs(binders,is,app(Var(G,Gty),map (idx is) js)) |
220 then let val t= mkabs(binders,is,app(Var(G,Gty),map (idx is) js)) |
221 in Envir.update (((F, Fty), t), env) end |
221 in Envir.update (((F, Fty), t), env) end |
222 else let val ks = gen_inter (op =) (is, js) |
222 else let val ks = inter (op =) (is, js) |
223 val Hty = type_of_G env (Fty,length is,map (idx is) ks) |
223 val Hty = type_of_G env (Fty,length is,map (idx is) ks) |
224 val (env',H) = Envir.genvar a (env,Hty) |
224 val (env',H) = Envir.genvar a (env,Hty) |
225 fun lam(is) = mkabs(binders,is,app(H,map (idx is) ks)); |
225 fun lam(is) = mkabs(binders,is,app(H,map (idx is) ks)); |
226 in Envir.update (((G, Gty), lam js), Envir.update (((F, Fty), lam is), env')) |
226 in Envir.update (((G, Gty), lam js), Envir.update (((F, Fty), lam is), env')) |
227 end; |
227 end; |
337 |
337 |
338 fun match_bind(itms,binders,ixn,T,is,t) = |
338 fun match_bind(itms,binders,ixn,T,is,t) = |
339 let val js = loose_bnos t |
339 let val js = loose_bnos t |
340 in if null is |
340 in if null is |
341 then if null js then Vartab.update_new (ixn, (T, t)) itms else raise MATCH |
341 then if null js then Vartab.update_new (ixn, (T, t)) itms else raise MATCH |
342 else if gen_subset (op =) (js, is) |
342 else if subset (op =) (js, is) |
343 then let val t' = if downto0(is,length binders - 1) then t |
343 then let val t' = if downto0(is,length binders - 1) then t |
344 else mapbnd (idx is) t |
344 else mapbnd (idx is) t |
345 in Vartab.update_new (ixn, (T, mkabs (binders, is, t'))) itms end |
345 in Vartab.update_new (ixn, (T, mkabs (binders, is, t'))) itms end |
346 else raise MATCH |
346 else raise MATCH |
347 end; |
347 end; |