证明Coq中的证明无关紧要?


18

有没有办法证明Coq中的以下定理?

Theorem bool_pirrel : forall (b : bool) (p1 p2 : b = true), p1 = p2.

编辑:尝试简要说明“什么证明无关紧要”(如果我错了或不正确,请纠正我)

基本思想是,在命题世界(或PropCoq中的排序)中,您(并且应该)真正关心的是命题的可证明性而不是它的证明,可能有很多(或没有)。如果您有多个证明,从可证明性的角度来看,它们在证明相同命题的意义上是相等的。因此,它们的区别是无关紧要的。这不同于来看,你真正关心的两个词的区别,计算点例如,基本上,你不想让两个居民bool类型(或Set在勒柯克的话),即truefalse相等。但是,如果将它们放入Prop,它们将被平等对待。


有趣的。我相信您会在几分钟之内在Coq邮件列表中得到答复。(如果需要,请确保在此处发布回复。)
Dave Clarke

2
对于那些好奇您的问题但又不熟悉Coq的人,您是否可以添加一两个句子来解释该定理在英语中的含义?(也许什么“证明无关紧要”是关于什么的?)
Joshua Grochow 2011年

@约书亚,我不足以详细解释它,因为它对我来说还是新事物,这也是为什么它困扰了我很多时间的原因。但是无论如何,这是我的尝试(请参阅问题部分)。

6
@约书亚(IIRC),在构造数学中,像这样的蕴涵证明将A证明转换B证明的函数/过程/算法/构造,并且如果得到的证明不成立,则该构造也不是证明。B不依赖于为A给出哪个证明。ABABBA
卡夫

Answers:


28

Coq背后的理论通常并不暗示证明无关紧要。甚至不暗示证明与平等无关。它相当于施特莱歇尔的公理ķ。两者都可以添加为公理

在某些情况下,推理证明对象很有用,而证明无关紧要使得这几乎不可能。可以说,这些发展应该将所有其结构问题重塑的对象Set,但是有了基本的Coq理论,可能性就有了。

证明无关紧要的一个重要子情况始终存在。Streicher的公理K始终在可判定域上成立,即,可判定集上的相等证明是唯一的。通用证明在Eqdep_decCoq标准库的模块中。这是推论的定理(我在这里的证明不一定是最优雅的):

Require Bool.
Require Eqdep_dec.
Theorem bool_pirrel : forall (b : bool) (p1 p2 : b = true), p1 = p2.
Proof.
  intros; apply Eqdep_dec.eq_proofs_unicity; intros.
  destruct (Bool.bool_dec x y); tauto.
Qed.

对于这种特殊情况,这是一个直接证明(受中的一般证明启发Eqdep_dec.v)。首先,定义我们定义的规范证明true=b(与Coq中一样,首先拥有常量会更容易)。然后,我们表明,任何证据true=b必须是refl_equal true

Let nu b (p:true = b) : true = b :=
  match Bool.bool_dec true b with
    | left eqxy => eqxy
    | right neqxy => False_ind _ (neqxy p)
  end.
Lemma bool_pcanonical : forall (b : bool) (p : true = b), p = nu b p.
Proof.
  intros. case p. destruct b.
  unfold nu; simpl. reflexivity.
  discriminate p.
Qed.

如果将经典逻辑添加到Coq中,则会得到不相关的证明。直观地讲,经典逻辑为您提供了一个针对命题的决策预言,对于公理K来说已经足够了。Coq标准库模块中有一个证明Classical_Prop

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.