Coq Elim与诱导
我想了解“elim”和“归纳法”在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
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)