首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何证明所有关于le相等的证明?

如何证明所有关于le相等的证明?
EN

Stack Overflow用户
提问于 2020-08-07 01:41:25
回答 2查看 227关注 0票数 2

我基本上是想证明

代码语言:javascript
运行
复制
Theorem le_unique {x y : nat} (p q : x <= y) : p = q.

不假定任何公理(例如证明无关)。尤其是,我曾试图通过le_unique ( inductioninversion ),但它似乎从未走远

代码语言:javascript
运行
复制
Theorem le_unique (x y : nat) (p q : x <= y) : p = q.
Proof.
  revert p q.
  induction x as [ | x rec_x]. (* induction on y similarly fruitless; induction on p, q fails *)
  - destruct p as [ | y p].
    + inversion q as [ | ]. (* destruct q fails and inversion q makes no progress *)
      admit.
    + admit.
  - admit.
Admitted.
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-07 05:42:13

在标准库中,这个引理可以在模块Peano_dec.le_unique中作为Coq.Arith.Peano_dec找到。

至于一个相对简单的直接证明,我喜欢对p本身进行归纳。在手工证明了Coq不是自动生成的几个归纳原理后,并记住nat上的等式证明是唯一的,证明是在p上相对简单的归纳,然后在q上给出四种情况,其中两种是荒谬的。

下面是一个完整的Coq文件,以证明le_unique

代码语言:javascript
运行
复制
Import EqNotations.
Require Eqdep_dec PeanoNat.

Lemma nat_uip {x y : nat} (p q : x = y) : p = q.
apply Eqdep_dec.UIP_dec.
exact PeanoNat.Nat.eq_dec.
Qed.

(* Generalize le_ind to prove things about the proof *)
Lemma le_ind_dependent :
  forall (n : nat) (P : forall m : nat, n <= m -> Prop),
  P n (le_n n) ->
  (forall (m : nat) (p : n <= m), P m p -> P (S m) (le_S n m p)) ->
  forall (m : nat) (p : n <= m), P m p.
exact (fun n P Hn HS => fix ind m p : P m p := match p with
  | le_n _ => Hn | le_S _ m p => HS m p (ind m p) end).
Qed.

(*
Here we give an proof-by-cases principle for <= which keeps both the left
and right hand sides fixed.
*)
Lemma le_case_remember (x y : nat) (P : x <= y -> Prop)
  (IHn : forall (e : y = x), P (rew <- e in le_n x))
  (IHS : forall y' (q' : x <= y') (e : y = S y'), P (rew <- e in le_S x y' q'))
  : forall (p : x <= y), P p.
exact (fun p => match p with le_n _ => IHn | le_S _ y' q' => IHS y' q' end eq_refl).
Qed.

Theorem le_unique {x y : nat} (p q : x <= y) : p = q.
revert q.
induction p as [|y p IHp] using le_ind_dependent;
intro q;
case q as [e|x' q' e] using le_case_remember.

- rewrite (nat_uip e eq_refl).
  reflexivity.

- (* x = S x' but x <= x', so S x' <= x', which is a contradiction *)
  exfalso.
  rewrite e in q'.
  exact (PeanoNat.Nat.nle_succ_diag_l _ q').

- (* S y' = x but x <= y', so S y' <= y', which is a contradiction *)
  exfalso; clear IHp.
  rewrite <- e in p.
  exact (PeanoNat.Nat.nle_succ_diag_l _ p).

- injection e as e'.
  (* We now get rid of e as equal to (f_equal S e'), and then destruct e'
     now that it is an equation between variables. *)
  assert (f_equal S e' = e).
  + apply nat_uip.
  + destruct H.
    destruct e'.
    change (le_S x y p = le_S x y q').
    f_equal.
    apply IHp.

Qed.
票数 3
EN

Stack Overflow用户

发布于 2020-08-07 01:41:25

Eqdep_dec的启发(还有一个引理),我已经把这个证明做好了。其思想是,x <= y可以转换为exists k, y = k + x,并且通过这种转换进行往返会产生一个x <= y,它实际上是从=到原始的。

代码语言:javascript
运行
复制
(* Existing lemmas (e.g. Nat.le_exists_sub) seem unusable (declared opaque) *)
Fixpoint le_to_add {x y : nat} (prf : x <= y) : exists k, y = k + x :=
  match prf in _ <= y return exists k, y = k + x with
  | le_n _ => ex_intro _ 0 eq_refl
  | le_S _ y prf =>
    match le_to_add prf with
    | ex_intro _ k rec =>
      ex_intro
        _ (S k)
        match rec in _ = z return S y = S z with eq_refl => eq_refl end
    end
  end.
Fixpoint add_to_le (x k : nat) : x <= k + x :=
  match k with
  | O => le_n x
  | S k => le_S x (k + x) (add_to_le x k)
  end.
Theorem rebuild_le
  {x y : nat} (prf : x <= y)
: match le_to_add prf return x <= y with
  | ex_intro _ k prf =>
    match prf in _ = z return x <= z -> x <= y with
    | eq_refl => fun p => p
    end (add_to_le x k)
  end = prf.
Proof.
  revert y prf.
  fix rec 2. (* induction is not enough *)
  destruct prf as [ | y prf].
  - reflexivity.
  - specialize (rec y prf).
    simpl in *.
    destruct (le_to_add prf) as [k ->].
    subst prf.
    reflexivity.
Defined.

然后,任何两个x <= ys将产生相同的k,通过+的内射性。=nat上的可判定性告诉我们,产生的等式也是相等的。因此,x <= y的映射到相同的exists k, y = k + x,并且映射这个等式返回告诉我们x <= ys也是相等的。

代码语言:javascript
运行
复制
Theorem le_unique (x y : nat) (p q : x <= y) : p = q.
Proof.
  rewrite <- (rebuild_le p), <- (rebuild_le q).
  destruct (le_to_add p) as [k ->], (le_to_add q) as [l prf].
  pose proof (f_equal (fun n => n - x) prf) as prf'.
  simpl in prf'.
  rewrite ?Nat.add_sub in prf'.
  subst l.
  apply K_dec with (p := prf).
  + decide equality.
  + reflexivity.
Defined.

我仍然希望有一个更好的(也就是更短的)证据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63294026

复制
相关文章

相似问题

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