Есть два способа работы с этим, кроме использования pose proof
.
Использование specialize
.
Эта тактика позволяет вам приводить аргументы к вашим гипотезам. В вашем случае вы можете сделать
specialize (H I).
или даже
specialize H with (1 := I).
, и вы можете использовать as
, если хотите создать копию, а не создавать экземпляр H
напрямую.
Использование forward
.
Я думаю, это то, что вы хотите здесь. forward H.
попросит вас доказать первую гипотезу H
. Таким образом, вы будете делать что-то вроде этого:
forward H.
- auto.
- (* Then resume with H : P *)
, но вы также можете предоставить ему (закрытие цели) tacti c:
forward H by auto.
(* Now you have one goal, and H has type P *)
forward
is - as пока - не является частью стандартной библиотеки. Однако его можно определить довольно легко (вот определение из библиотеки MetaCoq).
Ltac forward_gen H tac :=
match type of H with
| ?X -> _ => let H' := fresh in assert (H':X) ; [tac|specialize (H H'); clear H']
end.
Tactic Notation "forward" constr(H) := forward_gen H ltac:(idtac).
Tactic Notation "forward" constr(H) "by" tactic(tac) := forward_gen H tac.
Обратите внимание, что simpl
здесь не работает, потому что на самом деле это не тактика c для Упростите гипотезы в обычном смысле, это действительно просто тактика c, чтобы применить некоторые правила вычислений, в основном она оценивает цель или гипотезу, к которой вы ее применили. True -> P
не уменьшается до P
, потому что тогда потребуется меньше аргументов.