Skip to Content.
Sympa Menu

coq-club - Re: [Coq-Club] Eliminating equalities over dependent function types

coq-club AT inria.fr

Subject: The Coq mailing list

List archive

Re: [Coq-Club] Eliminating equalities over dependent function types


Chronological Thread 
  • From: Pierre-Marie Pédrot <pierre-marie.pedrot AT inria.fr>
  • To: coq-club AT inria.fr, Grant Jurgensen <mailing-lists.coq AT grant.jurgensen.dev>
  • Subject: Re: [Coq-Club] Eliminating equalities over dependent function types
  • Date: Wed, 3 Nov 2021 18:03:01 +0100
  • Ironport-data: A9a23:pjyGEqrw9svtBJy/IEIMTc1tUCxeBmLHZxIvgKrLsJaIsI5as4F+vjcfDW3VO6qIYTahKoglaYuxpBtQuJDdzddnSABsqno8QiMRo6IpJ/zJdxaqZ3v6wu7rFR88sZ1GMrEsFC2FJ5Pljk/F3oPJ8D8sislkepKmULSdY3kpHlc/IMscoUkLd9AR09cAbeeRU1vlVePa+6UzCXf9s9JGGjp8B5Gr9HuDiM/PVAYw5TTSUxzkUGj2zBH5BLpHTU24wuCRroN8RoZWTM6bpF21E/+wwvsjNj+luu6TnkwiceeDZ07X1CoQAu7730F3zsAw+vdicqNCNQEK1XPQxYkZJNZl7PRcTS8xP6DWgulYVhBCEiw4JaBK4rjbCXm5q82aiUPcG5fp66w+URBsbNNwFuFfRDsmGeYjADsKd1WIg/+86KmqT/FlwMUlNsjieo0F0lllxDDdDPApBJTCWLnRo9RfxR8/nMlIAbDcetAWZDx0YRKGbxBRUmr7orpWcPyA1yC6KmME7Q/L4PNtui7I0QZqlqD3N8rcdpqMSNk9o6pRnUqel0yRP/3QHIb3JeK5z0+R
  • Ironport-hdrordr: A9a23:JBDWp6MT3aImVcBcTuejsMiBIKoaSvp037By7TEWdfRUGvb3qyncpoVj6faUskdtZJhOo6HjBEDtex/hHNtOkO4s1NSZLXXbUQmTXeRfBOLZqlWKcUDDH6xmpMNdmsBFeaLN5DNB7PoSlTPIcOrIt+PmzEnHv4jjJjxWPHlXgulbnnxE4yigYzdLeDU=



On 03/11/2021 16:38, Grant Jurgensen wrote:
> I was wondering if the following property is provable (or disprovable)
> in Coq:
>
> Theorem forall_eq_elim: forall (A: Type) (B C: A -> Type),
>   (forall a, B a) = (forall a, C a) ->
>   (forall a, B a = C a).
>
> This is the converse of `forall_extensionality`, found in the standard
> module `Coq.Logic.FunctionalExtensionality`. Assuming functional
> extensionality, this `forall_eq_elim` property essentially states the
> injectivity of the forall binder.

I don't think it's disprovable because you have basically zero way to
prove an equality on types in CIC apart from reflexivity. But as soon as
you have a bit of power over equality this is dead wrong.

Take A := nat, B := fun _ => nat and C := fun _ => bool. By a
cardinality argument, (nat -> bool) = (nat -> nat) but there is no way
that bool = nat. The cardinality argument holds in quite a few models,
e.g. this is true both in Set and in HoTT.

If you pick a model where types are represented as syntactic codes it
might become provable but even there I am not sure.

PMP

Attachment: OpenPGP_signature
Description: OpenPGP digital signature




Archive powered by MHonArc 2.6.19+.

Top of Page