说我有以下内容:
Lemma my_lemma :
forall a b c,
a -> (b -> c) -> d.
Proof.
intros.
然后,在线上方,我得到:
X : a
X0 : b -> c
假设在我的证明中,我知道我将在某处需要
c
。而且我知道如何从b
证明a
,但这不是很容易。一种可能是:
assert b.
+ (* proof of b here *)
+ (* proof using c here *)
在这个简单的案例中,这很轻松。但是,我想在不指定
b
的情况下达到相同的效果,因为我经常有更复杂前提的假设,我不想在assert
中明确输入。
pose
没有做我想做的事,因为它需要我先证明 a
,所以自动化策略也不起作用,因为他们不知道我正在尝试证明 a
。 apply
也没有做我想做的事,因为它要求我首先将我的目标变成与暗示相同的形式,这也不适合自动化策略。
总而言之,我希望能够采取假设
H
这是一个暗示,并得到两个子目标:
H
的前提。H
的结论作为一个新的假设。
而且我想在不明确输入H
的前提的情况下执行此操作。lapply
最接近期望的行为:
变体
lapply <term>
此策略适用于任何目标,例如
。参数术语必须在当前上下文中格式正确,其类型可简化为非依赖产品G
和A -> B
可能包含产品。然后它生成两个子目标B
和B->G
。应用A
(其中lapply H
具有类型H
并且A->B
不以产品开头)与给出序列B
相同,其中cut B. 2:apply H.
如下所述。cut
在你的例子中,我们得到:
Lemma my_lemma :
forall a b c d,
a -> (b -> c) -> d.
Proof.
intros.
lapply X0.
+ intro.
(* prove d using c *)
admit.
+ (* prove b *)
admit.
Admitted.