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 Export
Classes.Functor
Functors.List
Classes.Monoid
Classes.Kleisli.DecoratedMonad.Import List.ListNotations.Import Monoid.Notations.(** * Mapping over a List with History *)(**********************************************************************)(** ** Operation <<hmap>> *)(**********************************************************************)(* Map a context-sensitive function over the list, where the context is the prefix of the list up to the point considered. hfold = fold with history. *)Fixpointhmap {AB: Type} (f: list A * A -> B) (l: list A): list B :=
match l with
| nil => nil
| cons a rest => cons (f (Ƶ, a)) (hmap (preincr f [a]) rest)
end.
A, B: Type f: list A * A -> B a: A l: list A
hmap f (a :: l) = f (Ƶ, a) :: hmap (f ⦿ [a]) l
A, B: Type f: list A * A -> B a: A l: list A
hmap f (a :: l) = f (Ƶ, a) :: hmap (f ⦿ [a]) l
reflexivity.Qed.
forall (WAWB : Type) (ρf : list WA * WA -> WB)
(wawa' : list WA),
hmap ρf (wa ● wa') = hmap ρf wa ● hmap (ρf ⦿ wa) wa'
forall (WAWB : Type) (ρf : list WA * WA -> WB)
(wawa' : list WA),
hmap ρf (wa ● wa') = hmap ρf wa ● hmap (ρf ⦿ wa) wa'
WA, WB: Type ρf: list WA * WA -> WB wa, wa': list WA
WA, WB: Type a: WA wa, wa': list WA IHwa: forallρf : list WA * WA -> WB,
hmap ρf (wa ● wa') =
hmap ρf wa ● hmap (ρf ⦿ wa) wa' ρf: list WA * WA -> WB
hmap (ρf ⦿ [a]) wa ● hmap ((ρf ⦿ [a]) ⦿ wa) wa' =
hmap (ρf ⦿ [a]) wa ● hmap (ρf ⦿ (a :: wa)) wa'
WA, WB: Type a: WA wa, wa': list WA IHwa: forallρf : list WA * WA -> WB,
hmap ρf (wa ● wa') =
hmap ρf wa ● hmap (ρf ⦿ wa) wa' ρf: list WA * WA -> WB
hmap (ρf ⦿ [a]) wa ● hmap (ρf ⦿ ([a] ● wa)) wa' =
hmap (ρf ⦿ [a]) wa ● hmap (ρf ⦿ (a :: wa)) wa'
reflexivity.Qed.(** ** Alternative Definition of <<hmap>> *)(**********************************************************************)ModuleHmap_alt.Fixpointhmap_rec
{AB: Type} (f: list A * A -> B) (ctx: list A) (l: list A): list B :=
match l with
| nil => nil
| cons a rest => cons (f (ctx, a)) (hmap_rec f (ctx ● [a]) rest)
end.
A, B: Type f: list A * A -> B ctx: list A a: A l: list A
hmap_rec f ctx (a :: l) =
f (ctx, a) :: hmap_rec f (ctx ++ [a]) l
A, B: Type f: list A * A -> B ctx: list A a: A l: list A
hmap_rec f ctx (a :: l) =
f (ctx, a) :: hmap_rec f (ctx ++ [a]) l
reflexivity.Qed.Definitionhmap' {AB: Type} (f: list A * A -> B): list A -> list B :=
hmap_rec f nil.
forall (AB : Type) (f : list A * A -> B) (a : list A),
hmap (f ⦿ a) = hmap_rec f a
forall (AB : Type) (f : list A * A -> B) (a : list A),
hmap (f ⦿ a) = hmap_rec f a
A, B: Type f: list A * A -> B a: list A
hmap (f ⦿ a) = hmap_rec f a
A, B: Type f: list A * A -> B a, l: list A
hmap (f ⦿ a) l = hmap_rec f a l
A, B: Type f: list A * A -> B l: list A
foralla : list A, hmap (f ⦿ a) l = hmap_rec f a l
A, B: Type f: list A * A -> B
foralla : list A, hmap (f ⦿ a) [] = hmap_rec f a []
A, B: Type f: list A * A -> B a: A l: list A IHl: foralla : list A, hmap (f ⦿ a) l = hmap_rec f a l
foralla0 : list A,
hmap (f ⦿ a0) (a :: l) = hmap_rec f a0 (a :: l)
A, B: Type f: list A * A -> B
foralla : list A, hmap (f ⦿ a) [] = hmap_rec f a []
A, B: Type f: list A * A -> B a: list A
hmap (f ⦿ a) [] = hmap_rec f a []
reflexivity.
A, B: Type f: list A * A -> B a: A l: list A IHl: foralla : list A, hmap (f ⦿ a) l = hmap_rec f a l
foralla0 : list A,
hmap (f ⦿ a0) (a :: l) = hmap_rec f a0 (a :: l)
A, B: Type f: list A * A -> B a: A l: list A IHl: foralla : list A, hmap (f ⦿ a) l = hmap_rec f a l a0: list A
hmap (f ⦿ a0) (a :: l) = hmap_rec f a0 (a :: l)
A, B: Type f: list A * A -> B a: A l: list A IHl: foralla : list A, hmap (f ⦿ a) l = hmap_rec f a l a0: list A
(f ⦿ a0) (Ƶ, a) :: hmap ((f ⦿ a0) ⦿ [a]) l =
f (a0, a) :: hmap_rec f (a0 ● [a]) l
A, B: Type f: list A * A -> B a: A l: list A IHl: foralla : list A, hmap (f ⦿ a) l = hmap_rec f a l a0: list A
(f ⦿ a0) (Ƶ, a) :: hmap (f ⦿ (a0 ● [a])) l =
f (a0, a) :: hmap_rec f (a0 ● [a]) l
A, B: Type f: list A * A -> B a: A l: list A IHl: foralla : list A, hmap (f ⦿ a) l = hmap_rec f a l a0: list A
(f ⦿ a0) (Ƶ, a) :: hmap_rec f (a0 ● [a]) l =
f (a0, a) :: hmap_rec f (a0 ● [a]) l
A, B: Type f: list A * A -> B a: A l: list A IHl: foralla : list A, hmap (f ⦿ a) l = hmap_rec f a l a0: list A
f (a0 ● Ƶ, a) :: hmap_rec f (a0 ● [a]) l =
f (a0, a) :: hmap_rec f (a0 ● [a]) l
A, B: Type f: list A * A -> B a: A l: list A IHl: foralla : list A, hmap (f ⦿ a) l = hmap_rec f a l a0: list A
f (a0, a) :: hmap_rec f (a0 ● [a]) l =
f (a0, a) :: hmap_rec f (a0 ● [a]) l
reflexivity.Qed.
forall (AB : Type) (f : list A * A -> B),
hmap f = hmap' f
forall (AB : Type) (f : list A * A -> B),
hmap f = hmap' f