src/Pure/variable.ML
changeset 21355 5c1b1ae737e1
parent 21287 a713ae348e8a
child 21369 6cca4865e388
equal deleted inserted replaced
21354:2207380f7576 21355:5c1b1ae737e1
   170       (case default_type ctxt x' of
   170       (case default_type ctxt x' of
   171         SOME T => Vartab.update ((x, ~1), T)
   171         SOME T => Vartab.update ((x, ~1), T)
   172       | NONE => I);
   172       | NONE => I);
   173   in fold_rev decl (fixes_of ctxt) types end));
   173   in fold_rev decl (fixes_of ctxt) types end));
   174 
   174 
       
   175 fun constrain_tvar (xi, S) =
       
   176   if S = dummyS then Vartab.delete_safe xi else Vartab.update (xi, S);
       
   177 
   175 fun declare_constraints t = map_constraints (fn (types, sorts) =>
   178 fun declare_constraints t = map_constraints (fn (types, sorts) =>
   176   let
   179   let
   177     val types' = fold_aterms
   180     val types' = fold_aterms
   178       (fn Free (x, T) => Vartab.update ((x, ~1), T)
   181       (fn Free (x, T) => Vartab.update ((x, ~1), T)
   179         | Var v => Vartab.update v
   182         | Var v => Vartab.update v
   180         | _ => I) t types;
   183         | _ => I) t types;
   181     val sorts' = fold_types (fold_atyps
   184     val sorts' = fold_types (fold_atyps
   182       (fn TFree (x, S) => Vartab.update ((x, ~1), S)
   185       (fn TFree (x, S) => constrain_tvar ((x, ~1), S)
   183         | TVar v => Vartab.update v
   186         | TVar v => constrain_tvar v
   184         | _ => I)) t sorts;
   187         | _ => I)) t sorts;
   185   in (types', sorts') end)
   188   in (types', sorts') end)
   186   #> declare_type_names t
   189   #> declare_type_names t
   187   #> redeclare_skolems;
   190   #> redeclare_skolems;
   188 
   191