减法的Coq证明不通勤

时间:2017-05-18 00:13:07

标签: coq coq-tactic

我想证明减法不会在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

1 个答案:

答案 0 :(得分:2)

解决此问题的一种方法是在a上使用归纳法。但是,如果您使用

开始校对
intros a b C; induction a.

你会被卡住,因为上下文会有以下假设:

C : S a <> b
IHa : a <> b -> a - b <> b - a

您将无法使用归纳假设IHa,因为无法从IHa推断出a <> bS 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.