【发布时间】:2016-11-24 17:16:36
【问题描述】:
给定过程even,我想证明even (n * (S n)) = true对于所有自然数n。
使用归纳法,对于n = 0 的情况,很容易看出这是true。但是,(S n) * (S (S n)) 的情况很难简化。
我考虑过证明 even (m * n) = even m /\ even n 的引理,但这似乎并不容易。
另外,很容易看出如果even n = true iff。 even (S n) = false.
Fixpoint even (n: nat) : bool :=
match n with
| O => true
| 1 => false
| S (S n') => even n'
end.
有人可以提示如何使用 Coq 的“初学者”子集来证明这一点吗?
【问题讨论】:
-
我将开始证明
even n -> even (n * m)(适用于所有m)。那么由于even n <-> (even (S n) = false)和n*m = m*n你应该能够证明even (n * (S n))。不确定这是否简化了任何事情...... -
你认为“even n -> even (n * m)”容易证明吗?
-
也许吧。考虑一下:
n * (S m') = n + n * m'通过归纳假设n*m'是偶数,even n /\ even m -> even (n+m)产生了论文。 -
谢谢,但是 "even (n + m)" 似乎很难证明(虽然乍一看很容易)。
-
为什么?如果
n = O然后使用simpl可以得到n+m = m,这甚至是假设。如果n = (S (S n'))然后使用simpl你会得到S (S (n' + m)),它通过归纳假设+even n <-> even (S ( S n))产生论文的事实。你只需要even n -> (n = O \/ n = S (S n') /\ even n')似乎并不难归纳证明。
标签: functional-programming coq