首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将Coq中的“0<d”替换为“in”?

如何将Coq中的“0<d”替换为“in”?
EN

Stack Overflow用户
提问于 2016-11-30 12:24:30
回答 1查看 89关注 0票数 3

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

在Coq中,我有一些恼人的假设,即0 < d,我需要替换它来应用euclid_div_succ_d_theorem来证明euclid_div_theorem作为推论。

我怎样才能把这些假设转化成适当的形式来应用定理呢?

代码语言:javascript
复制
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).
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-30 13:04:28

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

代码语言:javascript
复制
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):

代码语言:javascript
复制
Nat.neq_0_r: forall n : nat, n <> 0 <-> (exists m : nat, n = S m)

这意味着我们需要从d <> 0中推断出0 < d,因此Search (_ < _ -> _ <> _).的结果也是这样:

代码语言:javascript
复制
Nat.lt_neq: forall n m : nat, n < m -> n <> m

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

代码语言:javascript
复制
Nat.neq_sym: forall n m : nat, n <> m -> m <> n

我也可以用一个更普遍的引理:

代码语言:javascript
复制
not_eq_sym: forall (A : Type) (x y : A), x <> y -> y <> x

会给我们同样的结果。

然而,有一种不那么繁琐的方法来证明引理--你总是可以使用destruct d.并通过案例证明它:

代码语言:javascript
复制
  intros d H n.
  destruct d.
  - inversion H.   (* H is a contradiction now: `0 < 0` *)
  - apply euclid_div_succ_d_theorem.
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40888310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档