aboutsummaryrefslogtreecommitdiff
path: root/engine/evarutil.ml
diff options
context:
space:
mode:
authorPierre-Marie Pédrot2020-09-09 11:07:52 +0200
committerPierre-Marie Pédrot2020-09-09 11:07:52 +0200
commit6f12c3e3ccce7028abb492f804d30ba0bef58f06 (patch)
treedb89fb070eead9bcf14880a9b3d3672b0f5bbf85 /engine/evarutil.ml
parent215d3013312309d47dae01b66b1781b572d30783 (diff)
parentfbe0ea439ed3cf2ad933bd6094a36b5cebc5bd19 (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.ml21
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