我想了解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.
我认为现在,您将可以立即运行该程序。
答案 0 :(得分:1)
作为一般问题相关的建议,当我们无法运行您提供的代码时,很难帮助您。提供一个工作的最小示例或指向您使用的定义的指针。
至于你的问题,elim x.
和induction x.
似乎做了非常相似的事情。据我所知,差异似乎是induction
通过以下方式执行更多工作:
在您的上下文中引入归纳假设,而elim
将其量化为目标
清理被导入的变量的上下文,而elim
将其留在那里
他们可能在行为上有一些更具体的差异,但就证明而言,我相当确定它们同样强大(因为它们都称为你的类型的感应器)。所以你不应该太在意我相信。我个人从不使用elim而且总是使用感应,因为我倾向于喜欢它所做的额外工作。
答案 1 :(得分:0)
正如@Ptival所说,elim
和induction
对目标执行的操作几乎完全相同。您将看到的主要区别是目标的形状可能略有不同:例如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
。