diff options
| author | Pierre-Marie Pédrot | 2020-09-09 11:07:52 +0200 |
|---|---|---|
| committer | Pierre-Marie Pédrot | 2020-09-09 11:07:52 +0200 |
| commit | 6f12c3e3ccce7028abb492f804d30ba0bef58f06 (patch) | |
| tree | db89fb070eead9bcf14880a9b3d3672b0f5bbf85 /engine/evarutil.ml | |
| parent | 215d3013312309d47dae01b66b1781b572d30783 (diff) | |
| parent | fbe0ea439ed3cf2ad933bd6094a36b5cebc5bd19 (diff) | |
Merge PR #7825: [tactics] Refine test for unresolved evars: not reachable from initial evars
Ack-by: JasonGross
Ack-by: Zimmi48
Reviewed-by: ejgallego
Reviewed-by: gares
Ack-by: jfehrle
Ack-by: maximedenes
Reviewed-by: ppedrot
Diffstat (limited to 'engine/evarutil.ml')
| -rw-r--r-- | engine/evarutil.ml | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/engine/evarutil.ml b/engine/evarutil.ml index d719731464..771571fd3f 100644 --- a/engine/evarutil.ml +++ b/engine/evarutil.ml @@ -516,12 +516,7 @@ let restrict_evar evd evk filter ?src candidates = let candidates = Option.map (filter_effective_candidates evd evar_info filter) candidates in match candidates with | Some [] -> raise (ClearDependencyError (*FIXME*)(Id.of_string "blah", (NoCandidatesLeft evk), None)) - | _ -> - let evd, evk' = Evd.restrict evk filter ?candidates ?src evd in - (* Mark new evar as future goal, removing previous one, - circumventing Proofview.advance but making Proof.run_tactic catch these. *) - let evd = Evd.remove_future_goal evd evk in - (Evd.declare_future_goal evk' evd, evk') + | _ -> Evd.restrict evk filter ?candidates ?src evd let rec check_and_clear_in_constr env evdref err ids global c = (* returns a new constr where all the evars have been 'cleaned' @@ -703,10 +698,22 @@ let rec advance sigma evk = match evi.evar_body with | Evar_empty -> Some evk | Evar_defined v -> - match is_restricted_evar sigma evk with + match is_aliased_evar sigma evk with | Some evk -> advance sigma evk | None -> None +let reachable_from_evars sigma evars = + let aliased = Evd.get_aliased_evars sigma in + let rec search evk visited = + if Evar.Set.mem evk visited then visited + else + let visited = Evar.Set.add evk visited in + match Evar.Map.find evk aliased with + | evk' -> search evk' visited + | exception Not_found -> visited + in + Evar.Set.fold (fun evk visited -> search evk visited) evars Evar.Set.empty + (** The following functions return the set of undefined evars contained in the object, the defined evars being traversed. This is roughly a combination of the previous functions and |
