我想证明减法不会在Coq中通勤,但我被卡住了。我相信我想在Coq中证明的陈述将写成forall a b : nat, a <> b -> a - b <> b - a
到目前为止,我的证据就是这些。
Theorem subtraction_does_not_commute :
forall a b : nat, a <> b -> a - b <> b - a.
Proof.
intros a b C.
unfold not; intro H.
apply C.
我想我可以使用C : a <> b
来反驳目标a = b
。
答案 0 :(得分:2)
解决此问题的一种方法是在a
上使用归纳法。但是,如果您使用
intros a b C; induction a.
你会被卡住,因为上下文会有以下假设:
C : S a <> b
IHa : a <> b -> a - b <> b - a
您将无法使用归纳假设IHa
,因为无法从IHa
推断出a <> b
(S a <> b
)的前提:例如1 <> 0
并不意味着0 <> 0
。
但我们可以通过不过早地将变量引入上下文来使归纳假设变得更强:
Require Import Coq.Arith.Arith.
Lemma subtraction_does_not_commute :
forall a b : nat, a <> b -> a - b <> b - a.
Proof.
induction a; intros b C.
- now rewrite Nat.sub_0_r.
- destruct b.
+ trivial.
+ repeat rewrite Nat.sub_succ. auto.
Qed.
或者,或者,使用omega
策略,我们得到一个单行证明:
Require Import Omega.
Lemma subtraction_does_not_commute :
forall a b : nat, a <> b -> a - b <> b - a.
Proof. intros; omega. Qed.