应用部分实例化的引理

时间:2016-05-13 13:48:10

标签: coq

让我们假设我们想要证明以下(完全做作的)引理。

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或其衍生物中跳过假设以指定其他参数,同时将其作为证据其余部分的经典目标?

3 个答案:

答案 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战术开发者的原始意图)。