如何证明平等
3 * S (i + j) + 1 = S (3 * i + 1) + S (3 * j + 1)`
在Coq?
试图在Coq中证明我的归纳假设,我需要证明这些方面是平等的(他们显然是这样)。
但是,如果我删除了S
,例如左侧,那么我会得到自然数3
。但是,我不知道如何将其分解为1 + 1 + 1
。
此外,与Nat.add_assoc
和Nat.add_comm
坐在一起非常费时,让我发疯。
必须有一些"直截了当的"初学者的方法如何使用" basic"来证明这一点。战术?
答案 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,战术
omega
是Presburger arithmetic的自动决策程序。它解决了使用~
,\/
,/\
,->
在自然类型nat
上的等式,不等式和不等式之上构建的无量词的公式二进制整数的数字和Z
。必须通过命令Require Import Omega
加载此策略。请参阅有关omega
的其他文档(请参阅第21章)。
intros; omega.
Undo.
lia
策略Coq参考手册,§22.5:
策略
lia
提供了omega
和romega
策略的替代方法(参见第21章)。粗略地说,lia
的演绎力是ring_simplify
和omega
的综合演绎力。但是,它解决了omega
和romega
无法解决的线性目标,例如以下所谓的欧米茄噩梦[130]。
intros; lia.
Undo.
nia
策略Coq参考手册,§22.6:
nia
策略是非线性整数算术的实验证明程序。在运行lia
的线性证明器之前,该策略执行有限量的非线性推理...
intros; nia.
Undo.
以上所有策略都会自动解决目标。 Undo
是一个Vernacular命令,“取消”一步,它允许我们从头开始重新启动证明,在这种情况下可以使用Restart
命令实现相同的效果。 / p>
现在,让我们做一个手动证明。由于教学原因,我没有删除我用来找到必要引理的Search
命令。坦率地说,我不经常使用它们而且不记得它们的名字 - 使用自动战术要容易得多。
主要困难之一(至少对我而言)是“关注”我想要重写的目标的子表达式。
为此,我们可以使用replace ... with ...
策略(参见下面的示例)和symmetry
(在某种程度上)。 symmetry
将a = 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.
并在我的辅助库中添加一些交换引理。