偶数(n + m) - >偶数n / \甚至m \ /奇数n / \奇数m

时间:2018-05-02 03:42:13

标签: coq

我如何证明这个引理:

 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,因此我认为它有意义,但我不能那样做。

2 个答案:

答案 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 aa = 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问题。

你必须为普遍量化的数字nm做出证明,但是这个证明也应该适用于这些数字的具体选择。因此,在某种意义上,您可以通过实例来进行心理练习,以测试您的证明。