如何取代假设“0<在Coq中用`S d'`来实现?

时间:2016-11-30 12:24:30

标签: functional-programming coq

  

如何在Coq中用0 < d替换假设S d'

在Coq中,我发现了0 < d的烦人假设,我需要将其替换为euclid_div_succ_d_theorem以证明euclid_div_theorem为必然结果。

我怎样才能以某种方式将假设转换为适用于定理的正确形式?

Theorem euclid_div_theorem :
  forall d : nat,
    0 < d -> 
    forall n : nat,
    exists q r : nat,
      n = q * d + r /\ r < d.

Theorem euclid_div_succ_d_theorem :
  forall d : nat,
  forall n : nat,
  exists q r : nat,
    n = q * (S d) + r /\ r < (S d).

1 个答案:

答案 0 :(得分:2)

使用Arith模块中的标准引理,您可以将0 < d更改为exists m, d = S m,(在销毁后)会为您提供所需的结果。

Require Import Arith.

Theorem euclid_div_theorem : forall d : nat,
    0 < d -> forall n : nat, exists q r : nat, n = q * d + r /\ r < d.
Proof.
  intros d H n.
  apply Nat.lt_neq, Nat.neq_sym, Nat.neq_0_r in H.
  destruct H; rewrite H.
  apply euclid_div_succ_d_theorem.
Qed.

我是这样做的:

Search (exists _, _ = S _).为我们提供了最后一个引理(在这里,你的目标更容易倒退,imho):

Nat.neq_0_r: forall n : nat, n <> 0 <-> (exists m : nat, n = S m)

这意味着我们需要从d <> 0推断0 < d,所以再次Search (_ < _ -> _ <> _).会产生:

Nat.lt_neq: forall n m : nat, n < m -> n <> m

现在很容易看出我们需要交换不等式的lhs和rhs,所以我做了Search (?x <> ?y -> ?y <> ?x).

Nat.neq_sym: forall n m : nat, n <> m -> m <> n

我还可以使用更普遍的引理:

not_eq_sym: forall (A : Type) (x y : A), x <> y -> y <> x

它会给我们相同的结果。

然而,有一种不那么乏味的证明引理的方法 - 你可以随时使用destruct d.并按案例证明:

  intros d H n.
  destruct d.
  - inversion H.   (* H is a contradiction now: `0 < 0` *)
  - apply euclid_div_succ_d_theorem.