如何在Coq中证明算术等式“3 * S(i + j)+ 1 = S(3 * i + 1)+ S(3 * j + 1)”

时间:2016-11-19 16:08:13

标签: coq

如何证明平等

3 * S (i + j) + 1 = S (3 * i + 1) + S (3 * j + 1)`

在Coq?

试图在Coq中证明我的归纳假设,我需要证明这些方面是平等的(他们显然是这样)。

但是,如果我删除了S,例如左侧,那么我会得到自然数3。但是,我不知道如何将其分解为1 + 1 + 1

此外,与Nat.add_assocNat.add_comm坐在一起非常费时,让我发疯。

必须有一些"直截了当的"初学者的方法如何使用" basic"来证明这一点。战术?

2 个答案:

答案 0 :(得分:7)

让我们先做一些自动校样。为了将它与我提出的(更多)更长的手动证据进行比较。

Require Import
Arith      (* `ring` tactic on `nat` and lemmas *)
Omega      (* `omega` tactic *)
Psatz.     (* `lia`, `nia` tactics *)

Goal forall i j,
    3 * S (i + j) + 1 = S (3 * i + 1) + S (3 * j + 1).
Proof.

ring策略

Coq参考手册,§8.16.3:

  

ring策略解决了ring(或semi-ring)结构的多项式表达式。它通过对等式的两个方面进行归一化(w.r.t.关联性,交换性和分布性,常数传播)并在语法上比较结果。

  intros; ring.
  Undo.

omega策略

Coq参考手册,§8.16.2:

  

由于PierreCrégut,战术omegaPresburger arithmetic的自动决策程序。它解决了使用~\//\->在自然类型nat上的等式,不等式和不等式之上构建的无量词的公式二进制整数的数字和Z。必须通过命令Require Import Omega加载此策略。请参阅有关omega的其他文档(请参阅第21章)。

  intros; omega.
  Undo.

lia策略

Coq参考手册,§22.5:

  

策略lia提供了omegaromega策略的替代方法(参见第21章)。粗略地说,lia的演绎力是ring_simplifyomega的综合演绎力。但是,它解决了omegaromega无法解决的线性目标,例如以下所谓的欧米茄噩梦[130]。

  intros; lia.
  Undo.

nia策略

Coq参考手册,§22.6:

  

nia策略是非线性整数算术的实验证明程序。在运行lia的线性证明器之前,该策略执行有限量的非线性推理...

  intros; nia.
  Undo.

手动证明

以上所有策略都会自动解决目标。 Undo是一个Vernacular命令,“取消”一步,它允许我们从头开始重新启动证明,在这种情况下可以使用Restart命令实现相同的效果。 / p>

现在,让我们做一个手动证明。由于教学原因,我没有删除我用来找到必要引理的Search命令。坦率地说,我不经常使用它们而且不记得它们的名字 - 使用自动战术要容易得多。

主要困难之一(至少对我而言)是“关注”我想要重写的目标的子表达式。 为此,我们可以使用replace ... with ...策略(参见下面的示例)和symmetry(在某种程度上)。 symmetrya = b表单的目标转换为b = a - 它允许您在b而非a中重写。

此外,rewrite !<lemma>也有很多帮助 - 感叹号的意思是“尽可能多地重写”。

  intros.
  Search (S (?n + ?m) = ?n + S ?m).
  rewrite !plus_n_Sm.
  rewrite <- Nat.add_assoc.
  Search (?n + (?m + ?p) = ?m + (?n + ?p)).
  rewrite Nat.add_shuffle3.
  symmetry.
  rewrite Nat.add_comm.
  rewrite Nat.add_assoc.
  Search (?k * ?x + ?k * ?y).
  rewrite <- Nat.mul_add_distr_l.
  replace (S j) with (j + 1) by now rewrite Nat.add_comm.
  rewrite Nat.add_assoc.
  symmetry.
  rewrite Nat.mul_add_distr_l.
  rewrite <- !Nat.add_assoc.
  reflexivity.
Qed.

上述手动证明可以压缩成这种等效形式:

  intros.
  rewrite !plus_n_Sm, <- Nat.add_assoc, Nat.add_shuffle3.
  symmetry.
  rewrite Nat.add_comm, Nat.add_assoc, <- Nat.mul_add_distr_l.
  replace (S j) with (j + 1) by now rewrite Nat.add_comm.
  rewrite Nat.add_assoc. symmetry.
  now rewrite Nat.mul_add_distr_l, <- !Nat.add_assoc.

答案 1 :(得分:4)

您可以使用其中一种自动策略进行算术运算:

Require Import Coq.omega.Omega.

Lemma U i j : 3 * S (i + j) + 1 = S (3 * i + 1) + S (3 * j + 1).
now omega.
Qed.

事实上,其中一些证明非常耗时,请参阅Coq手册,了解有关现有策略的更多详细信息。如果你想手动进行证明,我将继续:

simpl; rewrite !add_0_r, !add_1_r, !add_succ_r, !add_assoc; simpl.

并在我的辅助库中添加一些交换引理。