Skip to Content.
Sympa Menu

coq-club - Re: [Coq-Club] Type casting of a dependent type

coq-club AT inria.fr

Subject: The Coq mailing list

List archive

Re: [Coq-Club] Type casting of a dependent type


Chronological Thread 
  • From: Maximilian Wuttke <mwuttke97 AT posteo.de>
  • To: coq-club AT inria.fr
  • Subject: Re: [Coq-Club] Type casting of a dependent type
  • Date: Mon, 28 Sep 2020 14:04:33 +0200
  • Authentication-results: mail3-smtp-sop.national.inria.fr; spf=None smtp.pra=mwuttke97 AT posteo.de; spf=Pass smtp.mailfrom=mwuttke97 AT posteo.de; spf=None smtp.helo=postmaster AT mout02.posteo.de
  • Ironport-phdr: 9a23:PuxBWBzlcQvmyYDXCy+O+j09IxM/srCxBDY+r6Qd2+sQIJqq85mqBkHD//Il1AaPAdyEragawLGI+4nbGkU4qa6bt34DdJEeHzQksu4x2zIaPcieFEfgJ+TrZSFpVO5LVVti4m3peRMNQJW2aFLduGC94iAPERvjKwV1Ov71GonPhMiryuy+4ZLebxhKiTanf79/LRq6oAvQu8ILnYZsN6E9xwfTrHBVYepW32RoJVySnxb4+Mi9+YNo/jpTtfw86cNOSL32cKskQ7NWCjQmKH0169bwtRbfVwuP52ATXXsQnxFVHgXK9hD6XpP2sivnqupw3TSRMMPqQbwoXzmp8qFmQwLqhigaLT406HzZhNJ+jKxboxyvqRJwzIHWb46JO/RzZb/dcNAASGZdQspcWS5MD4WhZIUPFeoBOuNYopH6qVQUohq+BAysBOLryj9JnHD227Ax3OQ8EQHawAwgHMwBu2nTodXwOqYSTPy1zLXLzTrda/5b2yzw6JDPchA6vfGDQ7VwfdDMxkYxDg7IiEibpoP5MT2PzOsNr3Sb4PR6VeKpk2MppR19rDavyMovjoTHiYwbxk7K+yhnz4g4Jd+1RFBlbNOqDJZdsyKXOoV5TM8+X2xkpig3x7IHtJC1fCYExokqyhjCYPKEa4iF+g/vWeWRLDtihX9oeqizihiz/ES6y+DxV9G43VVOoyZfj9XBuXEA2wbN5sSZVvdx5Fqt1DiT2w3V9+pKO1o7lbDBJJ4k2rMwloQcsUDEHiLunUX2i7KWdlk49uS28ejnerLmpoSAN4BqjQHyKLkhldKnDeQ5NAgBQXSb9Pyh2LDg/UD1WrRHg/8snqTXsZ3WP8UWq6+hDw9QyIkj6hK/Dzm80NQfmHkKNFdFeRyaj4j1J1HOI+73APO9jlm3iDdrwOvGPqH/DZXKNHTMjanuca5n60FA0Aoz0cxf55VMB74dJ/LzQ1b9u8DcDh8kKAO52P3nCdV41oMGQ22DGK6ZMKXIsV+J/O0jOeeMZJVG8Ar6fvMi/rvliWIzsV4bZ6igm5UNO16iGfEzBkyJYH/thtYIFy81oxYiT+Gi3FidTCJPZHvjAIok4SonBYXgAYqVFdPlu6CIwCruRs4eXWtBEF3ZSS61JbXBYO8FbWepGuEkkjEAUuHxGYomyA327knizKF7I+2S9iBK7cuyhugw3PXakFQJzRIxCs2c12+XSGQtxzEQQCQq0ac5rUEvkw7fg5g9uORREJlo390MSh0zbMeO1+thF931HA7MLI+E

You can indeed 'cast' a value from type `T (f a)` to type `T (g a)` if
you can prove `f a = g a`. To do that, you use the eliminator on `eq`:

```
eq_rect
: forall (A : Type) (x : A) (P : A -> Type), P x ->
forall y : A, x = y -> P y
```

MWE:

```
Parameter A : Type.
Parameter f g : A -> A.
Parameter T : A -> Type.
Parameter omega : forall a : A, T (f a).

Parameter f_a_eq_g_a : forall (a : A), f a = g a.


Definition cast : forall a : A, T (g a).
Proof.
intros a.
elim (f_a_eq_g_a a).
apply omega.
*)
Defined.

Print cast.
(*
cast =
fun a : A => eq_rect (f a) (fun a0 : A => T a0) (omega a) (g a)
(f_a_eq_g_a a)
: forall a : A, T (g a)
*)
```


On 28/09/2020 08:40, 劉弘毅 wrote:
> Hi,
> I defined a function about (A: Type), (f: A -> A),  and (T: A -> Type)
> as follows.
>
> Definition omega (a: A): T (f a)  := (* Expression *).
>
> I also took (g: A -> A) and proved the following lemma.
>
> Lemma f_a_eq_g_a : forall (a: A),  f a = g a.
>
> Now, I want to treat (omega a) as a value in (T (g a)). Is there any
> easy way to do this?
> Regards,
> Koki



Archive powered by MHonArc 2.6.19+.

Top of Page