src/Pure/type_infer.ML
changeset 17282 43c86fedec82
parent 17271 2756a73f63a5
child 17496 26535df536ae
equal deleted inserted replaced
17281:3b9ff0131ed1 17282:43c86fedec82
   109 fun polymorphicT T = Type ("_polymorphic_", [T]);
   109 fun polymorphicT T = Type ("_polymorphic_", [T]);
   110 
   110 
   111 fun pretyp_of is_param (params, typ) =
   111 fun pretyp_of is_param (params, typ) =
   112   let
   112   let
   113     fun add_parms (TVar (xi as (x, _), S)) ps =
   113     fun add_parms (TVar (xi as (x, _), S)) ps =
   114           if is_param xi andalso is_none (AList.lookup (op =) ps xi)
   114           if is_param xi andalso not (AList.defined (op =) ps xi)
   115           then (xi, mk_param S) :: ps else ps
   115           then (xi, mk_param S) :: ps else ps
   116       | add_parms (TFree _) ps = ps
   116       | add_parms (TFree _) ps = ps
   117       | add_parms (Type (_, Ts)) ps = fold add_parms Ts ps;
   117       | add_parms (Type (_, Ts)) ps = fold add_parms Ts ps;
   118 
   118 
   119     val params' = add_parms typ params;
   119     val params' = add_parms typ params;
   135 (* preterm(s)_of *)
   135 (* preterm(s)_of *)
   136 
   136 
   137 fun preterm_of const_type is_param ((vparams, params), tm) =
   137 fun preterm_of const_type is_param ((vparams, params), tm) =
   138   let
   138   let
   139     fun add_vparm (ps, xi) =
   139     fun add_vparm (ps, xi) =
   140       if is_none (AList.lookup (op =) ps xi) then
   140       if not (AList.defined (op =) ps xi) then
   141         (xi, mk_param []) :: ps
   141         (xi, mk_param []) :: ps
   142       else ps;
   142       else ps;
   143 
   143 
   144     fun add_vparms (ps, Var (xi, Type ("_polymorphic_", _))) = ps
   144     fun add_vparms (ps, Var (xi, Type ("_polymorphic_", _))) = ps
   145       | add_vparms (ps, Var (xi, _)) = add_vparm (ps, xi)
   145       | add_vparms (ps, Var (xi, _)) = add_vparm (ps, xi)