我一直在学习Coq的策略,并通过证明有关自然数的基本事实来熟悉系统。
我一直在尝试避免使用库中已经证明的定理,并避免像乘法的关联性之类的事情。
但是,在某些情况下我一直受阻,其中我想证明nm: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变量,并且发生某种相等或相减的情况?
答案 0 :(得分:1)
例如,您需要使用generalize dependent
策略对一个数字进行归纳,而对另一个数字进行归纳。 Software Foundations book中对此进行了详细说明。
答案 1 :(得分:0)
使用Arthur提到的Software Foundations一书,我发现了有意思的例子。在对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.