通过对 2 个变量进行归纳来保持结构

Preserving structure with inductions on 2 variables

我一直在学习 Coq 的策略,并通过反驳有关自然数的基本事实来熟悉该系统。

我一直在努力避免使用已经在图书馆中证明的定理,并责备乘法的结合性等

但是,我在一些情况下遇到了困难,我想证明 n m:nat 的 属性,但是当我尝试对两个 n 进行归纳时和 m,归纳假设的结构对于试图证明 属性.

是无用的

我很容易地证明了 n = m -> o * n = o * m:

Theorem times_alg_left : forall n m o:nat, n = m -> o * n = o * m.
intros n m o H.
rewrite H; reflexivity.
Defined.

但是试图证明 S o * n = S o * m -> n = m 完全让我困惑。经过相当大的努力,我决定尝试证明 2 * n = 2 * m -> n = m,但这并不容易。

我最终遇到这样的情况:

Theorem m2_eq : forall n m:nat, 2 * n = 2 * m -> n = m.
intros n m H.
induction n.
destruct m.
reflexivity.
discriminate.
induction m.
discriminate.

1 subgoal
n, m : nat
H : 2 * S n = 2 * S m
IHn : 2 * n = 2 * S m -> n = S m
IHm : 2 * S n = 2 * m -> (2 * n = 2 * m -> n = m) -> S n = m
______________________________________(1/1)
S n = S m

我有 2 * S n = 2 * S m,但我的归纳前提是 2 * n = 2 * S m 和 2 * S n = 2 * m。

在这种情况下,我无能为力。

类似地,我开始尝试证明关于 Nat.sub 和小于或等于的事情来绕过这个限制,但我 运行 遇到了同样的情况。

Theorem sub0_imp_le : forall n m:nat, n - m = 0 -> n <= m.
intros n m H.
induction n; induction m.
apply le_n.
apply le_0.
rewrite sub0 in H.
discriminate.

1 subgoal
n, m : nat
H : S n - S m = 0
IHn : n - S m = 0 -> n <= S m
IHm : S n - m = 0 -> (n - m = 0 -> n <= m) -> S n <= m
______________________________________(1/1)
S n <= S m

但我在同一个泡菜中,我的归纳前提毫无价值。

我如何构造我的策略来解决这些类型的定理,使用 2 个 nat 变量,并且正在进行某种相等或减法情况?

您需要对一个数进行归纳,同时对另一个数进行归纳,例如,使用 generalize dependent 策略。这在 Software Foundations book.

中有详细解释

使用 Arthur 提到的软件基础一书,我找到了有问题的例子。在对 n 进行归纳之前,我不需要引入 m。我需要先对 n 进行归纳,然后再引入 m。

https://softwarefoundations.cis.upenn.edu/lf-current/Tactics.html#lab143

Theorem times_alg_rem_left : forall n o m:nat, (S o) * n = (S o) * m -> n = m.
intros n o.
induction n.
simpl.
intros m eq.
destruct m.
reflexivity.
rewrite (timesz o) in eq.
simpl in eq.
discriminate.
intros m eq.
destruct m.
rewrite (timesz (S o)) in eq.
inversion eq.
apply f_equal.
apply IHn.
rewrite (times_nSm (S o) n) in eq.
rewrite (times_nSm (S o) m) in eq.
apply plus_alg_rem_right in eq.
assumption.
Defined.