Skip to Content.
Sympa Menu

coq-club - Re: [Coq-Club] LEM variants vs. proof relevance

coq-club AT inria.fr

Subject: The Coq mailing list

List archive

Re: [Coq-Club] LEM variants vs. proof relevance


Chronological Thread 
  • From: Jonathan Leivent <jonikelee AT gmail.com>
  • To: coq-club AT inria.fr
  • Subject: Re: [Coq-Club] LEM variants vs. proof relevance
  • Date: Mon, 30 May 2016 11:28:36 -0400
  • Authentication-results: mail3-smtp-sop.national.inria.fr; spf=None smtp.pra=jonikelee AT gmail.com; spf=Pass smtp.mailfrom=jonikelee AT gmail.com; spf=None smtp.helo=postmaster AT mail-qg0-f54.google.com
  • Ironport-phdr: 9a23:fRHHcRCDVibkIF5P8blUUyQJP3N1i/DPJgcQr6AfoPdwSP74rsbcNUDSrc9gkEXOFd2CrakU2qyL6OuwByQp2tWojjMrSNR0TRgLiMEbzUQLIfWuLgnFFsPsdDEwB89YVVVorDmROElRH9viNRWJ+iXhpQAbFhi3DwdpPOO9QteU1JTmkb3psM2NKyxzxxODIppKZC2sqgvQssREyaBDEY0WjiXzn31TZu5NznlpL1/A1zz158O34YIxu38I46FppIZ8VvDxeL19RrhFBhwnNXo07Yvlr0rtVwyKs1kbVGwKkhNOSyzI7Q/3WIu55in9sOt+1S2XMOX5SLk1XXKp6KI9G0ygszsOKzNsqDKfscd3lq8O+B8=



On 05/28/2016 10:26 PM, Jason Gross wrote:
Have you considered LEM on hProps?
  forall P, (forall x y : P, x = y) -> P \/ ~P
Together with propositional truncation / quotient types, this may give you
want you want.  (I think these are similar to your irrelevant_sibling; you
do:
  Module Export Trunc.
    Private Inductive PropTrunc A := tr : A -> PropTrunc A.
    Axiom PropTrunc_trunc : forall {A} (x y : PropTrunc A), x = y.
    Definition Trunc_ind {A}
      (P : PropTrunc A -> Type) {Pt : forall x y, P x = P y}
    : (forall a, P (tr a)) -> (forall aa, P aa)
    := (fun f aa => match aa with tr a => fun _ => f a end Pt).
  End Trunc.
)
Does this do what you want?

It turns out that the Prop version of this Private trick, plus the proof relevance I'm working with, is inconsistent:

Module Export TruncP.
  Private Inductive PropTruncP (A : Prop) : Prop := tr : A -> PropTruncP A.
  Arguments tr [A] _.
  Axiom PropTruncP_trunc : forall {A : Prop} (x y : PropTruncP A), x = y.
  Definition TruncP_ind {A}
    (P : PropTruncP A -> Prop) {Pt : forall x y, P x = P y}
  : (forall a, P (tr a)) -> (forall aa, P aa)
    := (fun f aa => match aa with tr a => fun _ => f a end Pt).
End TruncP.

Inductive Erasable(A : Set) : Prop := erasable: A -> Erasable A.
Arguments erasable [A] _.
Axiom Erasable_inj : forall {A : Set}{a b : A}, erasable a=erasable b -> a=b. (*proof relevance*)

Inductive Foo : Prop := foo: bool -> Foo.

Definition foo2erasable(f : Foo) : Erasable bool :=
  match f with
    foo x => erasable x
  end.

Definition trunc_foo2erasable(f : PropTruncP Foo) : Erasable bool :=
  @TruncP_ind Foo (fun _ => Erasable bool) (fun _ _ => eq_refl) foo2erasable f.

Theorem inconsistent: False.
Proof.
  assert (tr (foo true) = tr (foo false)) as H by apply PropTruncP_trunc.
  apply f_equal with (f := trunc_foo2erasable) in H.
  cbv in H.
  apply Erasable_inj in H.
  discriminate.
Qed.


-- Jonathan




Archive powered by MHonArc 2.6.18.

Top of Page