Coq 将策略应用于前提而不是目标

Coq 将策略应用于前提而不是目标,coq,Coq,如果目标状态如下所示: a : Prop b : Prop H1 : a H2 : b -> c ============================ c 然后我可以使用apply H2策略将其转换为以下状态: a : Prop b : Prop H1 : a H2 : b -> c ============================ b 现在,我想做同样的事情,只是为了假设: a : Prop b : Pro

如果目标状态如下所示:

  a : Prop
  b : Prop
  H1 : a
  H2 : b -> c
  ============================
   c
然后我可以使用
apply H2
策略将其转换为以下状态:

  a : Prop
  b : Prop
  H1 : a
  H2 : b -> c
  ============================
   b
现在,我想做同样的事情,只是为了假设:

  a : Prop
  b : Prop
  H1 : a
  H2 : b -> a
  ============================
   b
我想引入一个新的假设(或者简化现有的假设),这样我就有了一个新的
H3:b
。可能吗

我尝试了各种不同的
apply
,但一切都导致了某种错误。达到上述状态的代码:

Lemma test : forall {a b : Prop},
    a /\ (b -> a) -> b.
Proof.
  intros a b.
  intros [H1 H2].
Abort.

这是不可能的,因为你的
测试
引理不成立。例如,将
a
设为
True
,将
b
设为
False
。两个前提(
a
b->a
)都成立,但
b
不成立

但是,如果您稍微更改一下结果声明,这将起作用:

Lemma test : forall a b : Prop, a /\ (a -> b) -> b.
Proof. intros [H1 H2]. apply H2 in H1. exact H1. Qed.

这是不可能的,因为你的
测试
引理不成立。例如,将
a
设为
True
,将
b
设为
False
。两个前提(
a
b->a
)都成立,但
b
不成立

但是,如果您稍微更改一下结果声明,这将起作用:

Lemma test : forall a b : Prop, a /\ (a -> b) -> b.
Proof. intros [H1 H2]. apply H2 in H1. exact H1. Qed.