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>> *)
(**********************************************************************)
Section env_instance.

  Context {E: Type}.

  #[export] Instance ToCtxset_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) = (fun A : 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

forall A : Type, toctxset [] = ∅
E: Type

forall A : 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) (l1 l2 : env E A), toctxset (l1 ++ l2) = toctxset l1 ∪ toctxset l2
E: Type

forall (A : Type) (l1 l2 : env E A), toctxset (l1 ++ l2) = toctxset l1 ∪ toctxset l2
E, A: Type
l1, l2: env E A

toctxset (l1 ++ l2) = toctxset l1 ∪ toctxset l2
E, A: Type
l1, l2: env E A

tosubset (l1 ++ l2) = tosubset l1 ∪ tosubset l2
E, A: Type
l1, l2: env E A

tosubset l1 ∪ tosubset l2 = tosubset l1 ∪ tosubset l2
reflexivity. Qed. (** ** Naturality *) (********************************************************************)
E: Type

Natural (@toctxset E (env E) ToCtxset_env)
E: Type

Natural (@toctxset E (env E) ToCtxset_env)
E: Type

Functor (env E)
E: Type
Functor (ctxset E)
E: Type
forall (A B : Type) (f : A -> B), map f ∘ toctxset = toctxset ∘ map f
E: Type

Functor (env E)
try typeclasses eauto.
E: Type

Functor (ctxset E)
typeclasses eauto.
E: Type

forall (A B : Type) (f : A -> B), map f ∘ toctxset = toctxset ∘ map f
E: Type

forall (A B : Type) (f : A -> B), map f ∘ (fun s : env E A => tosubset s) = (fun s : env E B => tosubset s) ∘ map f
E, A, B: Type
f: A -> B

map f ∘ (fun s : env E A => tosubset s) = (fun s : env E B => tosubset s) ∘ map f
E, A, B: Type
f: A -> B

map (map f) ∘ (fun s : env E A => tosubset s) = (fun s : env E B => tosubset s) ∘ map f
E, A, B: Type
f: A -> B

tosubset ∘ map (map f) = (fun s : env E B => tosubset s) ∘ map f
E, A, B: Type
f: A -> B

tosubset ∘ map (map f) = (fun s : 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 (A B : 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) => exists a : A, s (e, a) /\ f (e, a) = b) ∘ (fun s : env E A => tosubset s)) Γ (e, b) = ((fun s : env E B => tosubset s) ∘ mapd f) Γ (e, b)
E, A, B: Type
f: E * A -> B
Γ: env E A
e: E
b: B

(exists a : 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

(exists a : 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Γ: (exists a : A, tosubset Γ (e, a) /\ f (e, a) = b) = tosubset (mapd f Γ) (e, b)
(exists a0 : 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

(exists a : 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

(exists a : A, False /\ f (e, a) = b) = False
E, A, B: Type
f: E * A -> B
e: E
b: B

(exists a : A, False /\ f (e, a) = b) -> False
E, A, B: Type
f: E * A -> B
e: E
b: B
False -> exists a : A, False /\ f (e, a) = b
E, A, B: Type
f: E * A -> B
e: E
b: B

(exists a : 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 -> exists a : 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Γ: (exists a : A, tosubset Γ (e, a) /\ f (e, a) = b) = tosubset (mapd f Γ) (e, b)

(exists a0 : 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Γ: (exists a : A, tosubset Γ (e, a) /\ f (e, a) = b) = tosubset (mapd f Γ) (e, b)

(exists a0 : 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Γ: (exists a : A, tosubset Γ (e, a) /\ f (e, a) = b) = tosubset (mapd f Γ) (e, b)

(exists a0 : 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

(exists a0 : A, tosubset ((e', a) :: Γ) (e, a0) /\ f (e, a0) = b) = ((e', f (e', a)) = (e, b) \/ (exists a : 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

(exists a0 : A, ({{(e', a)}} ∪ tosubset Γ) (e, a0) /\ f (e, a0) = b) = ((e', f (e', a)) = (e, b) \/ (exists a : 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

(exists a0 : A, ({{(e', a)}} ∪ tosubset Γ) (e, a0) /\ f (e, a0) = b) -> (e', f (e', a)) = (e, b) \/ (exists a : 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) \/ (exists a : A, tosubset Γ (e, a) /\ f (e, a) = b) -> exists a0 : 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

(exists a0 : A, ({{(e', a)}} ∪ tosubset Γ) (e, a0) /\ f (e, a0) = b) -> (e', f (e', a)) = (e, b) \/ (exists a : 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) \/ (exists a : 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) \/ (exists a : 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) \/ (exists a : 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)
now inversion 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) \/ (exists a : 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

exists a : A, tosubset Γ (e, a) /\ f (e, a) = b
now (exists a').
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) \/ (exists a : A, tosubset Γ (e, a) /\ f (e, a) = b) -> exists a0 : 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)

exists a0 : 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
exists a0 : 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)

exists a0 : 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))

exists a0 : 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

exists a0 : 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
intuition. Qed. End env_instance.