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 |