Consider the following simple problem:
Goal forall (R : relation nat) (a b c d e f g h : nat),
(forall m n : nat, R m n -> False) -> (R a b) -> False.
Proof.
intros ? a b c d e f g h H1 H2.
saturate H1. (* <-- TODO implement this *)
assumption.
Qed.
My current implementation of saturate
instantiates H1
with every possible combination of nat
hypotheses, leading to quadratic blowup in time and memory usage. Instead I would like it to inspect forall
and see that it requires a R m n
, so the only combination of parameters that makes sense in context is a
and then b
.
Is there a known solution to this? My intuition is to use evars, but if I could avoid them without sacrificing significant performance I would like to.