Coq 我如何在假设中将一个具体变量转换为一个存在量化的var?

Coq 我如何在假设中将一个具体变量转换为一个存在量化的var?,coq,Coq,假设我有这样一个假设: FooProp a b Lemma find_instr_in: forall c i, In i c <-> (exists z : Z, find_instr z c = Some i). H1: find_instr z c = Some i rewrite <- find_instr_in in H1 我想把假设换成这个形式: exists a, FooProp a b 我该怎么做 我知道我可以通过eauto来断言(存在a,

假设我有这样一个假设:

FooProp a b
Lemma find_instr_in: 
  forall c i,
   In i c <-> (exists z : Z, find_instr z c = Some i).
H1: find_instr z c = Some i
rewrite <- find_instr_in in H1
我想把假设换成这个形式:

exists a, FooProp a b
我该怎么做

我知道我可以通过eauto来断言(存在a,FooProp a b),但我正试图找到一个不需要我明确写下整个假设的解决方案;这不利于自动化,而且在假设不重要的情况下,这通常是一个令人头痛的问题。理想情况下,我想指定在H1中存在一个
intro\u
之类的东西;事情真的应该这么简单

编辑:为什么?因为我有这样一个引理:

FooProp a b
Lemma find_instr_in: 
  forall c i,
   In i c <-> (exists z : Z, find_instr z c = Some i).
H1: find_instr z c = Some i
rewrite <- find_instr_in in H1
我试着这样重写:

FooProp a b
Lemma find_instr_in: 
  forall c i,
   In i c <-> (exists z : Z, find_instr z c = Some i).
H1: find_instr z c = Some i
rewrite <- find_instr_in in H1

重写像这样的东西怎么样:

Ltac intro_exists' a H :=
  pattern a in H; apply ex_intro in H.

Tactic Notation "intro_exists" ident(a) "in" ident(H) := intro_exists' a H.

Section daryl.
  Variable A B : Type.
  Variable FooProp : A -> B -> Prop.

  Goal forall a b, FooProp a b -> False.
    intros.
    intro_exists a in H.
  Admitted.
End daryl.
关键是
模式
策略,它发现一个术语的出现,并将其抽象为一个应用于参数的函数。因此
模式a
H
的类型从
FooProp a b
转换为
(fun x=>FooProp x b)a
。在那之后,Coq可以理解你在应用
ex\u intro
时的意思


编辑: 尽管如此,在你的具体案例中,我实际上会推荐一种不同的方法,那就是不要这样陈述你的引理。相反,把它分成两个引理是很方便的,每个方向一个。向前的方向是一样的,但向后的方向应该重述如下

forall c i z, 
  find_instr z c = Some i -> In i c.
如果这样做,那么重写将成功,而不需要引入存在主义