src/Pure/pattern.ML
changeset 33038 8f9594c31de4
parent 33037 b22e44496dc2
child 33049 c38f02fdf35d
equal deleted inserted replaced
33037:b22e44496dc2 33038:8f9594c31de4
   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;