在Coq中编写简单算术的证明

时间:2018-01-24 06:59:11

标签: coq integer-arithmetic

我想证明简单的事情,比如每个自然数n,存在一个自然数k,这样:

schoolId

如何进行这样的证明?当n是奇数或偶数时,我想把它分成几种情况,但我不知道如何在Coq中这样做。另外,Coq中是否有内置的幂(指数)运算符?

3 个答案:

答案 0 :(得分:4)

是的,有许多内置函数,您只需要正确的导入集或打开正确的表示法范围。 一种简单的方法就是使用归纳和一些自动化,例如ringomegalia策略。

From Coq Require Import Arith Psatz.

Goal forall n, exists k, (2*n + 1)^2 = 8*k + 1.
Proof.
  induction n as [| n [m IH]].
  - now exists 0.
  - exists (S n + m). rewrite Nat.pow_2_r in *. lia.
Qed.

答案 1 :(得分:1)

我们可以按照推理问题中建议的初始计划来确定输入是奇数还是偶数,只用n mod 2的值表示奇偶校验并使用布尔相等测试来表示替代。< / p>

证明也可以用相对整数而不是自然数来进行。

From Coq Require Import ZArith Psatz.

Open Scope Z_scope.

Lemma example n : exists k,  (2 * n + 1) ^2 = 8 * k + 1.
Proof.
assert (vn : n = 2 * (n / 2) + n mod 2) by now apply Z_div_mod_eq.
destruct (n mod 2 =? 0) eqn: q.
-  rewrite Z.eqb_eq in q; rewrite vn, q.
exists ((2 * (n / 2) + 1) * (n / 2)); ring.
-  enough (vm : n mod 2 = 1)
    by now rewrite vn, vm; exists (2 * (n / 2) ^ 2 + 3 * (n / 2) + 1); ring.
rewrite Z.eqb_neq in q.
assert (0 <= n mod 2 < 2) by now apply Z_mod_lt.
lia.
Qed.

这个证明并不像1月24日的@Anton那样简单明了。

答案 2 :(得分:1)

这是一个替代证明,使用与@Yves证明中相同的想法:

out_gate,uless_col,in_gate,n_con
p,x,x,1
p,x,y,1
p,x,z,1
a_a,u,b,1
a_a,s,b,3
a_b,e,a,2
a_b,l,c,4
a_c,e,a,5
a_c,s,b,5
a_c,s,b,3
a_c,c,a,4
a_d,o,c,2
a_d,l,c,3
a_d,m,b,2
p,y,x,1
p,y,y,1
p,y,z,3

如果您更改了从名称空间From Coq Require Import Arith Psatz. Fact exampleNat n : exists k, (2 * n + 1) ^2 = 8 * k + 1. Proof. exists (n * (S n) / 2). assert (H : Nat.even (n * (S n)) = true) by now rewrite Nat.even_mul, Nat.even_succ, Nat.orb_even_odd. apply Nat.even_spec in H as [m H]; rewrite (Nat.mul_comm 2) in H. rewrite H, Nat.div_mul, Nat.pow_2_r; lia. Qed. NatZS等)的所有内容,请注意此证明架构也适用于整数。