diff options
| author | msozeau | 2010-02-22 01:40:01 +0000 |
|---|---|---|
| committer | msozeau | 2010-02-22 01:40:01 +0000 |
| commit | 5dba392f32f0da65a4f0331186e75b35fffa1bb7 (patch) | |
| tree | 5aeecbb22ba02626cc0d30df744a7841918ed94d /pretyping | |
| parent | 8db86b3a3d531c44d9a52cc5519122e5a3af3ed9 (diff) | |
Improve unification when evars and metas are mixed.
If we can't mimick a rhs in an ?evar = rhs situation, we first turn
all metas in rhs into evars before trying to solve the equation.
Problem reported by Eelis van der Weegen.
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@12801 85f007b7-540e-0410-9357-904b9bb8a0f7
Diffstat (limited to 'pretyping')
| -rw-r--r-- | pretyping/unification.ml | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/pretyping/unification.ml b/pretyping/unification.ml index d26195efc8..32b51eac49 100644 --- a/pretyping/unification.ml +++ b/pretyping/unification.ml @@ -637,11 +637,16 @@ let w_merge env with_types flags (evd,metas,evars) = else begin let rhs' = subst_meta_instances metas rhs in match kind_of_term rhs with - | App (f,cl) when is_mimick_head f & occur_meta rhs' -> + | App (f,cl) when occur_meta rhs' -> if occur_evar evn rhs' then error_occur_check env evd evn rhs'; - let evd' = mimick_evar evd flags f (Array.length cl) evn in - w_merge_rec evd' metas evars eqns + if is_mimick_head f then + let evd' = mimick_evar evd flags f (Array.length cl) evn in + w_merge_rec evd' metas evars eqns + else + let evd', rhs'' = pose_all_metas_as_evars env evd rhs' in + w_merge_rec (solve_simple_evar_eqn env evd' ev rhs'') + metas evars' eqns | _ -> w_merge_rec (solve_simple_evar_eqn env evd ev rhs') metas evars' eqns |
