Coq背后的理论通常并不暗示证明无关紧要。甚至不暗示证明与平等无关。它相当于施特莱歇尔的公理ķ。两者都可以添加为公理。
在某些情况下,推理证明对象很有用,而证明无关紧要使得这几乎不可能。可以说,这些发展应该将所有其结构问题重塑的对象Set
,但是有了基本的Coq理论,可能性就有了。
证明无关紧要的一个重要子情况始终存在。Streicher的公理K始终在可判定域上成立,即,可判定集上的相等证明是唯一的。通用证明在Eqdep_dec
Coq标准库的模块中。这是推论的定理(我在这里的证明不一定是最优雅的):
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
。