diff options
| author | herbelin | 2009-07-08 11:52:51 +0000 |
|---|---|---|
| committer | herbelin | 2009-07-08 11:52:51 +0000 |
| commit | cb0a4dbc77da083e866e88523dc30244b1e25117 (patch) | |
| tree | 5b012d0acdb3b1b5a5dd11395c997e2bb3fa0ec7 | |
| parent | 1b1d30e94cc564ac9d05fe52ca952ceddf84c377 (diff) | |
Add heuristic based on non-linearity of evars to determine whether an
evar is dependent or not (solve bug #2123).
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@12228 85f007b7-540e-0410-9357-904b9bb8a0f7
| -rw-r--r-- | pretyping/evarutil.ml | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/pretyping/evarutil.ml b/pretyping/evarutil.ml index 9d2c56e6be..7e4c9358e5 100644 --- a/pretyping/evarutil.ml +++ b/pretyping/evarutil.ml @@ -116,11 +116,27 @@ let push_dependent_evars sigma emap = (sigma',emap') (collect_evars emap' ccl)) emap (sigma,emap) +let push_duplicated_evars sigma emap c = + let rec collrec (one,(sigma,emap) as acc) c = + match kind_of_term c with + | Evar (evk,_) when not (Evd.mem sigma evk) -> + if List.mem evk one then + let sigma' = Evd.add sigma evk (Evd.find emap evk) in + let emap' = Evd.remove emap evk in + (one,(sigma',emap')) + else + (evk::one,(sigma,emap)) + | _ -> + fold_constr collrec acc c + in + snd (collrec ([],(sigma,emap)) c) + (* replaces a mapping of existentials into a mapping of metas. Problem if an evar appears in the type of another one (pops anomaly) *) let evars_to_metas sigma (emap, c) = let emap = nf_evars emap in let sigma',emap' = push_dependent_evars sigma emap in + let sigma',emap' = push_duplicated_evars sigma' emap' c in let change_exist evar = let ty = nf_betaiota emap (existential_type emap evar) in let n = new_meta() in |
