Skip to content
Snippets Groups Projects
Commit cee2597b authored by Ralf Jung's avatar Ralf Jung
Browse files

show that tele_app ∘ tele_bind is an identity; remove unused strange fmap instance

parent 49b04e85
No related branches found
No related tags found
No related merge requests found
......@@ -85,17 +85,6 @@ Lemma tele_fmap_app {T U} {TT : tele} (F : T → U) (t : TT -t> T) (x : TT) :
(F <$> t) x = F (t x).
Proof. apply tele_map_app. Qed.
Global Instance tele_fmap2 {TT1 TT2 : tele} : FMap (tele_fun TT1 tele_fun TT2) :=
λ T U, tele_map tele_map.
Lemma tele_fmap2_app {T U} {TT1 TT2 : tele} (F : T U) (t : TT1 -t> TT2 -t> T)
(x : TT1) (y : TT2) :
(F <$> t) x y = F (t x y).
Proof.
unfold fmap, tele_fmap2. simpl.
rewrite !tele_map_app. done.
Qed.
(** Operate below [tele_fun]s with argument telescope [TT]. *)
Fixpoint tele_bind {U} {TT : tele} : (TT U) TT -t> U :=
match TT as TT return (TT U) TT -t> U with
......@@ -105,8 +94,22 @@ Fixpoint tele_bind {U} {TT : tele} : (TT → U) → TT -t> U :=
end.
Arguments tele_bind {_ !_} _ /.
(** A function that looks funny. *)
Definition tele_arg_id (TT : tele) : TT -t> TT := tele_bind id.
(* Show that tele_app ∘ tele_bind is the identity. *)
Lemma tele_app_bind {U} {TT : tele} (f : TT U) x :
(tele_app $ tele_bind f) x = f x.
Proof.
induction TT as [|X b IH]; simpl in *.
- rewrite (tele_arg_O_inv x). done.
- destruct (tele_arg_S_inv x) as [x' [a' ->]]. simpl.
rewrite IH. done.
Qed.
(** We can define the identity function of the [-t>] function space. *)
Definition tele_id {TT : tele} : TT -t> TT := tele_bind id.
Lemma tele_id_eq {TT : tele} (x : TT) :
tele_id x = x.
Proof. unfold tele_id. rewrite tele_app_bind. done. Qed.
(** Notation *)
Notation "'[tele' x .. z ]" :=
......@@ -122,6 +125,9 @@ Notation "'[tele_arg' ]" := (TargO)
(format "[tele_arg ]").
(** Notation-compatible telescope mapping *)
(* This adds (tele_app ∘ tele_bind), which is an identity function, around every
binder so that, after simplifying, this matches the way we typically write
notations involving telescopes. *)
Notation "'λ..' x .. y , e" :=
(tele_app $ tele_bind (λ x, .. (tele_app $ tele_bind (λ y, e)) .. ))
(at level 200, x binder, y binder, right associativity,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment