src/Pure/pattern.ML
changeset 52130 86f7d8bc2a5f
parent 52129 3fd0fe916097
child 52131 366fa32ee2a3
equal deleted inserted replaced
52129:3fd0fe916097 52130:86f7d8bc2a5f
   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))