让我们假设我们想要证明以下(完全做作的)引理。
Lemma lem : (forall n0 : nat, 0 <= n0 -> 0 <= S n0) -> forall n, le 0 n.
我们想申请nat_ind
来证明这一点。这是一个可能的证明:
Proof.
intros H n. apply nat_ind. constructor. exact H.
Qed.
但为什么不直接在应用策略中使用H
,使用apply (nat_ind _ _ H)
或eapply (nat_ind _ _ H)
之类的内容?但是第一个失败了,第二个隐藏了存在变量中的剩余目标。
是否有可能在apply
或其衍生物中跳过假设以指定其他参数,同时将其作为证据其余部分的经典目标?
答案 0 :(得分:2)
如果你这样做
intros. refine (nat_ind _ _ H _).
然后你只有
0 <= 0
留。这对你的情况有用吗?
答案 1 :(得分:1)
另一种方法(比我的其他答案更通用)将使用apply ... with ...
构造,如下所示:
intros H n.
apply nat_ind with (2 := H).
此处,2
指的是nat_ind
的归纳步骤参数(参见Coq v8.5参考手册,8.1.3):
在
(ref_1 := term_1) ... (ref_n := term_n)
形式的绑定列表中,ref是ident或 num 。 ...如果ref_i
是某个数字 n ,则此数字表示该术语的 n - 非依赖前提,由术语类型决定。
答案 2 :(得分:0)
这部分证据
intros H n.
apply nat_ind, H.
会给你0 <= 0
作为唯一的子目标。
这种方法使用apply
策略,但没有回答它的一般性问题,因为它只有在你想要实例化 last 参数时才会起作用(这是问题中的例子)。
以下是Coq参考手册中的引用:
apply term_1 , ... , term_n
这是
apply term_1 ; [ .. | ... ; [ .. | apply term_n ]... ]
的快捷方式,即term_(i+1)
从apply term_i
的应用开始term_1
生成的最后一个子目标的连续应用。
此外,由于它只是语法糖,因此在问题的背景下,解决方案可能被视为作弊(并且,我猜,滥用Coq战术开发者的原始意图)。