Built with Alectryon, running Coq+SerAPI v8.16.0+0.16.3. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑ Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use instead of Ctrl.
From Tealeaves Require Import
  Classes.Kleisli.DecoratedTraversableFunctor
  Classes.Coalgebraic.DecoratedTraversableFunctor.

Import Product.Notations.
Import Kleisli.DecoratedTraversableFunctor.Notations.
Import Batch.Notations.
Import Monoid.Notations.

#[local] Generalizable Variables E G T M A B.

#[local] Arguments batch {A} (B)%type_scope _.


(** * Coalgebraic DTFs from Kleisli DTFs *)
(**********************************************************************)

(** ** Derived Operations *)
(**********************************************************************)
Module DerivedOperations.

  #[export] Instance ToBatch3_Mapdt `{Mapdt E T}
: Coalgebraic.DecoratedTraversableFunctor.ToBatch3 E T :=
  (fun A B => mapdt (G := Batch (E * A) B) (batch B):
     T A -> Batch (E * A) B (T B)).

End DerivedOperations.

Class Compat_ToBatch3_Mapdt
  (E: Type)
  (T: Type -> Type)
  `{Mapdt_inst: Mapdt E T}
  `{ToBatch3_inst: ToBatch3 E T} :=
  compat_toBatch3_mapdt:
    ToBatch3_inst = DerivedOperations.ToBatch3_Mapdt.

E: Type
T: Type -> Type
Mapdt_inst: Mapdt E T
ToBatch3_inst: ToBatch3 E T
H: Compat_ToBatch3_Mapdt E T

forall A B : Type, toBatch3 = mapdt (batch B)
E: Type
T: Type -> Type
Mapdt_inst: Mapdt E T
ToBatch3_inst: ToBatch3 E T
H: Compat_ToBatch3_Mapdt E T

forall A B : Type, toBatch3 = mapdt (batch B)
E: Type
T: Type -> Type
Mapdt_inst: Mapdt E T
ToBatch3_inst: ToBatch3 E T
H: Compat_ToBatch3_Mapdt E T
A, B: Type

toBatch3 = mapdt (batch B)
E: Type
T: Type -> Type
Mapdt_inst: Mapdt E T
ToBatch3_inst: ToBatch3 E T
H: Compat_ToBatch3_Mapdt E T
A, B: Type

DerivedOperations.ToBatch3_Mapdt A B = mapdt (batch B)
reflexivity. Qed. #[export] Instance Compat_ToBatch3_Mapdt_Self `{Mapdt E T}: Compat_ToBatch3_Mapdt E T (ToBatch3_inst := DerivedOperations.ToBatch3_Mapdt) := ltac:(hnf; reflexivity). Module DerivedInstances. Import DerivedOperations. Section to_coalgebraic. Context `{Kleisli.DecoratedTraversableFunctor.DecoratedTraversableFunctor E T} `{ToBatch3 E T} `{! Compat_ToBatch3_Mapdt E T}. (** ** <<double_batch3>> as <<batch ⋆3 batch>> *) (******************************************************************)
E: Type
T: Type -> Type
H: Mapdt E T
H0: Kleisli.DecoratedTraversableFunctor.DecoratedTraversableFunctor E T
H1: ToBatch3 E T
Compat_ToBatch3_Mapdt0: Compat_ToBatch3_Mapdt E T

forall A B C : Type, double_batch3 C = batch C ⋆3 batch B
E: Type
T: Type -> Type
H: Mapdt E T
H0: Kleisli.DecoratedTraversableFunctor.DecoratedTraversableFunctor E T
H1: ToBatch3 E T
Compat_ToBatch3_Mapdt0: Compat_ToBatch3_Mapdt E T

forall A B C : Type, double_batch3 C = batch C ⋆3 batch B
E: Type
T: Type -> Type
H: Mapdt E T
H0: Kleisli.DecoratedTraversableFunctor.DecoratedTraversableFunctor E T
H1: ToBatch3 E T
Compat_ToBatch3_Mapdt0: Compat_ToBatch3_Mapdt E T
A, B, C: Type

double_batch3 C = batch C ⋆3 batch B
E: Type
T: Type -> Type
H: Mapdt E T
H0: Kleisli.DecoratedTraversableFunctor.DecoratedTraversableFunctor E T
H1: ToBatch3 E T
Compat_ToBatch3_Mapdt0: Compat_ToBatch3_Mapdt E T
A, B, C: Type

