Based on this answer,看起来像Coq中使用的归纳结构的微积分,对于归纳类型具有不相交的内射构造函数。
在结构的简单演算中(即没有原始归纳类型),它使用类型的impredicative编码(例如∏(Nat: *).∏(Succ: Nat → Nat).∏(Zero: Nat).Nat
),这仍然是正确的吗?我能不能总是找出哪个"构造函数"用过吗?另外,Coq与Prop或impredicative Set中可以证明是否具有注入性(如∀a b.I a = I b → a = b
中所述)?
答案 0 :(得分:4)
(我不确定你提出的所有要点,所以我将这个答案作为一个社区维基,以便其他人可以加入它。)
为了完整起见,让我们以布尔运算的一种不可预测的编码为例。我还包括了一些基本连接词的编码。
Definition bool : Prop := forall (A : Prop), A -> A -> A.
Definition false : bool := fun A _ Hf => Hf.
Definition true : bool := fun A Ht _ => Ht.
Definition eq (n m : bool) : Prop :=
forall (P : bool -> Prop), P n -> P m.
Definition False : Prop := forall (A : Prop), A.
我们无法证明true
和false
在CoC中是不相交的;也就是说,以下陈述不可证明:
eq false true -> False.
这是因为,如果这个陈述在CoC中是可证明的,我们将能够在Coq中证明true <> false
,这将与proof irrelevance相矛盾,这是一个有效的公理原则。这是一个证据:
Section injectivity_is_not_provable.
Variable Hneq : eq false true -> False. (* suppose it's provable in CoC *)
Lemma injectivity : false <> true.
Proof.
intros Heq.
rewrite Heq in Hneq.
now apply (Hneq (fun P x => x)).
Qed.
Require Import Coq.Logic.ProofIrrelevance.
Fact contradiction : Logic.False.
Proof.
pose proof (proof_irrelevance bool false true) as H.
apply (injectivity H).
Qed.
End injectivity_is_not_provable.