Я хочу построить экзистенциальную переменную в интерактивном режиме.Я не могу использовать Захватить экзистенциальные переменные , потому что мне нужно заполнить экзистенциальные, прежде чем я достигну цели.
Минимальный пример Вот минимальный пример (поскольку он прост, у него есть другие решения, но он иллюстрирует мой вопрос)
Context (A:Type).
Parameter P Q: A -> Prop.
Definition filter: forall {a}, P a -> A:= fun a Pa=> a.
Lemma my_lemma:
forall a b, Q b -> (Q b -> P a) ->
exists a (H: P a), P (filter H).
Proof.
intros ?? H H0.
do 2 eexists.
На данный момент естьдва решения, которые не отвечают на мои вопросы: (1) я могу запустить (eauto
), а затем выполнить Grab Existential Variables
, но предположим, что eauto не будет успешным, пока я не создам экземпляр переменной объединения;(2) Я мог бы просто явно передать термин доказательства с помощью instantiate(1:= H0 H)
(или даже instantiate(1:= ltac:(eauto))
), но предположить, что доказательство xistential было утомительным, и мы хотели сделать это в интерактивном режиме.
Что еще можетмы делаем?Мы можем попытаться использовать cut
или assert
, например, так:
match goal with
|[|- P (filter ?x)] =>
match type of x with
| ?T => assert (HH:T) by eauto
end
end.
Но HH не находится в контексте переменной объединения, поэтому его нельзя создать.
instantiate(1:=HH). (* Instance is not well-typed in the environment of ?H. *)
Насколько я могу судить, единственный способ решить эту проблему - использовать Show Existentials
, посмотреть тип переменной, скопировать ее вручную, откатить доказательство до того, как объединение было введено, и построить переменную там.,В примере это выглядит так:
Lemma my_lemma:
forall a b, Q b -> (Q b -> P a) ->
exists a (H: P a), P (filter H).
Proof.
intros ?? H H0.
do 2 eexists.
Show Existentials.
Restart. (* This command restores the proof editing process to the original goal. *)
intros ?? H H0.
assert (HH:P a) by eauto.
eexists; exists HH.
auto.
Qed.
Очевидно, я бы хотел избежать этого рабочего процесса.Итак, в любом случае, чтобы превратить экзистенциальные переменные в подцели?