我正在学校学习Coq,我有一份工作要做。我有一个引理来证明:如果一个列表在其元素中包含零,那么它的元素的乘积就是0.我启动了我的代码,我陷入了一个我不知道如何继续的地步。我不知道Coq的所有命令,我做了很多研究,但是我无法找到证据结束的方法。这是我的代码: 需要导入列表ZArith。
Open Scope Z_scope.
Fixpoint contains_zero (l : list Z) :=
match l with
nil => false
| a::tl => if Zeq_bool a 0 then true else contains_zero tl
end.
Fixpoint product (l : list Z) :=
match l with
nil => 1
| a::tl => a * product tl
end.
Lemma Zmult_integral_r :
forall n m, m <> 0 -> m * n = 0 -> n = 0.
Proof.
intros n m m0; rewrite Zmult_comm; apply Zmult_integral_l.
assumption.
Qed.
Lemma product_contains_zero :
forall l, contains_zero l = true -> product l = 0.
intros l H.
所以,我认为创建一个检查列表是否包含零的函数是一个好主意,另一个是计算其元素的乘积。我还发现(幸运的是)在线引理证明,如果我有2个数字,并且我知道其中一个不是0,而且他们的产品是0,那么其他数字必然是0(我认为这可能有帮助) 。我想过通过归纳做一个证明,但这没有用。有任何想法吗?我知道这不是要求某人做我的工作的地方,我不是在问我,我只是需要一个想法。
答案 0 :(得分:3)
1 /你不需要你提到的定理,“如果我有2个数字,并且我知道其中一个不是0,并且它们的乘积是0,那么其他数字必然是0”。你不需要它,因为你想证明产品是0,你不是在想要使用产品为零的事实。
因此定理Zmult_integral_r对这个问题中的引理没有用处。如果你必须证明forall l,产品l = 0 - >,那将是有用的。 contains_zero l = true。
在这里,对于您的问题,您考虑的两个函数是递归的,因此通常的提示是通过归纳进行证明,然后使用策略简化来使函数看起来更简单。
答案 1 :(得分:0)
将两个数字的乘积表示为一个数字,同时您将支持该引理。