aboutsummaryrefslogtreecommitdiff
path: root/engine/termops.ml
diff options
context:
space:
mode:
authorPierre-Marie Pédrot2020-12-24 20:27:42 +0100
committerPierre-Marie Pédrot2021-04-20 10:54:34 +0200
commit9caadc38de0e1c7b3362081da9482fc4455220a7 (patch)
treea558de42a067099d5ec638df10b18f1e3e4f3a06 /engine/termops.ml
parent4bdd1242d22e0870f2f0c97a83ece7e7eeeea7a1 (diff)
More efficient variable membership check for Logic.move.
Instead of repeatedly crawling the same hypothesis again and again we only iter the term once.
Diffstat (limited to 'engine/termops.ml')
-rw-r--r--engine/termops.ml13
1 files changed, 13 insertions, 0 deletions
diff --git a/engine/termops.ml b/engine/termops.ml
index d60aa69ccb..a0248fa01b 100644
--- a/engine/termops.ml
+++ b/engine/termops.ml
@@ -839,6 +839,16 @@ let occur_var env sigma id c =
in
try occur_rec c; false with Occur -> true
+let occur_vars env sigma ids c =
+ let rec occur_rec c =
+ match EConstr.destRef sigma c with
+ | gr, _ ->
+ let vars = vars_of_global env gr in
+ if not (Id.Set.is_empty (Id.Set.inter ids vars)) then raise Occur
+ | exception DestKO -> EConstr.iter sigma occur_rec c
+ in
+ try occur_rec c; false with Occur -> true
+
exception OccurInGlobal of GlobRef.t
let occur_var_indirectly env sigma id c =
@@ -853,6 +863,9 @@ let occur_var_indirectly env sigma id c =
let occur_var_in_decl env sigma hyp decl =
NamedDecl.exists (occur_var env sigma hyp) decl
+let occur_vars_in_decl env sigma hyps decl =
+ NamedDecl.exists (occur_vars env sigma hyps) decl
+
let local_occur_var sigma id c =
let rec occur c = match EConstr.kind sigma c with
| Var id' -> if Id.equal id id' then raise Occur