平构构造中的构造函数是否是不相交和内射的?

时间:2017-05-03 14:03:20

标签: functional-programming coq dependent-type

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中所述)?

This seems to cause trouble in Idris

1 个答案:

答案 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.

我们无法证明truefalse在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.