Рассмотрим следующую простую проблему:
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.
Моя текущая реализация saturate
создает H1
с каждой возможной комбинацией nat
гипотез, что приводит к квадратному c взрыву во времени и памяти Применение. Вместо этого я хотел бы, чтобы он осмотрел forall
и увидел, что для этого требуется R m n
, поэтому единственная комбинация параметров, которая имеет смысл в контексте, это a
, а затем b
.
Есть ли Известное решение этого? Моя интуиция состоит в том, чтобы использовать evars, но если бы я мог избежать их, не жертвуя при этом значительной производительностью, я бы хотел.