Coq定理证明:peano算法中的简单分式定理

Coq定理证明:peano算法中的简单分式定理,coq,theorem-proving,peano-numbers,Coq,Theorem Proving,Peano Numbers,我正在学习coq,并试图用peano算术证明等式 我被一个简单的分数定律难住了 我们从小学就知道(n+m)/2=n/2+m/2。 在peano算法中,只有当n和m为偶数时,这才成立(因为除法产生正确的结果) 因此,我们定义: Theorem fraction_addition: forall n m: nat , even n -> even m -> Nat.div2 n + Nat.div2 m = Nat.div2 (n + m). 根据我的理解,这是一个正确且可

我正在学习coq,并试图用peano算术证明等式

我被一个简单的分数定律难住了

我们从小学就知道(n+m)/2=n/2+m/2。 在peano算法中,只有当n和m为偶数时,这才成立(因为除法产生正确的结果)

因此,我们定义:

Theorem fraction_addition: forall n m: nat , 
    even n -> even m ->  Nat.div2 n + Nat.div2 m = Nat.div2 (n + m).
根据我的理解,这是一个正确且可证明的定理。 我试过归纳证明,例如

intros n m en em.
induction n.
- reflexivity.
- ???
这让我陷入了

en=偶数(sn)
而且
IHn:偶数n->Nat.div2 n+Nat.div2 m=Nat.div2(n+m)
,所以我没有找到应用归纳假设的方法


经过对标准库和文档的长期研究,我没有找到答案。

在这种情况下,你需要强化归纳假设。 这样做的一种方法是证明一个归纳原理,比如:

From Coq Require Import Arith Even.
Lemma nat_ind2 (P : nat -> Prop) :
  P 0 ->
  P 1 ->
  (forall n, P n -> P (S n) -> P (S (S n))) ->
  forall n, P n.
Proof.
now intros P0 P1 IH n; enough (H : P n /\ P (S n)); [|induction n]; intuition.
Qed.
nat_ind2
可按如下方式使用:

Theorem fraction_addition n m :
  even n -> even m ->
  Nat.div2 n + Nat.div2 m = Nat.div2 (n + m).
Proof.
  induction n using nat_ind2.
  (* here goes the rest of the proof *)
Qed.

在这种情况下,你需要强化你的归纳假设。 这样做的一种方法是证明一个归纳原理,比如:

From Coq Require Import Arith Even.
Lemma nat_ind2 (P : nat -> Prop) :
  P 0 ->
  P 1 ->
  (forall n, P n -> P (S n) -> P (S (S n))) ->
  forall n, P n.
Proof.
now intros P0 P1 IH n; enough (H : P n /\ P (S n)); [|induction n]; intuition.
Qed.
nat_ind2
可按如下方式使用:

Theorem fraction_addition n m :
  even n -> even m ->
  Nat.div2 n + Nat.div2 m = Nat.div2 (n + m).
Proof.
  induction n using nat_ind2.
  (* here goes the rest of the proof *)
Qed.

如果你能使用标准库,你也可以不用归纳法证明你的定理

Require Import PeanoNat.
Import Nat.

Goal forall n m, Even n -> Even m -> n / 2 + m / 2 = (n+m)/2.
  inversion 1; inversion 1.
  subst.
  rewrite <- mul_add_distr_l.
  rewrite ?(mul_comm 2).
  rewrite ?div_mul; auto.
Qed.
如果在假设中使用
甚至m
(即
存在n,m=2*m
),则可以使用标准库中的引理进行简单的代数重写

Require Import PeanoNat.
Import Nat.

Goal forall n m, Even n -> Even m -> n / 2 + m / 2 = (n+m)/2.
  inversion 1; inversion 1.
  subst.
  rewrite <- mul_add_distr_l.
  rewrite ?(mul_comm 2).
  rewrite ?div_mul; auto.
Qed.
需要导入PeanoNat。
导入Nat。
所有n个m的目标,偶数n->偶数m->n/2+m/2=(n+m)/2。
反转1;倒置1。
替代品。

重写如果你可以使用标准库,你也可以不用归纳法证明你的定理

Require Import PeanoNat.
Import Nat.

Goal forall n m, Even n -> Even m -> n / 2 + m / 2 = (n+m)/2.
  inversion 1; inversion 1.
  subst.
  rewrite <- mul_add_distr_l.
  rewrite ?(mul_comm 2).
  rewrite ?div_mul; auto.
Qed.
如果在假设中使用
甚至m
(即
存在n,m=2*m
),则可以使用标准库中的引理进行简单的代数重写

Require Import PeanoNat.
Import Nat.

Goal forall n m, Even n -> Even m -> n / 2 + m / 2 = (n+m)/2.
  inversion 1; inversion 1.
  subst.
  rewrite <- mul_add_distr_l.
  rewrite ?(mul_comm 2).
  rewrite ?div_mul; auto.
Qed.
需要导入PeanoNat。
导入Nat。
所有n个m的目标,偶数n->偶数m->n/2+m/2=(n+m)/2。
反转1;倒置1。
替代品。

重写谢谢你的洞察力。使用这种技术我可以完成证明。谢谢你的洞察力。使用这种技术我可以完成证明。谢谢,这也是非常有见地的。谢谢,这也是非常有见地的