218 |
218 |
219 (*"Resolve" version. Note: res_inst_tac cannot behave sensibly if the |
219 (*"Resolve" version. Note: res_inst_tac cannot behave sensibly if the |
220 terms that are substituted contain (term or type) unknowns from the |
220 terms that are substituted contain (term or type) unknowns from the |
221 goal, because it is unable to instantiate goal unknowns at the same time. |
221 goal, because it is unable to instantiate goal unknowns at the same time. |
222 |
222 |
223 The type checker freezes all flexible type vars that were introduced during |
223 The type checker is instructed not to freezes flexible type vars that |
224 type inference and still remain in the term at the end. This avoids the |
224 were introduced during type inference and still remain in the term at the |
225 introduction of flexible type vars in goals and other places where they |
225 end. This increases flexibility but can introduce schematic type vars in |
226 could cause complications. If you really want a flexible type var, you |
226 goals. |
227 have to put it in yourself as a constraint. |
|
228 |
|
229 This policy breaks down when a list of substitutions is type checked: later |
|
230 pairs may force type instantiations in earlier pairs, which is impossible, |
|
231 because the type vars in the earlier pairs are already frozen. |
|
232 *) |
227 *) |
233 fun res_inst_tac sinsts rule i = |
228 fun res_inst_tac sinsts rule i = |
234 compose_inst_tac sinsts (false, rule, nprems_of rule) i; |
229 compose_inst_tac sinsts (false, rule, nprems_of rule) i; |
235 |
230 |
236 (*eresolve (elimination) version*) |
231 (*eresolve (elimination) version*) |