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
Functors.List
Functors.Early.Environment
Classes.Kleisli.Theory.DecoratedTraversableFunctor.Import Subset.Notations.Import DecoratedContainerFunctor.Notations.Import List.ListNotations.Import Monoid.Notations.(** * Decorated Container Instance for <<env>> *)(**********************************************************************)Sectionenv_instance.Context {E: Type}.#[export] InstanceToCtxset_env: ToCtxset E (env E) :=
fun (A: Type) (s: env E A) =>
tosubset (F := list) s.
E: Type
Compat_ToCtxset_Mapdt E (env E)
E: Type
Compat_ToCtxset_Mapdt E (env E)
E: Type
ToCtxset_env = ToCtxset_Mapdt
E: Type
(fun (A : Type) (s : env E A) => tosubset s) =
ToCtxset_Mapdt
E: Type
(fun (A : Type) (s : env E A) => tosubset s) =
(funA : Type => mapdReduce ret)
E, A: Type l: env E A
tosubset l = mapdReduce ret l
E, A: Type l: env E A
tosubset l = mapdt ret l
E, A: Type l: env E A
tosubset l =
Mapdt_env E (const (E * A -> Prop)) Map_const
Pure_const Mult_const A False ret l
E, A: Type l: env E A
tosubset l = mapdt_env E (const (E * A -> Prop)) ret l
E, A: Type
tosubset [] =
mapdt_env E (const (E * A -> Prop)) ret []
E, A: Type a: E * A l: list (E * A) IHl: tosubset l = mapdt_env E (const (E * A -> Prop)) ret l
tosubset (a :: l) =
mapdt_env E (const (E * A -> Prop)) ret (a :: l)
E, A: Type
tosubset [] =
mapdt_env E (const (E * A -> Prop)) ret []
reflexivity.
E, A: Type a: E * A l: list (E * A) IHl: tosubset l = mapdt_env E (const (E * A -> Prop)) ret l
tosubset (a :: l) =
mapdt_env E (const (E * A -> Prop)) ret (a :: l)
E, A: Type e: E a: A l: list (E * A) IHl: tosubset l = mapdt_env E (const (E * A -> Prop)) ret l
tosubset ((e, a) :: l) =
mapdt_env E (const (E * A -> Prop)) ret ((e, a) :: l)
E, A: Type e: E a: A l: list (E * A) IHl: tosubset l = mapdt_env E (const (E * A -> Prop)) ret l
{{(e, a)}} ∪ tosubset l =
mapdt_env E (const (E * A -> Prop)) ret ((e, a) :: l)
E, A: Type e: E a: A l: list (E * A) IHl: tosubset l = mapdt_env E (const (E * A -> Prop)) ret l
{{(e, a)}} ∪ tosubset l =
(pure cons ● map (pair e) (ret (e, a)))
● mapdt_env E (const (E * A -> Prop)) ret l
E, A: Type e: E a: A l: list (E * A) IHl: tosubset l = mapdt_env E (const (E * A -> Prop)) ret l
{{(e, a)}} ∪ tosubset l =
(Ƶ ● ret (e, a))
● mapdt_env E (const (E * A -> Prop)) ret l
E, A: Type e: E a: A l: list (E * A) IHl: tosubset l = mapdt_env E (const (E * A -> Prop)) ret l
{{(e, a)}} ∪ tosubset l =
∅ ∪ ret (e, a)
∪ mapdt_env E (const (E * A -> Prop)) ret l
E, A: Type e: E a: A l: list (E * A) IHl: tosubset l = mapdt_env E (const (E * A -> Prop)) ret l
{{(e, a)}} ∪ mapdt_env E (const (E * A -> Prop)) ret l =
∅ ∪ ret (e, a)
∪ mapdt_env E (const (E * A -> Prop)) ret l
E, A: Type e: E a: A l: list (E * A) IHl: tosubset l = mapdt_env E (const (E * A -> Prop)) ret l
{{(e, a)}} = ∅ ∪ ret (e, a)
E, A: Type e: E a: A l: list (E * A) IHl: tosubset l = mapdt_env E (const (E * A -> Prop)) ret l
{{(e, a)}} = ret (e, a)
reflexivity.Qed.(** ** Rewriting Rules for <<toctxset>> *)(********************************************************************)
E: Type
forallA : Type, toctxset [] = ∅
E: Type
forallA : Type, toctxset [] = ∅
reflexivity.Qed.
E: Type
forall (A : Type) (e : E) (a : A),
toctxset [(e, a)] = {{(e, a)}}
E: Type
forall (A : Type) (e : E) (a : A),
toctxset [(e, a)] = {{(e, a)}}
E, A: Type e: E a: A
toctxset [(e, a)] = {{(e, a)}}
E, A: Type e: E a: A
tosubset [(e, a)] = {{(e, a)}}
E, A: Type e: E a: A
{{(e, a)}} ∪ ∅ = {{(e, a)}}
E, A: Type e: E a: A
{{(e, a)}} = {{(e, a)}}
reflexivity.Qed.
E: Type
forall (A : Type) (e : E) (a : A) (l : env E A),
toctxset ((e, a) :: l) = {{(e, a)}} ∪ toctxset l
E: Type
forall (A : Type) (e : E) (a : A) (l : env E A),
toctxset ((e, a) :: l) = {{(e, a)}} ∪ toctxset l
reflexivity.Qed.
E: Type
forall (A : Type) (l1l2 : env E A),
toctxset (l1 ++ l2) = toctxset l1 ∪ toctxset l2
E: Type
forall (A : Type) (l1l2 : env E A),
toctxset (l1 ++ l2) = toctxset l1 ∪ toctxset l2
forall (AB : Type) (f : A -> B),
map f ∘ toctxset = toctxset ∘ map f
E: Type
Functor (env E)
trytypeclasses eauto.
E: Type
Functor (ctxset E)
typeclasses eauto.
E: Type
forall (AB : Type) (f : A -> B),
map f ∘ toctxset = toctxset ∘ map f
E: Type
forall (AB : Type) (f : A -> B),
map f ∘ (funs : env E A => tosubset s) =
(funs : env E B => tosubset s) ∘ map f
E, A, B: Type f: A -> B
map f ∘ (funs : env E A => tosubset s) =
(funs : env E B => tosubset s) ∘ map f
E, A, B: Type f: A -> B
map (map f) ∘ (funs : env E A => tosubset s) =
(funs : env E B => tosubset s) ∘ map f
E, A, B: Type f: A -> B
tosubset ∘ map (map f) =
(funs : env E B => tosubset s) ∘ map f
E, A, B: Type f: A -> B
tosubset ∘ map (map f) =
(funs : env E B => tosubset s) ∘ map (map f)
reflexivity.Qed.(** ** <<toctxset>> is a Homomorphism of Decorated Functors *)(********************************************************************)
E: Type
DecoratedHom E (env E) (ctxset E)
(@toctxset E (env E) ToCtxset_env)
E: Type
DecoratedHom E (env E) (ctxset E)
(@toctxset E (env E) ToCtxset_env)
E: Type
forall (AB : Type) (f : E * A -> B),
mapd f ∘ toctxset = toctxset ∘ mapd f
E, A, B: Type f: E * A -> B
mapd f ∘ toctxset = toctxset ∘ mapd f
E, A, B: Type f: E * A -> B Γ: env E A e: E b: B
(mapd f ∘ toctxset) Γ (e, b) =
(toctxset ∘ mapd f) Γ (e, b)
E, A, B: Type f: E * A -> B Γ: env E A e: E b: B
((fun (s : ctxset E A) '(e, b) =>
existsa : A, s (e, a) /\ f (e, a) = b)
∘ (funs : env E A => tosubset s)) Γ (e, b) =
((funs : env E B => tosubset s) ∘ mapd f) Γ (e, b)
E, A, B: Type f: E * A -> B Γ: env E A e: E b: B
(existsa : A, tosubset Γ (e, a) /\ f (e, a) = b) =
tosubset (mapd f Γ) (e, b)
E, A, B: Type f: E * A -> B e: E b: B
(existsa : A, tosubset [] (e, a) /\ f (e, a) = b) =
tosubset (mapd f []) (e, b)
E, A, B: Type f: E * A -> B a: E * A Γ: list (E * A) e: E b: B IHΓ: (existsa : A, tosubset Γ (e, a) /\ f (e, a) = b) =
tosubset (mapd f Γ) (e, b)
(existsa0 : A,
tosubset (a :: Γ) (e, a0) /\ f (e, a0) = b) =
tosubset (mapd f (a :: Γ)) (e, b)
E, A, B: Type f: E * A -> B e: E b: B
(existsa : A, tosubset [] (e, a) /\ f (e, a) = b) =
tosubset (mapd f []) (e, b)
E, A, B: Type f: E * A -> B e: E b: B
(existsa : A, False /\ f (e, a) = b) = False
E, A, B: Type f: E * A -> B e: E b: B
(existsa : A, False /\ f (e, a) = b) -> False
E, A, B: Type f: E * A -> B e: E b: B
False -> existsa : A, False /\ f (e, a) = b
E, A, B: Type f: E * A -> B e: E b: B
(existsa : A, False /\ f (e, a) = b) -> False
E, A, B: Type f: E * A -> B e: E b: B a: A contra: False heq: f (e, a) = b
False
contradiction.
E, A, B: Type f: E * A -> B e: E b: B
False -> existsa : A, False /\ f (e, a) = b
contradiction.
E, A, B: Type f: E * A -> B a: E * A Γ: list (E * A) e: E b: B IHΓ: (existsa : A, tosubset Γ (e, a) /\ f (e, a) = b) =
tosubset (mapd f Γ) (e, b)
(existsa0 : A,
tosubset (a :: Γ) (e, a0) /\ f (e, a0) = b) =
tosubset (mapd f (a :: Γ)) (e, b)
E, A, B: Type f: E * A -> B e': E a: A Γ: list (E * A) e: E b: B IHΓ: (existsa : A, tosubset Γ (e, a) /\ f (e, a) = b) =
tosubset (mapd f Γ) (e, b)
(existsa0 : A,
tosubset ((e', a) :: Γ) (e, a0) /\ f (e, a0) = b) =
tosubset (mapd f ((e', a) :: Γ)) (e, b)
E, A, B: Type f: E * A -> B e': E a: A Γ: list (E * A) e: E b: B IHΓ: (existsa : A, tosubset Γ (e, a) /\ f (e, a) = b) =
tosubset (mapd f Γ) (e, b)
(existsa0 : A,
tosubset ((e', a) :: Γ) (e, a0) /\ f (e, a0) = b) =
((e', f (e', a)) = (e, b) \/ (e, b) ∈d mapd f Γ)
E, A, B: Type f: E * A -> B e': E a: A Γ: list (E * A) e: E b: B
(existsa0 : A,
tosubset ((e', a) :: Γ) (e, a0) /\ f (e, a0) = b) =
((e', f (e', a)) = (e, b) \/
(existsa : A, tosubset Γ (e, a) /\ f (e, a) = b))
E, A, B: Type f: E * A -> B e': E a: A Γ: list (E * A) e: E b: B
(existsa0 : A,
({{(e', a)}} ∪ tosubset Γ) (e, a0) /\ f (e, a0) = b) =
((e', f (e', a)) = (e, b) \/
(existsa : A, tosubset Γ (e, a) /\ f (e, a) = b))
E, A, B: Type f: E * A -> B e': E a: A Γ: list (E * A) e: E b: B
(existsa0 : A,
({{(e', a)}} ∪ tosubset Γ) (e, a0) /\ f (e, a0) = b) ->
(e', f (e', a)) = (e, b) \/
(existsa : A, tosubset Γ (e, a) /\ f (e, a) = b)
E, A, B: Type f: E * A -> B e': E a: A Γ: list (E * A) e: E b: B
(e', f (e', a)) = (e, b) \/
(existsa : A, tosubset Γ (e, a) /\ f (e, a) = b) ->
existsa0 : A,
({{(e', a)}} ∪ tosubset Γ) (e, a0) /\ f (e, a0) = b
E, A, B: Type f: E * A -> B e': E a: A Γ: list (E * A) e: E b: B
(existsa0 : A,
({{(e', a)}} ∪ tosubset Γ) (e, a0) /\ f (e, a0) = b) ->
(e', f (e', a)) = (e, b) \/
(existsa : A, tosubset Γ (e, a) /\ f (e, a) = b)
E, A, B: Type f: E * A -> B e': E a: A Γ: list (E * A) e: E b: B a': A Hin: {{(e', a)}} (e, a') Heq: f (e, a') = b
(e', f (e', a)) = (e, b) \/
(existsa : A, tosubset Γ (e, a) /\ f (e, a) = b)
E, A, B: Type f: E * A -> B e': E a: A Γ: list (E * A) e: E b: B a': A Hin: tosubset Γ (e, a') Heq: f (e, a') = b
(e', f (e', a)) = (e, b) \/
(existsa : A, tosubset Γ (e, a) /\ f (e, a) = b)
E, A, B: Type f: E * A -> B e': E a: A Γ: list (E * A) e: E b: B a': A Hin: {{(e', a)}} (e, a') Heq: f (e, a') = b
(e', f (e', a)) = (e, b) \/
(existsa : A, tosubset Γ (e, a) /\ f (e, a) = b)
E, A, B: Type f: E * A -> B e': E a: A Γ: list (E * A) e: E b: B a': A Hin: {{(e', a)}} (e, a') Heq: f (e, a') = b
(e', f (e', a)) = (e, b)
E, A, B: Type f: E * A -> B e': E a: A Γ: list (E * A) e: E b: B a': A Hin: (e', a) = (e, a') Heq: f (e, a') = b
(e', f (e', a)) = (e, b)
nowinversion Hin; subst.
E, A, B: Type f: E * A -> B e': E a: A Γ: list (E * A) e: E b: B a': A Hin: tosubset Γ (e, a') Heq: f (e, a') = b
(e', f (e', a)) = (e, b) \/
(existsa : A, tosubset Γ (e, a) /\ f (e, a) = b)
E, A, B: Type f: E * A -> B e': E a: A Γ: list (E * A) e: E b: B a': A Hin: tosubset Γ (e, a') Heq: f (e, a') = b
existsa : A, tosubset Γ (e, a) /\ f (e, a) = b
now (existsa').
E, A, B: Type f: E * A -> B e': E a: A Γ: list (E * A) e: E b: B
(e', f (e', a)) = (e, b) \/
(existsa : A, tosubset Γ (e, a) /\ f (e, a) = b) ->
existsa0 : A,
({{(e', a)}} ∪ tosubset Γ) (e, a0) /\ f (e, a0) = b
E, A, B: Type f: E * A -> B e': E a: A Γ: list (E * A) e: E b: B Heq: (e', f (e', a)) = (e, b)
existsa0 : A,
({{(e', a)}} ∪ tosubset Γ) (e, a0) /\ f (e, a0) = b
E, A, B: Type f: E * A -> B e': E a: A Γ: list (E * A) e: E b: B a': A Hin: tosubset Γ (e, a') Heq: f (e, a') = b
existsa0 : A,
({{(e', a)}} ∪ tosubset Γ) (e, a0) /\ f (e, a0) = b
E, A, B: Type f: E * A -> B e': E a: A Γ: list (E * A) e: E b: B Heq: (e', f (e', a)) = (e, b)
existsa0 : A,
({{(e', a)}} ∪ tosubset Γ) (e, a0) /\ f (e, a0) = b
E, A, B: Type f: E * A -> B a: A Γ: list (E * A) e: E Heq: (e, f (e, a)) = (e, f (e, a))
existsa0 : A,
({{(e, a)}} ∪ tosubset Γ) (e, a0) /\
f (e, a0) = f (e, a)
E, A, B: Type f: E * A -> B a: A Γ: list (E * A) e: E Heq: (e, f (e, a)) = (e, f (e, a))
({{(e, a)}} ∪ tosubset Γ) (e, a) /\
f (e, a) = f (e, a)
E, A, B: Type f: E * A -> B a: A Γ: list (E * A) e: E Heq: (e, f (e, a)) = (e, f (e, a))
((e, a) = (e, a) \/ tosubset Γ (e, a)) /\
f (e, a) = f (e, a)
intuition.
E, A, B: Type f: E * A -> B e': E a: A Γ: list (E * A) e: E b: B a': A Hin: tosubset Γ (e, a') Heq: f (e, a') = b
existsa0 : A,
({{(e', a)}} ∪ tosubset Γ) (e, a0) /\ f (e, a0) = b
E, A, B: Type f: E * A -> B e': E a: A Γ: list (E * A) e: E b: B a': A Hin: tosubset Γ (e, a') Heq: f (e, a') = b
({{(e', a)}} ∪ tosubset Γ) (e, a') /\ f (e, a') = b
E, A, B: Type f: E * A -> B e': E a: A Γ: list (E * A) e: E b: B a': A Hin: tosubset Γ (e, a') Heq: f (e, a') = b
((e', a) = (e, a') \/ tosubset Γ (e, a')) /\
f (e, a') = b