src/Pure/pattern.ML
changeset 52133 f8cd46077224
parent 52131 366fa32ee2a3
child 52179 3b9c31867707
equal deleted inserted replaced
52132:fa9e563f6bcf 52133:f8cd46077224
   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)