Tel.v


(*

      Télescopes généralisés.

(d'après la notion de télescope décrite dans l'article de N.G. De Bruijn "Telescoping mappings in typed lambda calculus", Information and Computation, vol 91, No 2, pp 189-204, avril 91).


Loïc Pottier

Un télescope est une suite d'abstractions:
[x1:T1][x2:T2(x1)]...[xn:Tn(x1,...,xn-1)]

*)


Implicit Arguments On.

(*
 Un type pour représenter les télescopes:
*)



Mutual Inductive tel: Type :=
     T0:
tel
    | Tc: (T:Type) (T ->tel) ->tel .

(* 
Ce type contient en fait plus que les télescopes de De Bruijn, puisque si x:T et f:T -> tel, le telsecope f(x) peut etre de longueur variable selon x.

Benjamin Werner m'a fait remarquer que c'est un type isomorphe à celui des ensembles de Peter Aczel. Tant mieux!

Pour déstructurer un télescope:
*)


Definition tel_fst: tel ->Type.
Intros t.
Case t.
Exact True.
Intros T f; Try Assumption.
Defined.

Definition tel_fun: (t:tel) (tel_fst t) ->tel.
Intros t; Try Assumption.
Case t.
Simpl.
Exact [x:True]T0.
Simpl.
Intros T H'.
Exact H'.
Defined.

(*
Un élément d'un télescope [x1:T1][x2:T2(x1)]...[xn:Tn(x1,...,xn-1)] est une suite de variables
 x1,...,xn avec les types correspondants.
*)

Mutual Inductive el_tel: tel ->Type :=
     el_T0: (el_tel T0)
    | el_Tc: (T:Type) (x:T) (f:T ->tel) (el_tel (f x)) ->(el_tel (Tc f)) .

(*
Fonctions de déstructuration de ces éléments.
*)


Definition el_fst: (t:tel) (e:(el_tel t))(tel_fst t).
Intros t e; Try Assumption.
Case e; Simpl.
Exact I.
Intros T x f H'; Try Assumption.
Defined.

Lemma el_fst_prop:
  (T:Type) (f:T ->
tel) (x:T) (y:(el_tel (f x)))<T> (el_fst (el_Tc y))==x.
Simpl; Auto with core.
Qed.

Definition el_rem: (t:tel) (e:(el_tel t))(el_tel (!tel_fun t (el_fst e))).
Intros t e.
Case e.
Simpl.
Exact el_T0.
Simpl.
Intros T x f H'; Try Assumption.
Defined.

Lemma el_rem_prop_type:
  (T:Type) (f:T ->
tel) (x:T) (y:(el_tel (f x)))
  (el_tel (f x))==(el_tel (!tel_fun (Tc f) (el_fst (el_Tc y)))).
Simpl; Auto with core.
Qed.

Lemma el_rem_prop:
  (T:Type) (f:T ->
tel) (x:T) (y:(el_tel (f x)))
  <(el_tel (!tel_fun (Tc f) (el_fst (el_Tc y))))> (el_rem (el_Tc y))==y.
Simpl; Auto with core.
Qed.

(*
Le n-ième type d'un télescope.
*)


Definition tel_nth: (t:tel) nat -> (el_tel t) ->Type.
Fix 2.
Intros t n e.
Case n.
Exact (tel_fst t).
Intros n0.
Exact (tel_nth (tel_fun (el_fst e)) n0 (el_rem e)).
Defined.

(*
Le nième élément d'un élément de télescope.
*)


Definition el_nth: (t:tel) (n:nat) (e:(el_tel t))(tel_nth n e).
Fix 2.
Intros t n e.
Case n.
Exact (el_fst e).
Intros n0.
Exact (el_nth (tel_fun (el_fst e)) n0 (el_rem e)).
Defined.

22/01/99, 13:45