Coq Elim与诱导

Coq Elim与诱导,coq,Coq,我想了解“elim”和“归纳法”在Coq上的用法。。。 为什么? 因为我试着做一些练习,不明白为什么有时我必须用“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. r

我想了解“elim”和“归纳法”在Coq上的用法。。。 为什么? 因为我试着做一些练习,不明白为什么有时我必须用“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.
另一项职能:

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.

我认为现在,您将能够运行该程序。

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

至于你的问题,
elim x.
inclusion x.
似乎在做非常相似的事情。就我所见,区别似乎在于
归纳法
通过以下方式执行更多的工作:

  • 在你的上下文中引入归纳假设,而
    elim
    将它们量化到目标中

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


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

正如@Ptival所说,
elim
归纳法
在目标上执行几乎完全相同的操作。您将看到的主要区别是目标的形状可能有点不同:例如,
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)
归纳法
在上下文中对其进行命名:

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)
在第一种情况下,如果执行
清除l;介绍一个国际人道主义法
,你最终的目标将与第二个目标完全相同


对于
elim
,存在着
inclusion
无法实现的非常特殊的用途,但我所知道的唯一相关案例是针对狂热的铁杆用户,这在大多数情况下并不真正有用。我已经使用Coq多年了,而且我只遇到过一次这样的情况,我最终并不真的需要它,所以我建议你不要自寻烦恼,现在就坚持使用
inclusion

如果我没记错的话,你是对的:
inclusion
可以被看作是
elim
的包装器,它将目标留在一个“更好”状态。基本上它们都适用于目标。我已经编辑了我的帖子并添加了缺少的函数!所以如果你不使用elim函数,我怎么能使用归纳函数呢?@Vinz不明白:(然后我忘记了使用elim,尝试使用归纳法?这就是我现在的建议:专注于
归纳法
,当你更熟悉它时再回到这个问题:)我尝试使用归纳法,但我被绊住了:/我确实在这里发布了一个问题:嘿@Vinz,我对
elim
的奇异用法很感兴趣:-)嗯,正如你所说的,归纳法让事情变得更难!我想我可能会继续使用elim函数:/我看到了另一个主题的反应,这比我想象的要难得多。
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)