我如何证明这个引理:
Lemma even_plus_split n m :
even (n + m) -> even n /\ even m \/ odd n /\ odd m.
这些是唯一可以使用的库和定义:
Require Import Arith.
Require Import Coq.omega.Omega.
Definition even (n: nat) := exists k, n = 2 * k.
Definition odd (n: nat) := exists k, n = 2 * k + 1.
我是Coq的新手并对此感到困惑。你能给我一个解决方案吗?提前谢谢!
到目前为止的代码:
Lemma even_plus_split n m :
even (n + m) -> even n /\ even m \/ odd n /\ odd m.
Proof.
intros.
unfold even.
unfold even in H.
destruct H as [k H].
unfold odd.
exists (1/2*k).
结果到目前为止:
1 subgoal
n, m, k : nat
H : n + m = 2 * k
______________________________________(1/1)
(exists k0 : nat, n = 2 * k0) /\ (exists k0 : nat, m = 2 * k0) \/
(exists k0 : nat, n = 2 * k0 + 1) /\ (exists k0 : nat, m = 2 * k0 + 1)
我只想让k0等于1/2 * k,因此我认为它有意义,但我不能那样做。
答案 0 :(得分:1)
我只想让k0等于1/2 * k,因此我认为它有意义,但我无法做到。
有一个名为Nat.div2
的函数,它将自然数除以2.运行Search Nat.div2.
Nat.le_div2: forall n : nat, Nat.div2 (S n) <= n
Nat.lt_div2: forall n : nat, 0 < n -> Nat.div2 n < n
Nat.div2_decr: forall a n : nat, a <= S n -> Nat.div2 a <= n
Nat.div2_wd: Morphisms.Proper (Morphisms.respectful eq eq) Nat.div2
Nat.div2_spec: forall a : nat, Nat.div2 a = Nat.shiftr a 1
Nnat.N2Nat.inj_div2: forall a : N, N.to_nat (N.div2 a) = Nat.div2 (N.to_nat a)
Nnat.Nat2N.inj_div2: forall n : nat, N.of_nat (Nat.div2 n) = N.div2 (N.of_nat n)
Nat.div2_double: forall n : nat, Nat.div2 (2 * n) = n
Nat.div2_div: forall a : nat, Nat.div2 a = a / 2
Nat.div2_succ_double: forall n : nat, Nat.div2 (S (2 * n)) = n
Nat.div2_odd: forall a : nat, a = 2 * Nat.div2 a + Nat.b2n (Nat.odd a)
Nat.div2_bitwise:
forall (op : bool -> bool -> bool) (n a b : nat),
Nat.div2 (Nat.bitwise op (S n) a b) = Nat.bitwise op n (Nat.div2 a) (Nat.div2 b)
其中,最有希望的似乎是Nat.div2_odd: forall a : nat, a = 2 * Nat.div2 a + Nat.b2n (Nat.odd a)
。如果您pose proof
这个引理,您可destruct (Nat.odd a)
并使用simpl
获取a = 2 * Nat.div2 a
或a = 2 * Nat.div2 a + 1
,无论您选择哪个a
。
这可能无法直接为您提供解决方案(我不相信将k0
设置为k / 2
是正确的决定),但如果没有,则应确保您能够弄明白如何在Coq中尝试之前在纸上证明这一事实。 Coq非常擅长确保你不会做出任何你不允许的逻辑跳跃;它非常非常帮助你弄清楚如何证明你还不知道如何证明的事实。
答案 1 :(得分:1)
每个试图回答的人似乎都围绕着这样一个事实,即你实际上为这个证据选择了一个错误的方向。这是一个例子:
如果n = 601且m = 399,那么n + m = 2 * 500, n = 2 * 300 + 1,m = 2 * 199 + 1。
在500,300和199之间,1/2比率不会出现在任何地方。
声明(甚至是n / \甚至m)/(奇数n / \奇数m)肯定是真的。
所以现在,你有一个数学问题而不是一个Coq问题。
你必须为普遍量化的数字n
和m
做出证明,但是这个证明也应该适用于这些数字的具体选择。因此,在某种意义上,您可以通过实例来进行心理练习,以测试您的证明。