(fun '(e, a) => (map (batch C ∘ pair e) ∘ batch B) (e, a)) = batch C ⋆3 batch B
now ext [e a]. Qed. (** ** Derived Laws *) (******************************************************************)
E: Type
T: Type -> Type
H: Mapdt E T
H0: Kleisli.DecoratedTraversableFunctor.DecoratedTraversableFunctor E T
H1: ToBatch3 E T
Compat_ToBatch3_Mapdt0: Compat_ToBatch3_Mapdt E T

forall A : Type, extract_Batch ∘ mapfst_Batch extract ∘ toBatch3 = id
E: Type
T: Type -> Type
H: Mapdt E T
H0: Kleisli.DecoratedTraversableFunctor.DecoratedTraversableFunctor E T
H1: ToBatch3 E T
Compat_ToBatch3_Mapdt0: Compat_ToBatch3_Mapdt E T

forall A : Type, extract_Batch ∘ mapfst_Batch extract ∘ toBatch3 = id
E: Type
T: Type -> Type
H: Mapdt E T
H0: Kleisli.DecoratedTraversableFunctor.DecoratedTraversableFunctor E T
H1: ToBatch3 E T
Compat_ToBatch3_Mapdt0: Compat_ToBatch3_Mapdt E T
A: Type

extract_Batch ∘ mapfst_Batch extract ∘ toBatch3 = id
E: Type
T: Type -> Type
H: Mapdt E T
H0: Kleisli.DecoratedTraversableFunctor.DecoratedTraversableFunctor E T
H1: ToBatch3 E T
Compat_ToBatch3_Mapdt0: Compat_ToBatch3_Mapdt E T
A: Type

extract_Batch ∘ (mapfst_Batch extract ∘ toBatch3) = id
E: Type
T: Type -> Type
H: Mapdt E T
H0: Kleisli.DecoratedTraversableFunctor.DecoratedTraversableFunctor E T
H1: ToBatch3 E T
Compat_ToBatch3_Mapdt0: Compat_ToBatch3_Mapdt E T
A: Type

extract_Batch ∘ (mapfst_Batch extract ∘ mapdt (batch A)) = id
E: Type
T: Type -> Type
H: Mapdt E T
H0: Kleisli.DecoratedTraversableFunctor.DecoratedTraversableFunctor E T
H1: ToBatch3 E T
Compat_ToBatch3_Mapdt0: Compat_ToBatch3_Mapdt E T
A: Type

extract_Batch ∘ mapdt (mapfst_Batch extract ∘ batch A) = id
E: Type
T: Type -> Type
H: Mapdt E T
H0: Kleisli.DecoratedTraversableFunctor.DecoratedTraversableFunctor E T
H1: ToBatch3 E T
Compat_ToBatch3_Mapdt0: Compat_ToBatch3_Mapdt E T
A: Type

mapdt (extract_Batch ∘ (mapfst_Batch extract ∘ batch A)) = id
E: Type
T: Type -> Type
H: Mapdt E T
H0: Kleisli.DecoratedTraversableFunctor.DecoratedTraversableFunctor E T
H1: ToBatch3 E T
Compat_ToBatch3_Mapdt0: Compat_ToBatch3_Mapdt E T
A: Type

mapdt (extract_Batch ∘ mapfst_Batch extract ∘ batch A) = id
E: Type
T: Type -> Type
H: Mapdt E T
H0: Kleisli.DecoratedTraversableFunctor.DecoratedTraversableFunctor E T
H1: ToBatch3 E T
Compat_ToBatch3_Mapdt0: Compat_ToBatch3_Mapdt E T
A: Type

extract_Batch ∘ mapfst_Batch extract ∘ batch A = extract
E: Type
T: Type -> Type
H: Mapdt E T
H0: Kleisli.DecoratedTraversableFunctor.DecoratedTraversableFunctor E T
H1: ToBatch3 E T
Compat_ToBatch3_Mapdt0: Compat_ToBatch3_Mapdt E T
A: Type
cut: extract_Batch ∘ mapfst_Batch extract ∘ batch A = extract
mapdt (extract_Batch ∘ mapfst_Batch extract ∘ batch A) = id
E: Type
T: Type -> Type
H: Mapdt E T
H0: Kleisli.DecoratedTraversableFunctor.DecoratedTraversableFunctor E T
H1: ToBatch3 E T
Compat_ToBatch3_Mapdt0: Compat_ToBatch3_Mapdt E T
A: Type

extract_Batch ∘ mapfst_Batch extract ∘ batch A = extract
E: Type
T: Type -> Type
H: Mapdt E T
H0: Kleisli.DecoratedTraversableFunctor.DecoratedTraversableFunctor E T
H1: ToBatch3 E T
Compat_ToBatch3_Mapdt0: Compat_ToBatch3_Mapdt E T
A: Type
e: E
a: A

(extract_Batch ∘ mapfst_Batch extract ∘ batch A) (e, a) = extract (e, a)
reflexivity.
E: Type
T: Type -> Type
H: Mapdt E T
H0: Kleisli.DecoratedTraversableFunctor.DecoratedTraversableFunctor E T
H1: ToBatch3 E T
Compat_ToBatch3_Mapdt0: Compat_ToBatch3_Mapdt E T
A: Type
cut: extract_Batch ∘ mapfst_Batch extract ∘ batch A = extract

mapdt (extract_Batch ∘ mapfst_Batch extract ∘ batch A) = id
E: Type
T: Type -> Type
H: Mapdt E T
H0: Kleisli.DecoratedTraversableFunctor.DecoratedTraversableFunctor E T
H1: ToBatch3 E T
Compat_ToBatch3_Mapdt0: Compat_ToBatch3_Mapdt E T
A: Type
cut: extract_Batch ∘ mapfst_Batch extract ∘ batch A = extract

mapdt extract = id
E: Type
T: Type -> Type
H: Mapdt E T
H0: Kleisli.DecoratedTraversableFunctor.DecoratedTraversableFunctor E T
H1: ToBatch3 E T
Compat_ToBatch3_Mapdt0: Compat_ToBatch3_Mapdt E T
A: Type
cut: extract_Batch ∘ mapfst_Batch extract ∘ batch A = extract

id = id
reflexivity. Qed.
E: Type
T: Type -> Type
H: Mapdt E T
H0: Kleisli.DecoratedTraversableFunctor.DecoratedTraversableFunctor E T
H1: ToBatch3 E T
Compat_ToBatch3_Mapdt0: Compat_ToBatch3_Mapdt E T

forall A B C : Type, cojoin_Batch3 ∘ toBatch3 = map toBatch3 ∘ toBatch3
E: Type
T: Type -> Type
H: Mapdt E T
H0: Kleisli.DecoratedTraversableFunctor.DecoratedTraversableFunctor E T
H1: ToBatch3 E T
Compat_ToBatch3_Mapdt0: Compat_ToBatch3_Mapdt E T
A, B, C: Type

cojoin_Batch3 ∘ toBatch3 = map toBatch3 ∘ toBatch3
E: Type
T: Type -> Type
H: Mapdt E T
H0: Kleisli.DecoratedTraversableFunctor.DecoratedTraversableFunctor E T
H1: ToBatch3 E T
Compat_ToBatch3_Mapdt0: Compat_ToBatch3_Mapdt E T
A, B, C: Type

cojoin_Batch3 ∘ mapdt (batch C) = map toBatch3 ∘ toBatch3
E: Type
T: Type -> Type
H: Mapdt E T
H0: Kleisli.DecoratedTraversableFunctor.DecoratedTraversableFunctor E T
H1: ToBatch3 E T
Compat_ToBatch3_Mapdt0: Compat_ToBatch3_Mapdt E T
A, B, C: Type

mapdt (cojoin_Batch3 ∘ batch C) = map toBatch3 ∘ toBatch3
E: Type
T: Type -> Type
H: Mapdt E T
H0: Kleisli.DecoratedTraversableFunctor.DecoratedTraversableFunctor E T
H1: ToBatch3 E T
Compat_ToBatch3_Mapdt0: Compat_ToBatch3_Mapdt E T
A, B, C: Type

mapdt (cojoin_Batch3 ∘ batch C) = map (mapdt (batch C)) ∘ toBatch3
E: Type
T: Type -> Type
H: Mapdt E T
H0: Kleisli.DecoratedTraversableFunctor.DecoratedTraversableFunctor E T
H1: ToBatch3 E T
Compat_ToBatch3_Mapdt0: Compat_ToBatch3_Mapdt E T
A, B, C: Type

mapdt (cojoin_Batch3 ∘ batch C) = map (mapdt (batch C)) ∘ mapdt (batch B)
E: Type
T: Type -> Type
H: Mapdt E T
H0: Kleisli.DecoratedTraversableFunctor.DecoratedTraversableFunctor E T
H1: ToBatch3 E T
Compat_ToBatch3_Mapdt0: Compat_ToBatch3_Mapdt E T
A, B, C: Type

mapdt (cojoin_Batch3 ∘ batch C) = mapdt (batch C ⋆3 batch B)
E: Type
T: Type -> Type
H: Mapdt E T
H0: Kleisli.DecoratedTraversableFunctor.DecoratedTraversableFunctor E T
H1: ToBatch3 E T
Compat_ToBatch3_Mapdt0: Compat_ToBatch3_Mapdt E T
A, B, C: Type

mapdt (cojoin_Batch3 ∘ batch C) = mapdt (double_batch3 C)
E: Type
T: Type -> Type
H: Mapdt E T
H0: Kleisli.DecoratedTraversableFunctor.DecoratedTraversableFunctor E T
H1: ToBatch3 E T
Compat_ToBatch3_Mapdt0: Compat_ToBatch3_Mapdt E T
A, B, C: Type

mapdt (cojoin_Batch3 ∘ batch C) = mapdt (cojoin_Batch3 ∘ batch C)
reflexivity. Qed. #[export] Instance Coalgebraic_DecoratedTraversableFunctor_of_Kleisli: Coalgebraic.DecoratedTraversableFunctor.DecoratedTraversableFunctor E T := {| dtf_extract := toBatch3_extract_Kleisli; dtf_duplicate := toBatch3_duplicate_Kleisli; |}. End to_coalgebraic. End DerivedInstances.