diff options
| author | Pierre-Marie Pédrot | 2020-12-24 20:27:42 +0100 |
|---|---|---|
| committer | Pierre-Marie Pédrot | 2021-04-20 10:54:34 +0200 |
| commit | 9caadc38de0e1c7b3362081da9482fc4455220a7 (patch) | |
| tree | a558de42a067099d5ec638df10b18f1e3e4f3a06 /engine/termops.ml | |
| parent | 4bdd1242d22e0870f2f0c97a83ece7e7eeeea7a1 (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.ml | 13 |
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 |
