Elim与归纳

时间:2014-05-22 16:38:31

标签: coq

我想了解Coq上“elim”和“induction”的用法...... 为什么? 因为我曾经尝试做一些练习而且不明白为什么我必须使用“elim”和其他时间“归纳”......

例如:

Lemma parte2_1_b : forall l, sum(rev l) = sum l.
Proof.
intro.
induction l.
simpl.
reflexivity.
simpl.
SearchRewrite(_++_).
SearchAbout(_++_).
rewrite parte2_1_a.
simpl.
rewrite IHl.
SearchAbout(_+_).
rewrite <- plus_n_O.
(*omega.
Qed*)
(*
ring.
Qed.
*)
SearchRewrite(_+_).
rewrite plus_comm.
reflexivity.
Qed.

另一个例子:

Lemma parte2_1_c : forall l1 l2, Prefix l1 l2 -> sum l1 <= sum l2.
Proof.
intros.
elim H.
intros.
simpl.
SearchPattern(_<=_).
apply le_0_n.
intros.
simpl.
SearchPattern(_<=_).
(*omega*)
apply plus_le_compat_l.
assumption.
Qed.

我一直在寻找网站上的文档,我仍然不明白我该怎么选择正确的... 请有人帮助我吗?

缺少功能

Fixpoint sum (l: list nat) : nat := match l with
  | nil => 0
  | a::t => a + sum t
  end.

另一个功能:

Lemma parte2_1_a : forall l1 l2, sum (l1++l2) = sum l1 + sum l2.
Proof.
intros.
induction l1.
simpl.
reflexivity.
simpl.
(*
omega.
Qed.
*)
rewrite IHl1.
SearchRewrite(_+_).
rewrite plus_assoc.
reflexivity.
Qed.

我认为现在,您将可以立即运行该程序。

2 个答案:

答案 0 :(得分:1)

作为一般问题相关的建议,当我们无法运行您提供的代码时,很难帮助您。提供一个工作的最小示例或指向您使用的定义的指针。

至于你的问题,elim x.induction x.似乎做了非常相似的事情。据我所知,差异似乎是induction通过以下方式执行更多工作:

  • 在您的上下文中引入归纳假设,而elim将其量化为目标

  • 清理被导入的变量的上下文,而elim将其留在那里

他们可能在行为上有一些更具体的差异,但就证明而言,我相当确定它们同样强大(因为它们都称为你的类型的感应器)。所以你不应该太在意我相信。我个人从不使用elim而且总是使用感应,因为我倾向于喜欢它所做的额外工作。

答案 1 :(得分:0)

正如@Ptival所说,eliminduction对目标执行的操作几乎完全相同。您将看到的主要区别是目标的形状可能略有不同:例如elim将归纳假设留在目标中:

Lemma parte2_1_b : forall l, sum(rev l) = sum l.
Proof.
    intro.
    induction l.
    simpl.
    reflexivity.


1 subgoal
l : list nat
====================================================================== (1/1)
forall (a : nat) (l0 : list nat),
sum (rev l0) = sum l0 -> sum (rev (a :: l0)) = sum (a :: l0)

induction在上下文中命名它:

Lemma parte2_1_b : forall l, sum(rev l) = sum l.
Proof.
    intro.
    induction l.
    simpl.
    reflexivity.

1 subgoal
a : nat
l : list nat
IHl : sum (rev l) = sum l
====================================================================== (1/1)
sum (rev (a :: l)) = sum (a :: l)

在第一种情况下,如果你clear l; intros a l IHl,你最终将拥有与第二种目标完全相同的目标。

elim存在induction无法做到的非常特殊的用途,但我知道的唯一相关案例是针对硬核疯狂用户,这在大多数情况下都不是很有用。我已经使用Coq多年了,我只遇到过一次这样的情况,最后我并不是真的需要它,所以我建议你不要打扰自己,现在就坚持使用induction