diff options
author | 2018-01-06 16:37:06 +0900 | |
---|---|---|
committer | 2018-01-17 14:54:14 +0900 | |
commit | 58d209fe36e37b6c0ee4acd702dac333388b1b88 (patch) | |
tree | 856dcf2dc6b5e9ca2eb083c7640c07ae04308be8 /engine/termops.ml | |
parent | 8ea2a8307a8d96f8275ebbd9bd4cbd1f6b0a00c6 (diff) |
Use let-in aware prod_applist_assum in dtauto and firstorder.
Fixes #6490.
`prod_applist_assum` is copied from `kernel/term.ml` to `engine/termops.ml`,
and adjusted to work with econstr.
This change uncovered a bug in `Hipattern.match_with_nodep_ind`, where
`has_nodep_prod_after` counts both products and let-ins, but was only
being passed `mib.mind_nparams`, which does not count let-ins.
Replaced with (Context.Rel.length mib.mind_params_ctxt).
Diffstat (limited to 'engine/termops.ml')
-rw-r--r-- | engine/termops.ml | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/engine/termops.ml b/engine/termops.ml index a71bdff31..40b3d0d8b 100644 --- a/engine/termops.ml +++ b/engine/termops.ml @@ -1463,6 +1463,18 @@ let prod_applist sigma c l = | _ -> anomaly (Pp.str "Not enough prod's.") in app [] c l +let prod_applist_assum sigma n c l = + let open EConstr in + let rec app n subst c l = + if Int.equal n 0 then + if l == [] then Vars.substl subst c + else anomaly (Pp.str "Not enough arguments.") + else match EConstr.kind sigma c, l with + | Prod(_,_,c), arg::l -> app (n-1) (arg::subst) c l + | LetIn(_,b,_,c), _ -> app (n-1) (Vars.substl subst b::subst) c l + | _ -> anomaly (Pp.str "Not enough prod/let's.") in + app n [] c l + (* Combinators on judgments *) let on_judgment f j = { uj_val = f j.uj_val; uj_type = f j.uj_type } |