Built with Alectryon, running Coq+SerAPI v8.18.0+0.18.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.
(** The second isomorphism theorem [isomorphic_second_isomorphism]. *)

[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
Import algebra_notations quotient_algebra_notations subalgebra_notations isomorphic_notations. Local Notation i := (hom_inc_subalgebra _ _). (** This section defines [cong_trace] and proves that it is a congruence, the restriction of a congruence to a subalgebra. *) Section cong_trace. Context {σ : Signature} {A : Algebra σ} (P : s, A s → Type) `{!IsSubalgebraPredicate A P} (Φ : s, Relation (A s)) `{!IsCongruence A Φ}. Definition cong_trace (s : Sort σ) (x : (A&&P) s) (y : (A&&P) s) := Φ s (i s x) (i s y).
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
s: Sort σ

EquivRel (cong_trace s)
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
s: Sort σ

EquivRel (cong_trace s)
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
s: Sort σ

EquivRel (λ x y : (A && P) s, Φ s (i s x) (i s y))
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
s: Sort σ

Reflexive (λ x y : (A && P) s, Φ s (i s x) (i s y))
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
s: Sort σ
Symmetric (λ x y : (A && P) s, Φ s (i s x) (i s y))
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
s: Sort σ
Transitive (λ x y : (A && P) s, Φ s (i s x) (i s y))
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
s: Sort σ

Reflexive (λ x y : (A && P) s, Φ s (i s x) (i s y))
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
s: Sort σ
y: A s
Y: P s y

Φ s (i s (y; Y)) (i s (y; Y))
reflexivity.
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
s: Sort σ

Symmetric (λ x y : (A && P) s, Φ s (i s x) (i s y))
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
s: Sort σ
y1: A s
Y1: P s y1
y2: A s
Y2: P s y2
S: Φ s (i s (y1; Y1)) (i s (y2; Y2))

Φ s (i s (y2; Y2)) (i s (y1; Y1))
by symmetry.
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
s: Sort σ

Transitive (λ x y : (A && P) s, Φ s (i s x) (i s y))
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
s: Sort σ
y1: A s
Y1: P s y1
y2: A s
Y2: P s y2
y3: A s
Y3: P s y3
S: Φ s (i s (y1; Y1)) (i s (y2; Y2))
T: Φ s (i s (y2; Y2)) (i s (y3; Y3))

Φ s (i s (y1; Y1)) (i s (y3; Y3))
by transitivity y2. Qed.
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
w: SymbolType σ
a, b: FamilyProd (A && P) (dom_symboltype w)
R: for_all_2_family_prod (A && P) (A && P) cong_trace a b

for_all_2_family_prod A A Φ (map_family_prod i a) (map_family_prod i b)
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
w: SymbolType σ
a, b: FamilyProd (A && P) (dom_symboltype w)
R: for_all_2_family_prod (A && P) (A && P) cong_trace a b

for_all_2_family_prod A A Φ (map_family_prod i a) (map_family_prod i b)
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
t: Sort σ
w: ne_list.notations.ne_list (Sort σ)
a, b: FamilyProd (A && P) (dom_symboltype (ne_list.cons t w))
R: for_all_2_family_prod (A && P) (A && P) cong_trace a b
IHw: forall a b : FamilyProd (A && P) (dom_symboltype w), for_all_2_family_prod (A && P) (A && P) cong_trace a b -> for_all_2_family_prod A A Φ (map_family_prod i a) (map_family_prod i b)

for_all_2_family_prod A A Φ (map_family_prod i a) (map_family_prod i b)
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
t: Sort σ
w: ne_list.notations.ne_list (Sort σ)
x: (A && P) t
a: Core.fold_right (λ (i : Sort σ) (A0 : Type), (A && P) i * A0) Unit (dom_symboltype w)
y: (A && P) t
b: Core.fold_right (λ (i : Sort σ) (A0 : Type), (A && P) i * A0) Unit (dom_symboltype w)
C: cong_trace t x y
R: for_all_2_family_prod (A && P) (A && P) cong_trace a b
IHw: forall a b : FamilyProd (A && P) (dom_symboltype w), for_all_2_family_prod (A && P) (A && P) cong_trace a b -> for_all_2_family_prod A A Φ (map_family_prod i a) (map_family_prod i b)

for_all_2_family_prod A A Φ (map_family_prod i (x, a)) (map_family_prod i (y, b))
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
t: Sort σ
w: ne_list.notations.ne_list (Sort σ)
x: (A && P) t
a: Core.fold_right (λ (i : Sort σ) (A0 : Type), (A && P) i * A0) Unit (dom_symboltype w)
y: (A && P) t
b: Core.fold_right (λ (i : Sort σ) (A0 : Type), (A && P) i * A0) Unit (dom_symboltype w)
C: cong_trace t x y
R: for_all_2_family_prod (A && P) (A && P) cong_trace a b
IHw: forall a b : FamilyProd (A && P) (dom_symboltype w), for_all_2_family_prod (A && P) (A && P) cong_trace a b -> for_all_2_family_prod A A Φ (map_family_prod i a) (map_family_prod i b)

for_all_2_family_prod A A Φ (snd (map_family_prod i (x, a))) (snd (map_family_prod i (y, b)))
apply IHw... Qed.
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ

OpsCompatible (A && P) cong_trace
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ

OpsCompatible (A && P) cong_trace
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
u: Symbol σ
a, b: FamilyProd (A && P) (dom_symboltype (σ u))
R: for_all_2_family_prod (A && P) (A && P) cong_trace a b

cong_trace (cod_symboltype (σ u)) (ap_operation u.#(A && P) a) (ap_operation u.#(A && P) b)
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
u: Symbol σ
a, b: FamilyProd (A && P) (dom_symboltype (σ u))
R: for_all_2_family_prod (A && P) (A && P) cong_trace a b

Φ (cod_symboltype (σ u)) (ap_operation u.#A (map_family_prod i a)) (i (cod_symboltype (σ u)) (ap_operation u.#(A && P) b))
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
u: Symbol σ
a, b: FamilyProd (A && P) (dom_symboltype (σ u))
R: for_all_2_family_prod (A && P) (A && P) cong_trace a b

Φ (cod_symboltype (σ u)) (ap_operation u.#A (map_family_prod i a)) (ap_operation u.#A (map_family_prod i b))
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
u: Symbol σ
a, b: FamilyProd (A && P) (dom_symboltype (σ u))
R: for_all_2_family_prod (A && P) (A && P) cong_trace a b

for_all_2_family_prod A A Φ (map_family_prod i a) (map_family_prod i b)
exact (for_all_2_family_prod_trace_congruence a b R). Qed.
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ

IsCongruence (A && P) cong_trace
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ

IsCongruence (A && P) cong_trace
apply (@BuildIsCongruence _ (A&&P) cong_trace); [intros; apply (is_mere_relation_cong A Φ) | exact _ ..]. Qed. End cong_trace. (** The following section defines the [is_subalgebra_class] subalgebra predicate, which induces a subalgebra of [A/Φ]. *) Section is_subalgebra_class. Context `{Univalence} {σ : Signature} {A : Algebra σ} (P : s, A s → Type) `{!IsSubalgebraPredicate A P} (Φ : s, Relation (A s)) `{!IsCongruence A Φ}. Definition is_subalgebra_class (s : Sort σ) (x : (A/Φ) s) : HProp := hexists (λ (y : (A&&P) s), in_class (Φ s) x (i s y)).
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
w: SymbolType σ
γ: Operation (A / Φ) w
α: Operation A w
Q: ComputeOpQuotient A Φ α γ
C: ClosedUnderOp A P α

ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x : (A / Φ) s), is_subalgebra_class s x) γ
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
w: SymbolType σ
γ: Operation (A / Φ) w
α: Operation A w
Q: ComputeOpQuotient A Φ α γ
C: ClosedUnderOp A P α

ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x : (A / Φ) s), is_subalgebra_class s x) γ
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
t: Sort σ
γ: Operation (A / Φ) (ne_list.one t)
α: Operation A (ne_list.one t)
Q: ComputeOpQuotient A Φ α γ
C: ClosedUnderOp A P α

ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x : (A / Φ) s), is_subalgebra_class s x) γ
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
t: Sort σ
w: ne_list.notations.ne_list (Sort σ)
γ: Operation (A / Φ) (ne_list.cons t w)
α: Operation A (ne_list.cons t w)
Q: ComputeOpQuotient A Φ α γ
C: ClosedUnderOp A P α
IHw: forall (γ : Operation (A / Φ) w) (α : Operation A w), ComputeOpQuotient A Φ α γ -> ClosedUnderOp A P α -> ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x : (A / Φ) s), is_subalgebra_class s x) γ
ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x : (A / Φ) s), is_subalgebra_class s x) γ
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
t: Sort σ
γ: Operation (A / Φ) (ne_list.one t)
α: Operation A (ne_list.one t)
Q: ComputeOpQuotient A Φ α γ
C: ClosedUnderOp A P α

ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x : (A / Φ) s), is_subalgebra_class s x) γ
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
t: Sort σ
γ: Operation (A / Φ) (ne_list.one t)
α: Operation A (ne_list.one t)
Q: ap_operation γ (map_family_prod (λ s : Sort σ, class_of (Φ s)) tt) = class_of (Φ (cod_symboltype (ne_list.one t))) (ap_operation α tt)
C: ClosedUnderOp A P α

ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x : (A / Φ) s), is_subalgebra_class s x) γ
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
t: Sort σ
γ: Operation (A / Φ) (ne_list.one t)
α: Operation A (ne_list.one t)
Q: ap_operation γ (map_family_prod (λ s : Sort σ, class_of (Φ s)) tt) = class_of (Φ (cod_symboltype (ne_list.one t))) (ap_operation α tt)
C: ClosedUnderOp A P α

{y : (A && P) t & in_class (Φ t) γ (i t y)}
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
t: Sort σ
γ: Operation (A / Φ) (ne_list.one t)
α: Operation A (ne_list.one t)
Q: ap_operation γ (map_family_prod (λ s : Sort σ, class_of (Φ s)) tt) = class_of (Φ (cod_symboltype (ne_list.one t))) (ap_operation α tt)
C: ClosedUnderOp A P α

in_class (Φ t) γ (i t (α; C))
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
t: Sort σ
γ: Operation (A / Φ) (ne_list.one t)
α: Operation A (ne_list.one t)
Q: γ = class_of (Φ t) α
C: ClosedUnderOp A P α

in_class (Φ t) γ (i t (α; C))
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
t: Sort σ
α: Operation A (ne_list.one t)
Q: class_of (Φ t) α = class_of (Φ t) α
C: ClosedUnderOp A P α

in_class (Φ t) (class_of (Φ t) α) (i t (α; C))
exact (EquivRel_Reflexive α).
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
t: Sort σ
w: ne_list.notations.ne_list (Sort σ)
γ: Operation (A / Φ) (ne_list.cons t w)
α: Operation A (ne_list.cons t w)
Q: ComputeOpQuotient A Φ α γ
C: ClosedUnderOp A P α
IHw: forall (γ : Operation (A / Φ) w) (α : Operation A w), ComputeOpQuotient A Φ α γ -> ClosedUnderOp A P α -> ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x : (A / Φ) s), is_subalgebra_class s x) γ

ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x : (A / Φ) s), is_subalgebra_class s x) γ
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
t: Sort σ
w: ne_list.notations.ne_list (Sort σ)
γ: Operation (A / Φ) (ne_list.cons t w)
α: Operation A (ne_list.cons t w)
Q: ComputeOpQuotient A Φ α γ
C: ClosedUnderOp A P α
IHw: forall (γ : Operation (A / Φ) w) (α : Operation A w), ComputeOpQuotient A Φ α γ -> ClosedUnderOp A P α -> ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x : (A / Φ) s), is_subalgebra_class s x) γ

forall x : A t, is_subalgebra_class t (class_of (Φ t) x) -> (fix ClosedUnderOp (w : SymbolType σ) : Operation (A / Φ) w -> Type := match w as w0 return (Operation (A / Φ) w0 -> Type) with | ne_list.one s => λ x0 : (A / Φ) s, is_subalgebra_class s x0 | ne_list.cons s w' => λ α : (A / Φ) s -> Operation (A / Φ) w', forall x0 : (A / Φ) s, is_subalgebra_class s x0 -> ClosedUnderOp w' (α x0) end) w (γ (class_of (Φ t) x))
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
t: Sort σ
w: ne_list.notations.ne_list (Sort σ)
γ: Operation (A / Φ) (ne_list.cons t w)
α: Operation A (ne_list.cons t w)
Q: ComputeOpQuotient A Φ α γ
C: ClosedUnderOp A P α
IHw: forall (γ : Operation (A / Φ) w) (α : Operation A w), ComputeOpQuotient A Φ α γ -> ClosedUnderOp A P α -> ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x : (A / Φ) s), is_subalgebra_class s x) γ
x: A t

is_subalgebra_class t (class_of (Φ t) x) -> (fix ClosedUnderOp (w : SymbolType σ) : Operation (A / Φ) w -> Type := match w as w0 return (Operation (A / Φ) w0 -> Type) with | ne_list.one s => λ x : (A / Φ) s, is_subalgebra_class s x | ne_list.cons s w' => λ α : (A / Φ) s -> Operation (A / Φ) w', forall x : (A / Φ) s, is_subalgebra_class s x -> ClosedUnderOp w' (α x) end) w (γ (class_of (Φ t) x))
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
t: Sort σ
w: ne_list.notations.ne_list (Sort σ)
γ: Operation (A / Φ) (ne_list.cons t w)
α: Operation A (ne_list.cons t w)
Q: ComputeOpQuotient A Φ α γ
C: ClosedUnderOp A P α
IHw: forall (γ : Operation (A / Φ) w) (α : Operation A w), ComputeOpQuotient A Φ α γ -> ClosedUnderOp A P α -> ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x : (A / Φ) s), is_subalgebra_class s x) γ
x: A t

{y : (A && P) t & in_class (Φ t) (class_of (Φ t) x) (i t y)} -> (fix ClosedUnderOp (w : SymbolType σ) : Operation (A / Φ) w -> Type := match w as w0 return (Operation (A / Φ) w0 -> Type) with | ne_list.one s => λ x : (A / Φ) s, is_subalgebra_class s x | ne_list.cons s w' => λ α : (A / Φ) s -> Operation (A / Φ) w', forall x : (A / Φ) s, is_subalgebra_class s x -> ClosedUnderOp w' (α x) end) w (γ (class_of (Φ t) x))
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
t: Sort σ
w: ne_list.notations.ne_list (Sort σ)
γ: Operation (A / Φ) (ne_list.cons t w)
α: Operation A (ne_list.cons t w)
Q: ComputeOpQuotient A Φ α γ
C: ClosedUnderOp A P α
IHw: forall (γ : Operation (A / Φ) w) (α : Operation A w), ComputeOpQuotient A Φ α γ -> ClosedUnderOp A P α -> ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x : (A / Φ) s), is_subalgebra_class s x) γ
x: A t
y: (A && P) t
R: in_class (Φ t) (class_of (Φ t) x) (i t y)

(fix ClosedUnderOp (w : SymbolType σ) : Operation (A / Φ) w -> Type := match w as w0 return (Operation (A / Φ) w0 -> Type) with | ne_list.one s => λ x : (A / Φ) s, is_subalgebra_class s x | ne_list.cons s w' => λ α : (A / Φ) s -> Operation (A / Φ) w', forall x : (A / Φ) s, is_subalgebra_class s x -> ClosedUnderOp w' (α x) end) w (γ (class_of (Φ t) x))
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
t: Sort σ
w: ne_list.notations.ne_list (Sort σ)
γ: Operation (A / Φ) (ne_list.cons t w)
α: Operation A (ne_list.cons t w)
Q: ComputeOpQuotient A Φ α γ
C: ClosedUnderOp A P α
IHw: forall (γ : Operation (A / Φ) w) (α : Operation A w), ComputeOpQuotient A Φ α γ -> ClosedUnderOp A P α -> ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x : (A / Φ) s), is_subalgebra_class s x) γ
x: A t
y: (A && P) t
R: in_class (Φ t) (class_of (Φ t) x) (i t y)

ComputeOpQuotient A Φ (α (i t y)) (γ (class_of (Φ t) x))
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
t: Sort σ
w: ne_list.notations.ne_list (Sort σ)
γ: Operation (A / Φ) (ne_list.cons t w)
α: Operation A (ne_list.cons t w)
Q: ComputeOpQuotient A Φ α γ
C: ClosedUnderOp A P α
IHw: forall (γ : Operation (A / Φ) w) (α : Operation A w), ComputeOpQuotient A Φ α γ -> ClosedUnderOp A P α -> ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x : (A / Φ) s), is_subalgebra_class s x) γ
x: A t
y: (A && P) t
R: in_class (Φ t) (class_of (Φ t) x) (i t y)
ClosedUnderOp A P (α (i t y))
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
t: Sort σ
w: ne_list.notations.ne_list (Sort σ)
γ: Operation (A / Φ) (ne_list.cons t w)
α: Operation A (ne_list.cons t w)
Q: ComputeOpQuotient A Φ α γ
C: ClosedUnderOp A P α
IHw: forall (γ : Operation (A / Φ) w) (α : Operation A w), ComputeOpQuotient A Φ α γ -> ClosedUnderOp A P α -> ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x : (A / Φ) s), is_subalgebra_class s x) γ
x: A t
y: (A && P) t
R: in_class (Φ t) (class_of (Φ t) x) (i t y)

ComputeOpQuotient A Φ (α (i t y)) (γ (class_of (Φ t) x))
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
t: Sort σ
w: ne_list.notations.ne_list (Sort σ)
γ: Operation (A / Φ) (ne_list.cons t w)
α: Operation A (ne_list.cons t w)
Q: ComputeOpQuotient A Φ α γ
C: ClosedUnderOp A P α
IHw: forall (γ : Operation (A / Φ) w) (α : Operation A w), ComputeOpQuotient A Φ α γ -> ClosedUnderOp A P α -> ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x : (A / Φ) s), is_subalgebra_class s x) γ
x: A t
y: (A && P) t
R: in_class (Φ t) (class_of (Φ t) x) (i t y)
a: FamilyProd A (dom_symboltype w)

ap_operation (γ (class_of (Φ t) x)) (map_family_prod (λ s : Sort σ, class_of (Φ s)) a) = class_of (Φ (cod_symboltype w)) (ap_operation (α (i t y)) a)
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
t: Sort σ
w: ne_list.notations.ne_list (Sort σ)
γ: Operation (A / Φ) (ne_list.cons t w)
α: Operation A (ne_list.cons t w)
Q: ComputeOpQuotient A Φ α γ
C: ClosedUnderOp A P α
IHw: forall (γ : Operation (A / Φ) w) (α : Operation A w), ComputeOpQuotient A Φ α γ -> ClosedUnderOp A P α -> ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x : (A / Φ) s), is_subalgebra_class s x) γ
x: A t
y: (A && P) t
R: in_class (Φ t) (class_of (Φ t) (i t y)) (i t y)
a: FamilyProd A (dom_symboltype w)

ap_operation (γ (class_of (Φ t) (i t y))) (map_family_prod (λ s : Sort σ, class_of (Φ s)) a) = class_of (Φ (cod_symboltype w)) (ap_operation (α (i t y)) a)
apply (Q (i t y,a)).
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
t: Sort σ
w: ne_list.notations.ne_list (Sort σ)
γ: Operation (A / Φ) (ne_list.cons t w)
α: Operation A (ne_list.cons t w)
Q: ComputeOpQuotient A Φ α γ
C: ClosedUnderOp A P α
IHw: forall (γ : Operation (A / Φ) w) (α : Operation A w), ComputeOpQuotient A Φ α γ -> ClosedUnderOp A P α -> ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x : (A / Φ) s), is_subalgebra_class s x) γ
x: A t
y: (A && P) t
R: in_class (Φ t) (class_of (Φ t) x) (i t y)

ClosedUnderOp A P (α (i t y))
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
t: Sort σ
w: ne_list.notations.ne_list (Sort σ)
γ: Operation (A / Φ) (ne_list.cons t w)
α: Operation A (ne_list.cons t w)
Q: ComputeOpQuotient A Φ α γ
C: ClosedUnderOp A P α
IHw: forall (γ : Operation (A / Φ) w) (α : Operation A w), ComputeOpQuotient A Φ α γ -> ClosedUnderOp A P α -> ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x : (A / Φ) s), is_subalgebra_class s x) γ
x: A t
y: (A && P) t
R: in_class (Φ t) (class_of (Φ t) x) (i t y)

P t (i t y)
exact y.2. Qed.
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ

IsClosedUnderOps (A / Φ) (λ (s : Sort σ) (x : (A / Φ) s), is_subalgebra_class s x)
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ

IsClosedUnderOps (A / Φ) (λ (s : Sort σ) (x : (A / Φ) s), is_subalgebra_class s x)
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
u: Symbol σ

ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x : (A / Φ) s), is_subalgebra_class s x) u.#(A / Φ)
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
u: Symbol σ

ComputeOpQuotient A Φ u.#(A / Φ)
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
u: Symbol σ
ClosedUnderOp A P
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
u: Symbol σ

ComputeOpQuotient A Φ u.#(A / Φ)
apply compute_op_quotient.
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
u: Symbol σ

ClosedUnderOp A P u.#A
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
u: Symbol σ

IsSubalgebraPredicate A P
exact _. Qed.
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ

IsSubalgebraPredicate (A / Φ) (λ (s : Sort σ) (x : (A / Φ) s), is_subalgebra_class s x)
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ

IsSubalgebraPredicate (A / Φ) (λ (s : Sort σ) (x : (A / Φ) s), is_subalgebra_class s x)
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ

IsClosedUnderOps (A / Φ) (λ (s : Sort σ) (x : (A / Φ) s), is_subalgebra_class s x)
apply is_closed_under_ops_is_subalgebra_class. Qed. End is_subalgebra_class. (** The next section proves the second isomorphism theorem, << (A&&P) / (cong_trace P Φ) ≅ (A/Φ) && (is_subalgebra_class P Φ). >> *) (* There is an alternative proof using the first isomorphism theorem, but the direct proof below seems simpler in HoTT. *) Section second_isomorphism. Context `{Univalence} {σ : Signature} (A : Algebra σ) (P : s, A s → Type) `{!IsSubalgebraPredicate A P} (Φ : s, Relation (A s)) `{!IsCongruence A Φ}. Local Notation Ψ := (cong_trace P Φ). Local Notation Q := (is_subalgebra_class P Φ). Definition def_second_isomorphism (s : Sort σ) : ((A&&P) / Ψ) s → ((A/Φ) && Q) s := Quotient_rec (Ψ s) _ (λ (x : (A&&P) s), (class_of (Φ s) (i s x); tr (x; EquivRel_Reflexive x))) (λ (x y : (A&&P) s) (T : Ψ s x y), path_sigma_hprop (class_of (Φ s) (i s x); _) (class_of (Φ s) (i s y); _) (@qglue _ (Φ s) _ _ T)).
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
w: SymbolType σ
α: Operation A w
γ: Operation (A / Φ) w
ζ: Operation (A && P / Ψ) w
CA: ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x : (A / Φ) s), Q s x) γ
CB: ClosedUnderOp A P α
QA: ComputeOpQuotient A Φ α γ
QB: ComputeOpQuotient (A && P) Ψ (op_subalgebra A P α CB) ζ

OpPreserving def_second_isomorphism ζ (op_subalgebra (A / Φ) (λ (s : Sort σ) (x : (A / Φ) s), Q s x) γ CA)
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
w: SymbolType σ
α: Operation A w
γ: Operation (A / Φ) w
ζ: Operation (A && P / Ψ) w
CA: ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x : (A / Φ) s), Q s x) γ
CB: ClosedUnderOp A P α
QA: ComputeOpQuotient A Φ α γ
QB: ComputeOpQuotient (A && P) Ψ (op_subalgebra A P α CB) ζ

OpPreserving def_second_isomorphism ζ (op_subalgebra (A / Φ) (λ (s : Sort σ) (x : (A / Φ) s), Q s x) γ CA)
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
w: SymbolType σ
α: Operation A w
γ: Operation (A / Φ) w
ζ: Operation (A && P / Ψ) w
CA: ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x : (A / Φ) s), Q s x) γ
CB: ClosedUnderOp A P α
QA: forall a : FamilyProd A (dom_symboltype w), ap_operation γ (map_family_prod (λ s : Sort σ, class_of (Φ s)) a) = class_of (Φ (cod_symboltype w)) (ap_operation α a)
QB: forall a : FamilyProd (A && P) (dom_symboltype w), ap_operation ζ (map_family_prod (λ s : Sort σ, class_of (Ψ s)) a) = class_of (Ψ (cod_symboltype w)) (ap_operation (op_subalgebra A P α CB) a)

OpPreserving def_second_isomorphism ζ (op_subalgebra (A / Φ) (λ (s : Sort σ) (x : (A / Φ) s), Q s x) γ CA)
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
t: Sort σ
α: A t
γ: carriers_quotient_algebra A Φ t
ζ: carriers_quotient_algebra (A && P) Ψ t
CA: Trunc (-1) {y : carriers_subalgebra A P t & in_class (Φ t) γ (def_inc_subalgebra A P t y)}
CB: P t α
QA: Unit -> γ = class_of (Φ t) α
QB: Unit -> ζ = class_of (Ψ t) (α; CB)

def_second_isomorphism t ζ = (γ; CA)
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
t: Sort σ
w: ne_list.notations.ne_list (Sort σ)
α: A t -> Operation A w
γ: carriers_quotient_algebra A Φ t -> Operation (carriers_quotient_algebra A Φ) w
ζ: carriers_quotient_algebra (A && P) Ψ t -> Operation (carriers_quotient_algebra (A && P) Ψ) w
CA: forall x : carriers_quotient_algebra A Φ t, Trunc (-1) {y : carriers_subalgebra A P t & in_class (Φ t) x (def_inc_subalgebra A P t y)} -> ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x0 : carriers_quotient_algebra A Φ s), Trunc (-1) {y : carriers_subalgebra A P s & in_class (Φ s) x0 (def_inc_subalgebra A P s y)}) (γ x)
CB: forall x : A t, P t x -> ClosedUnderOp A P (α x)
QA: forall a : A t * FamilyProd A (dom_symboltype w), ap_operation (γ (class_of (Φ t) (fst a))) (map_family_prod (λ s : Sort σ, class_of (Φ s)) (snd a)) = class_of (Φ (cod_symboltype w)) (ap_operation (α (fst a)) (snd a))
QB: forall a : carriers_subalgebra A P t * FamilyProd (carriers_subalgebra A P) (dom_symboltype w), ap_operation (ζ (class_of (Ψ t) (fst a))) (map_family_prod (λ s : Sort σ, class_of (Ψ s)) (snd a)) = class_of (Ψ (cod_symboltype w)) (ap_operation (op_subalgebra A P (α (fst a).1) (CB (fst a).1 (fst a).2)) (snd a))
IHw: forall (α : Operation A w) (γ : Operation (carriers_quotient_algebra A Φ) w) (ζ : Operation (carriers_quotient_algebra (A && P) Ψ) w) (CA : ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x : carriers_quotient_algebra A Φ s), Trunc (-1) {y : carriers_subalgebra A P s & in_class (Φ s) x (def_inc_subalgebra A P s y)}) γ) (CB : ClosedUnderOp A P α), (forall a : FamilyProd A (dom_symboltype w), ap_operation γ (map_family_prod (λ s : Sort σ, class_of (Φ s)) a) = class_of (Φ (cod_symboltype w)) (ap_operation α a)) -> (forall a : FamilyProd (carriers_subalgebra A P) (dom_symboltype w), ap_operation ζ (map_family_prod (λ s : Sort σ, class_of (Ψ s)) a) = class_of (Ψ (cod_symboltype w)) (ap_operation (op_subalgebra A P α CB) a)) -> OpPreserving def_second_isomorphism ζ (op_subalgebra (A / Φ) (λ (s : Sort σ) (x : carriers_quotient_algebra A Φ s), Trunc (-1) {y : carriers_subalgebra A P s & in_class (Φ s) x (def_inc_subalgebra A P s y)}) γ CA)
forall x : carriers_quotient_algebra (A && P) Ψ t, OpPreserving def_second_isomorphism (ζ x) (op_subalgebra (A / Φ) (λ (s : Sort σ) (x0 : carriers_quotient_algebra A Φ s), Trunc (-1) {y : carriers_subalgebra A P s & in_class (Φ s) x0 (def_inc_subalgebra A P s y)}) (γ (def_second_isomorphism t x).1) (CA (def_second_isomorphism t x).1 (def_second_isomorphism t x).2))
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
t: Sort σ
α: A t
γ: carriers_quotient_algebra A Φ t
ζ: carriers_quotient_algebra (A && P) Ψ t
CA: Trunc (-1) {y : carriers_subalgebra A P t & in_class (Φ t) γ (def_inc_subalgebra A P t y)}
CB: P t α
QA: Unit -> γ = class_of (Φ t) α
QB: Unit -> ζ = class_of (Ψ t) (α; CB)

def_second_isomorphism t ζ = (γ; CA)
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
t: Sort σ
α: A t
γ: carriers_quotient_algebra A Φ t
ζ: carriers_quotient_algebra (A && P) Ψ t
CA: Trunc (-1) {y : carriers_subalgebra A P t & in_class (Φ t) γ (def_inc_subalgebra A P t y)}
CB: P t α
QA: Unit -> γ = class_of (Φ t) α
QB: Unit -> ζ = class_of (Ψ t) (α; CB)

(def_second_isomorphism t ζ).1 = (γ; CA).1
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
t: Sort σ
α: A t
γ: carriers_quotient_algebra A Φ t
ζ: carriers_quotient_algebra (A && P) Ψ t
CA: Trunc (-1) {y : carriers_subalgebra A P t & in_class (Φ t) γ (def_inc_subalgebra A P t y)}
CB: P t α
QA: Unit -> γ = class_of (Φ t) α
QB: Unit -> ζ = class_of (Ψ t) (α; CB)

(def_second_isomorphism t ζ).1 = γ
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
t: Sort σ
α: A t
CA: Trunc (-1) {y : carriers_subalgebra A P t & in_class (Φ t) (class_of (Φ t) α) (def_inc_subalgebra A P t y)}
CB: P t α
QA: Unit -> class_of (Φ t) α = class_of (Φ t) α
QB: Unit -> class_of (Ψ t) (α; CB) = class_of (Ψ t) (α; CB)

(def_second_isomorphism t (class_of (Ψ t) (α; CB))).1 = class_of (Φ t) α
by apply qglue.
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
t: Sort σ
w: ne_list.notations.ne_list (Sort σ)
α: A t -> Operation A w
γ: carriers_quotient_algebra A Φ t -> Operation (carriers_quotient_algebra A Φ) w
ζ: carriers_quotient_algebra (A && P) Ψ t -> Operation (carriers_quotient_algebra (A && P) Ψ) w
CA: forall x : carriers_quotient_algebra A Φ t, Trunc (-1) {y : carriers_subalgebra A P t & in_class (Φ t) x (def_inc_subalgebra A P t y)} -> ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x0 : carriers_quotient_algebra A Φ s), Trunc (-1) {y : carriers_subalgebra A P s & in_class (Φ s) x0 (def_inc_subalgebra A P s y)}) (γ x)
CB: forall x : A t, P t x -> ClosedUnderOp A P (α x)
QA: forall a : A t * FamilyProd A (dom_symboltype w), ap_operation (γ (class_of (Φ t) (fst a))) (map_family_prod (λ s : Sort σ, class_of (Φ s)) (snd a)) = class_of (Φ (cod_symboltype w)) (ap_operation (α (fst a)) (snd a))
QB: forall a : carriers_subalgebra A P t * FamilyProd (carriers_subalgebra A P) (dom_symboltype w), ap_operation (ζ (class_of (Ψ t) (fst a))) (map_family_prod (λ s : Sort σ, class_of (Ψ s)) (snd a)) = class_of (Ψ (cod_symboltype w)) (ap_operation (op_subalgebra A P (α (fst a).1) (CB (fst a).1 (fst a).2)) (snd a))
IHw: forall (α : Operation A w) (γ : Operation (carriers_quotient_algebra A Φ) w) (ζ : Operation (carriers_quotient_algebra (A && P) Ψ) w) (CA : ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x : carriers_quotient_algebra A Φ s), Trunc (-1) {y : carriers_subalgebra A P s & in_class (Φ s) x (def_inc_subalgebra A P s y)}) γ) (CB : ClosedUnderOp A P α), (forall a : FamilyProd A (dom_symboltype w), ap_operation γ (map_family_prod (λ s : Sort σ, class_of (Φ s)) a) = class_of (Φ (cod_symboltype w)) (ap_operation α a)) -> (forall a : FamilyProd (carriers_subalgebra A P) (dom_symboltype w), ap_operation ζ (map_family_prod (λ s : Sort σ, class_of (Ψ s)) a) = class_of (Ψ (cod_symboltype w)) (ap_operation (op_subalgebra A P α CB) a)) -> OpPreserving def_second_isomorphism ζ (op_subalgebra (A / Φ) (λ (s : Sort σ) (x : carriers_quotient_algebra A Φ s), Trunc (-1) {y : carriers_subalgebra A P s & in_class (Φ s) x (def_inc_subalgebra A P s y)}) γ CA)

forall x : carriers_quotient_algebra (A && P) Ψ t, OpPreserving def_second_isomorphism (ζ x) (op_subalgebra (A / Φ) (λ (s : Sort σ) (x0 : carriers_quotient_algebra A Φ s), Trunc (-1) {y : carriers_subalgebra A P s & in_class (Φ s) x0 (def_inc_subalgebra A P s y)}) (γ (def_second_isomorphism t x).1) (CA (def_second_isomorphism t x).1 (def_second_isomorphism t x).2))
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
t: Sort σ
w: ne_list.notations.ne_list (Sort σ)
α: A t -> Operation A w
γ: carriers_quotient_algebra A Φ t -> Operation (carriers_quotient_algebra A Φ) w
ζ: carriers_quotient_algebra (A && P) Ψ t -> Operation (carriers_quotient_algebra (A && P) Ψ) w
CA: forall x : carriers_quotient_algebra A Φ t, Trunc (-1) {y : carriers_subalgebra A P t & in_class (Φ t) x (def_inc_subalgebra A P t y)} -> ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x0 : carriers_quotient_algebra A Φ s), Trunc (-1) {y : carriers_subalgebra A P s & in_class (Φ s) x0 (def_inc_subalgebra A P s y)}) (γ x)
CB: forall x : A t, P t x -> ClosedUnderOp A P (α x)
QA: forall a : A t * FamilyProd A (dom_symboltype w), ap_operation (γ (class_of (Φ t) (fst a))) (map_family_prod (λ s : Sort σ, class_of (Φ s)) (snd a)) = class_of (Φ (cod_symboltype w)) (ap_operation (α (fst a)) (snd a))
QB: forall a : carriers_subalgebra A P t * FamilyProd (carriers_subalgebra A P) (dom_symboltype w), ap_operation (ζ (class_of (Ψ t) (fst a))) (map_family_prod (λ s : Sort σ, class_of (Ψ s)) (snd a)) = class_of (Ψ (cod_symboltype w)) (ap_operation (op_subalgebra A P (α (fst a).1) (CB (fst a).1 (fst a).2)) (snd a))
IHw: forall (α : Operation A w) (γ : Operation (carriers_quotient_algebra A Φ) w) (ζ : Operation (carriers_quotient_algebra (A && P) Ψ) w) (CA : ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x : carriers_quotient_algebra A Φ s), Trunc (-1) {y : carriers_subalgebra A P s & in_class (Φ s) x (def_inc_subalgebra A P s y)}) γ) (CB : ClosedUnderOp A P α), (forall a : FamilyProd A (dom_symboltype w), ap_operation γ (map_family_prod (λ s : Sort σ, class_of (Φ s)) a) = class_of (Φ (cod_symboltype w)) (ap_operation α a)) -> (forall a : FamilyProd (carriers_subalgebra A P) (dom_symboltype w), ap_operation ζ (map_family_prod (λ s : Sort σ, class_of (Ψ s)) a) = class_of (Ψ (cod_symboltype w)) (ap_operation (op_subalgebra A P α CB) a)) -> OpPreserving def_second_isomorphism ζ (op_subalgebra (A / Φ) (λ (s : Sort σ) (x : carriers_quotient_algebra A Φ s), Trunc (-1) {y : carriers_subalgebra A P s & in_class (Φ s) x (def_inc_subalgebra A P s y)}) γ CA)

forall x : (A && P) t, OpPreserving def_second_isomorphism (ζ (class_of (Ψ t) x)) (op_subalgebra (A / Φ) (λ (s : Sort σ) (x0 : carriers_quotient_algebra A Φ s), Trunc (-1) {y : carriers_subalgebra A P s & in_class (Φ s) x0 (def_inc_subalgebra A P s y)}) (γ (def_second_isomorphism t (class_of (Ψ t) x)).1) (CA (def_second_isomorphism t (class_of (Ψ t) x)).1 (def_second_isomorphism t (class_of (Ψ t) x)).2))
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
t: Sort σ
w: ne_list.notations.ne_list (Sort σ)
α: A t -> Operation A w
γ: carriers_quotient_algebra A Φ t -> Operation (carriers_quotient_algebra A Φ) w
ζ: carriers_quotient_algebra (A && P) Ψ t -> Operation (carriers_quotient_algebra (A && P) Ψ) w
CA: forall x : carriers_quotient_algebra A Φ t, Trunc (-1) {y : carriers_subalgebra A P t & in_class (Φ t) x (def_inc_subalgebra A P t y)} -> ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x0 : carriers_quotient_algebra A Φ s), Trunc (-1) {y : carriers_subalgebra A P s & in_class (Φ s) x0 (def_inc_subalgebra A P s y)}) (γ x)
CB: forall x : A t, P t x -> ClosedUnderOp A P (α x)
QA: forall a : A t * FamilyProd A (dom_symboltype w), ap_operation (γ (class_of (Φ t) (fst a))) (map_family_prod (λ s : Sort σ, class_of (Φ s)) (snd a)) = class_of (Φ (cod_symboltype w)) (ap_operation (α (fst a)) (snd a))
QB: forall a : carriers_subalgebra A P t * FamilyProd (carriers_subalgebra A P) (dom_symboltype w), ap_operation (ζ (class_of (Ψ t) (fst a))) (map_family_prod (λ s : Sort σ, class_of (Ψ s)) (snd a)) = class_of (Ψ (cod_symboltype w)) (ap_operation (op_subalgebra A P (α (fst a).1) (CB (fst a).1 (fst a).2)) (snd a))
IHw: forall (α : Operation A w) (γ : Operation (carriers_quotient_algebra A Φ) w) (ζ : Operation (carriers_quotient_algebra (A && P) Ψ) w) (CA : ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x : carriers_quotient_algebra A Φ s), Trunc (-1) {y : carriers_subalgebra A P s & in_class (Φ s) x (def_inc_subalgebra A P s y)}) γ) (CB : ClosedUnderOp A P α), (forall a : FamilyProd A (dom_symboltype w), ap_operation γ (map_family_prod (λ s : Sort σ, class_of (Φ s)) a) = class_of (Φ (cod_symboltype w)) (ap_operation α a)) -> (forall a : FamilyProd (carriers_subalgebra A P) (dom_symboltype w), ap_operation ζ (map_family_prod (λ s : Sort σ, class_of (Ψ s)) a) = class_of (Ψ (cod_symboltype w)) (ap_operation (op_subalgebra A P α CB) a)) -> OpPreserving def_second_isomorphism ζ (op_subalgebra (A / Φ) (λ (s : Sort σ) (x : carriers_quotient_algebra A Φ s), Trunc (-1) {y : carriers_subalgebra A P s & in_class (Φ s) x (def_inc_subalgebra A P s y)}) γ CA)
x: (A && P) t

OpPreserving def_second_isomorphism (ζ (class_of (Ψ t) x)) (op_subalgebra (A / Φ) (λ (s : Sort σ) (x : carriers_quotient_algebra A Φ s), Trunc (-1) {y : carriers_subalgebra A P s & in_class (Φ s) x (def_inc_subalgebra A P s y)}) (γ (def_second_isomorphism t (class_of (Ψ t) x)).1) (CA (def_second_isomorphism t (class_of (Ψ t) x)).1 (def_second_isomorphism t (class_of (Ψ t) x)).2))
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
t: Sort σ
w: ne_list.notations.ne_list (Sort σ)
α: A t -> Operation A w
γ: carriers_quotient_algebra A Φ t -> Operation (carriers_quotient_algebra A Φ) w
ζ: carriers_quotient_algebra (A && P) Ψ t -> Operation (carriers_quotient_algebra (A && P) Ψ) w
CA: forall x : carriers_quotient_algebra A Φ t, Trunc (-1) {y : carriers_subalgebra A P t & in_class (Φ t) x (def_inc_subalgebra A P t y)} -> ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x0 : carriers_quotient_algebra A Φ s), Trunc (-1) {y : carriers_subalgebra A P s & in_class (Φ s) x0 (def_inc_subalgebra A P s y)}) (γ x)
CB: forall x : A t, P t x -> ClosedUnderOp A P (α x)
QA: forall a : A t * FamilyProd A (dom_symboltype w), ap_operation (γ (class_of (Φ t) (fst a))) (map_family_prod (λ s : Sort σ, class_of (Φ s)) (snd a)) = class_of (Φ (cod_symboltype w)) (ap_operation (α (fst a)) (snd a))
QB: forall a : carriers_subalgebra A P t * FamilyProd (carriers_subalgebra A P) (dom_symboltype w), ap_operation (ζ (class_of (Ψ t) (fst a))) (map_family_prod (λ s : Sort σ, class_of (Ψ s)) (snd a)) = class_of (Ψ (cod_symboltype w)) (ap_operation (op_subalgebra A P (α (fst a).1) (CB (fst a).1 (fst a).2)) (snd a))
IHw: forall (α : Operation A w) (γ : Operation (carriers_quotient_algebra A Φ) w) (ζ : Operation (carriers_quotient_algebra (A && P) Ψ) w) (CA : ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x : carriers_quotient_algebra A Φ s), Trunc (-1) {y : carriers_subalgebra A P s & in_class (Φ s) x (def_inc_subalgebra A P s y)}) γ) (CB : ClosedUnderOp A P α), (forall a : FamilyProd A (dom_symboltype w), ap_operation γ (map_family_prod (λ s : Sort σ, class_of (Φ s)) a) = class_of (Φ (cod_symboltype w)) (ap_operation α a)) -> (forall a : FamilyProd (carriers_subalgebra A P) (dom_symboltype w), ap_operation ζ (map_family_prod (λ s : Sort σ, class_of (Ψ s)) a) = class_of (Ψ (cod_symboltype w)) (ap_operation (op_subalgebra A P α CB) a)) -> OpPreserving def_second_isomorphism ζ (op_subalgebra (A / Φ) (λ (s : Sort σ) (x : carriers_quotient_algebra A Φ s), Trunc (-1) {y : carriers_subalgebra A P s & in_class (Φ s) x (def_inc_subalgebra A P s y)}) γ CA)
x: (A && P) t

forall a : FamilyProd A (dom_symboltype w), ap_operation (γ (class_of (Φ t) (i t x))) (map_family_prod (λ s : Sort σ, class_of (Φ s)) a) = class_of (Φ (cod_symboltype w)) (ap_operation (α (i t x)) a)
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
t: Sort σ
w: ne_list.notations.ne_list (Sort σ)
α: A t -> Operation A w
γ: carriers_quotient_algebra A Φ t -> Operation (carriers_quotient_algebra A Φ) w
ζ: carriers_quotient_algebra (A && P) Ψ t -> Operation (carriers_quotient_algebra (A && P) Ψ) w
CA: forall x : carriers_quotient_algebra A Φ t, Trunc (-1) {y : carriers_subalgebra A P t & in_class (Φ t) x (def_inc_subalgebra A P t y)} -> ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x0 : carriers_quotient_algebra A Φ s), Trunc (-1) {y : carriers_subalgebra A P s & in_class (Φ s) x0 (def_inc_subalgebra A P s y)}) (γ x)
CB: forall x : A t, P t x -> ClosedUnderOp A P (α x)
QA: forall a : A t * FamilyProd A (dom_symboltype w), ap_operation (γ (class_of (Φ t) (fst a))) (map_family_prod (λ s : Sort σ, class_of (Φ s)) (snd a)) = class_of (Φ (cod_symboltype w)) (ap_operation (α (fst a)) (snd a))
QB: forall a : carriers_subalgebra A P t * FamilyProd (carriers_subalgebra A P) (dom_symboltype w), ap_operation (ζ (class_of (Ψ t) (fst a))) (map_family_prod (λ s : Sort σ, class_of (Ψ s)) (snd a)) = class_of (Ψ (cod_symboltype w)) (ap_operation (op_subalgebra A P (α (fst a).1) (CB (fst a).1 (fst a).2)) (snd a))
IHw: forall (α : Operation A w) (γ : Operation (carriers_quotient_algebra A Φ) w) (ζ : Operation (carriers_quotient_algebra (A && P) Ψ) w) (CA : ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x : carriers_quotient_algebra A Φ s), Trunc (-1) {y : carriers_subalgebra A P s & in_class (Φ s) x (def_inc_subalgebra A P s y)}) γ) (CB : ClosedUnderOp A P α), (forall a : FamilyProd A (dom_symboltype w), ap_operation γ (map_family_prod (λ s : Sort σ, class_of (Φ s)) a) = class_of (Φ (cod_symboltype w)) (ap_operation α a)) -> (forall a : FamilyProd (carriers_subalgebra A P) (dom_symboltype w), ap_operation ζ (map_family_prod (λ s : Sort σ, class_of (Ψ s)) a) = class_of (Ψ (cod_symboltype w)) (ap_operation (op_subalgebra A P α CB) a)) -> OpPreserving def_second_isomorphism ζ (op_subalgebra (A / Φ) (λ (s : Sort σ) (x : carriers_quotient_algebra A Φ s), Trunc (-1) {y : carriers_subalgebra A P s & in_class (Φ s) x (def_inc_subalgebra A P s y)}) γ CA)
x: (A && P) t
forall a : FamilyProd (carriers_subalgebra A P) (dom_symboltype w), ap_operation (ζ (class_of (Ψ t) x)) (map_family_prod (λ s : Sort σ, class_of (Ψ s)) a) = class_of (Ψ (cod_symboltype w)) (ap_operation (op_subalgebra A P (α (i t x)) (CB (i t x) x.2)) a)
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
t: Sort σ
w: ne_list.notations.ne_list (Sort σ)
α: A t -> Operation A w
γ: carriers_quotient_algebra A Φ t -> Operation (carriers_quotient_algebra A Φ) w
ζ: carriers_quotient_algebra (A && P) Ψ t -> Operation (carriers_quotient_algebra (A && P) Ψ) w
CA: forall x : carriers_quotient_algebra A Φ t, Trunc (-1) {y : carriers_subalgebra A P t & in_class (Φ t) x (def_inc_subalgebra A P t y)} -> ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x0 : carriers_quotient_algebra A Φ s), Trunc (-1) {y : carriers_subalgebra A P s & in_class (Φ s) x0 (def_inc_subalgebra A P s y)}) (γ x)
CB: forall x : A t, P t x -> ClosedUnderOp A P (α x)
QA: forall a : A t * FamilyProd A (dom_symboltype w), ap_operation (γ (class_of (Φ t) (fst a))) (map_family_prod (λ s : Sort σ, class_of (Φ s)) (snd a)) = class_of (Φ (cod_symboltype w)) (ap_operation (α (fst a)) (snd a))
QB: forall a : carriers_subalgebra A P t * FamilyProd (carriers_subalgebra A P) (dom_symboltype w), ap_operation (ζ (class_of (Ψ t) (fst a))) (map_family_prod (λ s : Sort σ, class_of (Ψ s)) (snd a)) = class_of (Ψ (cod_symboltype w)) (ap_operation (op_subalgebra A P (α (fst a).1) (CB (fst a).1 (fst a).2)) (snd a))
IHw: forall (α : Operation A w) (γ : Operation (carriers_quotient_algebra A Φ) w) (ζ : Operation (carriers_quotient_algebra (A && P) Ψ) w) (CA : ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x : carriers_quotient_algebra A Φ s), Trunc (-1) {y : carriers_subalgebra A P s & in_class (Φ s) x (def_inc_subalgebra A P s y)}) γ) (CB : ClosedUnderOp A P α), (forall a : FamilyProd A (dom_symboltype w), ap_operation γ (map_family_prod (λ s : Sort σ, class_of (Φ s)) a) = class_of (Φ (cod_symboltype w)) (ap_operation α a)) -> (forall a : FamilyProd (carriers_subalgebra A P) (dom_symboltype w), ap_operation ζ (map_family_prod (λ s : Sort σ, class_of (Ψ s)) a) = class_of (Ψ (cod_symboltype w)) (ap_operation (op_subalgebra A P α CB) a)) -> OpPreserving def_second_isomorphism ζ (op_subalgebra (A / Φ) (λ (s : Sort σ) (x : carriers_quotient_algebra A Φ s), Trunc (-1) {y : carriers_subalgebra A P s & in_class (Φ s) x (def_inc_subalgebra A P s y)}) γ CA)
x: (A && P) t

forall a : FamilyProd A (dom_symboltype w), ap_operation (γ (class_of (Φ t) (i t x))) (map_family_prod (λ s : Sort σ, class_of (Φ s)) a) = class_of (Φ (cod_symboltype w)) (ap_operation (α (i t x)) a)
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
t: Sort σ
w: ne_list.notations.ne_list (Sort σ)
α: A t -> Operation A w
γ: carriers_quotient_algebra A Φ t -> Operation (carriers_quotient_algebra A Φ) w
ζ: carriers_quotient_algebra (A && P) Ψ t -> Operation (carriers_quotient_algebra (A && P) Ψ) w
CA: forall x : carriers_quotient_algebra A Φ t, Trunc (-1) {y : carriers_subalgebra A P t & in_class (Φ t) x (def_inc_subalgebra A P t y)} -> ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x0 : carriers_quotient_algebra A Φ s), Trunc (-1) {y : carriers_subalgebra A P s & in_class (Φ s) x0 (def_inc_subalgebra A P s y)}) (γ x)
CB: forall x : A t, P t x -> ClosedUnderOp A P (α x)
QA: forall a : A t * FamilyProd A (dom_symboltype w), ap_operation (γ (class_of (Φ t) (fst a))) (map_family_prod (λ s : Sort σ, class_of (Φ s)) (snd a)) = class_of (Φ (cod_symboltype w)) (ap_operation (α (fst a)) (snd a))
QB: forall a : carriers_subalgebra A P t * FamilyProd (carriers_subalgebra A P) (dom_symboltype w), ap_operation (ζ (class_of (Ψ t) (fst a))) (map_family_prod (λ s : Sort σ, class_of (Ψ s)) (snd a)) = class_of (Ψ (cod_symboltype w)) (ap_operation (op_subalgebra A P (α (fst a).1) (CB (fst a).1 (fst a).2)) (snd a))
IHw: forall (α : Operation A w) (γ : Operation (carriers_quotient_algebra A Φ) w) (ζ : Operation (carriers_quotient_algebra (A && P) Ψ) w) (CA : ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x : carriers_quotient_algebra A Φ s), Trunc (-1) {y : carriers_subalgebra A P s & in_class (Φ s) x (def_inc_subalgebra A P s y)}) γ) (CB : ClosedUnderOp A P α), (forall a : FamilyProd A (dom_symboltype w), ap_operation γ (map_family_prod (λ s : Sort σ, class_of (Φ s)) a) = class_of (Φ (cod_symboltype w)) (ap_operation α a)) -> (forall a : FamilyProd (carriers_subalgebra A P) (dom_symboltype w), ap_operation ζ (map_family_prod (λ s : Sort σ, class_of (Ψ s)) a) = class_of (Ψ (cod_symboltype w)) (ap_operation (op_subalgebra A P α CB) a)) -> OpPreserving def_second_isomorphism ζ (op_subalgebra (A / Φ) (λ (s : Sort σ) (x : carriers_quotient_algebra A Φ s), Trunc (-1) {y : carriers_subalgebra A P s & in_class (Φ s) x (def_inc_subalgebra A P s y)}) γ CA)
x: (A && P) t
a: FamilyProd A (dom_symboltype w)

ap_operation (γ (class_of (Φ t) (i t x))) (map_family_prod (λ s : Sort σ, class_of (Φ s)) a) = class_of (Φ (cod_symboltype w)) (ap_operation (α (i t x)) a)
exact (QA (i t x, a)).
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
t: Sort σ
w: ne_list.notations.ne_list (Sort σ)
α: A t -> Operation A w
γ: carriers_quotient_algebra A Φ t -> Operation (carriers_quotient_algebra A Φ) w
ζ: carriers_quotient_algebra (A && P) Ψ t -> Operation (carriers_quotient_algebra (A && P) Ψ) w
CA: forall x : carriers_quotient_algebra A Φ t, Trunc (-1) {y : carriers_subalgebra A P t & in_class (Φ t) x (def_inc_subalgebra A P t y)} -> ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x0 : carriers_quotient_algebra A Φ s), Trunc (-1) {y : carriers_subalgebra A P s & in_class (Φ s) x0 (def_inc_subalgebra A P s y)}) (γ x)
CB: forall x : A t, P t x -> ClosedUnderOp A P (α x)
QA: forall a : A t * FamilyProd A (dom_symboltype w), ap_operation (γ (class_of (Φ t) (fst a))) (map_family_prod (λ s : Sort σ, class_of (Φ s)) (snd a)) = class_of (Φ (cod_symboltype w)) (ap_operation (α (fst a)) (snd a))
QB: forall a : carriers_subalgebra A P t * FamilyProd (carriers_subalgebra A P) (dom_symboltype w), ap_operation (ζ (class_of (Ψ t) (fst a))) (map_family_prod (λ s : Sort σ, class_of (Ψ s)) (snd a)) = class_of (Ψ (cod_symboltype w)) (ap_operation (op_subalgebra A P (α (fst a).1) (CB (fst a).1 (fst a).2)) (snd a))
IHw: forall (α : Operation A w) (γ : Operation (carriers_quotient_algebra A Φ) w) (ζ : Operation (carriers_quotient_algebra (A && P) Ψ) w) (CA : ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x : carriers_quotient_algebra A Φ s), Trunc (-1) {y : carriers_subalgebra A P s & in_class (Φ s) x (def_inc_subalgebra A P s y)}) γ) (CB : ClosedUnderOp A P α), (forall a : FamilyProd A (dom_symboltype w), ap_operation γ (map_family_prod (λ s : Sort σ, class_of (Φ s)) a) = class_of (Φ (cod_symboltype w)) (ap_operation α a)) -> (forall a : FamilyProd (carriers_subalgebra A P) (dom_symboltype w), ap_operation ζ (map_family_prod (λ s : Sort σ, class_of (Ψ s)) a) = class_of (Ψ (cod_symboltype w)) (ap_operation (op_subalgebra A P α CB) a)) -> OpPreserving def_second_isomorphism ζ (op_subalgebra (A / Φ) (λ (s : Sort σ) (x : carriers_quotient_algebra A Φ s), Trunc (-1) {y : carriers_subalgebra A P s & in_class (Φ s) x (def_inc_subalgebra A P s y)}) γ CA)
x: (A && P) t

forall a : FamilyProd (carriers_subalgebra A P) (dom_symboltype w), ap_operation (ζ (class_of (Ψ t) x)) (map_family_prod (λ s : Sort σ, class_of (Ψ s)) a) = class_of (Ψ (cod_symboltype w)) (ap_operation (op_subalgebra A P (α (i t x)) (CB (i t x) x.2)) a)
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
t: Sort σ
w: ne_list.notations.ne_list (Sort σ)
α: A t -> Operation A w
γ: carriers_quotient_algebra A Φ t -> Operation (carriers_quotient_algebra A Φ) w
ζ: carriers_quotient_algebra (A && P) Ψ t -> Operation (carriers_quotient_algebra (A && P) Ψ) w
CA: forall x : carriers_quotient_algebra A Φ t, Trunc (-1) {y : carriers_subalgebra A P t & in_class (Φ t) x (def_inc_subalgebra A P t y)} -> ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x0 : carriers_quotient_algebra A Φ s), Trunc (-1) {y : carriers_subalgebra A P s & in_class (Φ s) x0 (def_inc_subalgebra A P s y)}) (γ x)
CB: forall x : A t, P t x -> ClosedUnderOp A P (α x)
QA: forall a : A t * FamilyProd A (dom_symboltype w), ap_operation (γ (class_of (Φ t) (fst a))) (map_family_prod (λ s : Sort σ, class_of (Φ s)) (snd a)) = class_of (Φ (cod_symboltype w)) (ap_operation (α (fst a)) (snd a))
QB: forall a : carriers_subalgebra A P t * FamilyProd (carriers_subalgebra A P) (dom_symboltype w), ap_operation (ζ (class_of (Ψ t) (fst a))) (map_family_prod (λ s : Sort σ, class_of (Ψ s)) (snd a)) = class_of (Ψ (cod_symboltype w)) (ap_operation (op_subalgebra A P (α (fst a).1) (CB (fst a).1 (fst a).2)) (snd a))
IHw: forall (α : Operation A w) (γ : Operation (carriers_quotient_algebra A Φ) w) (ζ : Operation (carriers_quotient_algebra (A && P) Ψ) w) (CA : ClosedUnderOp (A / Φ) (λ (s : Sort σ) (x : carriers_quotient_algebra A Φ s), Trunc (-1) {y : carriers_subalgebra A P s & in_class (Φ s) x (def_inc_subalgebra A P s y)}) γ) (CB : ClosedUnderOp A P α), (forall a : FamilyProd A (dom_symboltype w), ap_operation γ (map_family_prod (λ s : Sort σ, class_of (Φ s)) a) = class_of (Φ (cod_symboltype w)) (ap_operation α a)) -> (forall a : FamilyProd (carriers_subalgebra A P) (dom_symboltype w), ap_operation ζ (map_family_prod (λ s : Sort σ, class_of (Ψ s)) a) = class_of (Ψ (cod_symboltype w)) (ap_operation (op_subalgebra A P α CB) a)) -> OpPreserving def_second_isomorphism ζ (op_subalgebra (A / Φ) (λ (s : Sort σ) (x : carriers_quotient_algebra A Φ s), Trunc (-1) {y : carriers_subalgebra A P s & in_class (Φ s) x (def_inc_subalgebra A P s y)}) γ CA)
x: (A && P) t
a: FamilyProd (carriers_subalgebra A P) (dom_symboltype w)

ap_operation (ζ (class_of (Ψ t) x)) (map_family_prod (λ s : Sort σ, class_of (Ψ s)) a) = class_of (Ψ (cod_symboltype w)) (ap_operation (op_subalgebra A P (α (i t x)) (CB (i t x) x.2)) a)
exact (QB (x, a)). Defined.
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ

IsHomomorphism def_second_isomorphism
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ

IsHomomorphism def_second_isomorphism
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
u: Symbol σ

OpPreserving def_second_isomorphism u.#(A && P / Ψ) u.#(A / Φ && (λ (s : Sort σ) (x : (A / Φ) s), Q s x))
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
u: Symbol σ

ComputeOpQuotient A Φ u.#(A / Φ)
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
u: Symbol σ
ComputeOpQuotient (A && P) Ψ (op_subalgebra A P ?CB) u.#(A && P / Ψ)
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
u: Symbol σ

ComputeOpQuotient A Φ u.#(A / Φ)
apply (compute_op_quotient A).
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
u: Symbol σ

ComputeOpQuotient (A && P) Ψ (op_subalgebra A P u.#A ?CB) u.#(A && P / Ψ)
apply (compute_op_quotient (A&&P)). Defined. Definition hom_second_isomorphism : Homomorphism ((A&&P) / Ψ) ((A/Φ) && Q) := BuildHomomorphism def_second_isomorphism.
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
s: Sort σ

IsEmbedding (hom_second_isomorphism s)
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
s: Sort σ

IsEmbedding (hom_second_isomorphism s)
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
s: Sort σ

isinj (hom_second_isomorphism s)
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
s: Sort σ

forall (x : (A && P) s) (x1 : (A && P / Ψ) s), hom_second_isomorphism s (class_of (Ψ s) x) = hom_second_isomorphism s x1 -> class_of (Ψ s) x = x1
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
s: Sort σ
x: (A && P) s

forall x1 : (A && P / Ψ) s, hom_second_isomorphism s (class_of (Ψ s) x) = hom_second_isomorphism s x1 -> class_of (Ψ s) x = x1
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
s: Sort σ
x: (A && P) s

forall x0 : (A && P) s, hom_second_isomorphism s (class_of (Ψ s) x) = hom_second_isomorphism s (class_of (Ψ s) x0) -> class_of (Ψ s) x = class_of (Ψ s) x0
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
s: Sort σ
x, y: (A && P) s
p: hom_second_isomorphism s (class_of (Ψ s) x) = hom_second_isomorphism s (class_of (Ψ s) y)

class_of (Ψ s) x = class_of (Ψ s) y
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
s: Sort σ
x, y: (A && P) s
p: hom_second_isomorphism s (class_of (Ψ s) x) = hom_second_isomorphism s (class_of (Ψ s) y)

Ψ s x y
exact (related_quotient_paths (Φ s) (i s x) (i s y) (p..1)). Qed.
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
s: Sort σ

ReflectiveSubuniverse.IsConnMap (Tr (-1)) (hom_second_isomorphism s)
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
s: Sort σ

ReflectiveSubuniverse.IsConnMap (Tr (-1)) (hom_second_isomorphism s)
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
s: Sort σ

forall b : (A / Φ && (λ (s : Sort σ) (x : (A / Φ) s), Q s x)) s, merely (hfiber (hom_second_isomorphism s) b)
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
s: Sort σ
y: (A / Φ) s
S: Q s y

merely (hfiber (hom_second_isomorphism s) (y; S))
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
s: Sort σ
y: (A / Φ) s

forall S : Q s y, merely (hfiber (hom_second_isomorphism s) (y; S))
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
s: Sort σ

forall (y : (A / Φ) s) (S : Q s y), merely (hfiber (hom_second_isomorphism s) (y; S))
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
s: Sort σ

forall (x : A s) (S : Q s (class_of (Φ s) x)), merely (hfiber (hom_second_isomorphism s) (class_of (Φ s) x; S))
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
s: Sort σ
y: A s
S: Q s (class_of (Φ s) y)

merely (hfiber (hom_second_isomorphism s) (class_of (Φ s) y; S))
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
s: Sort σ
y: A s
S: Q s (class_of (Φ s) y)

{y0 : (A && P) s & in_class (Φ s) (class_of (Φ s) y) (i s y0)} -> merely (hfiber (hom_second_isomorphism s) (class_of (Φ s) y; S))
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
s: Sort σ
y: A s
S: Q s (class_of (Φ s) y)
y': (A && P) s
S': in_class (Φ s) (class_of (Φ s) y) (i s y')

merely (hfiber (hom_second_isomorphism s) (class_of (Φ s) y; S))
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
s: Sort σ
y: A s
S: Q s (class_of (Φ s) y)
y': (A && P) s
S': in_class (Φ s) (class_of (Φ s) y) (i s y')

hfiber (hom_second_isomorphism s) (class_of (Φ s) y; S)
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
s: Sort σ
y: A s
S: Q s (class_of (Φ s) y)
y': (A && P) s
S': in_class (Φ s) (class_of (Φ s) y) (i s y')

hom_second_isomorphism s (class_of (Ψ s) y') = (class_of (Φ s) y; S)
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
s: Sort σ
y: A s
S: Q s (class_of (Φ s) y)
y': (A && P) s
S': in_class (Φ s) (class_of (Φ s) y) (i s y')

(hom_second_isomorphism s (class_of (Ψ s) y')).1 = (class_of (Φ s) y; S).1
by apply qglue. Qed.
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ

IsIsomorphism hom_second_isomorphism
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ

IsIsomorphism hom_second_isomorphism
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ
s: Sort σ

IsEquiv (hom_second_isomorphism s)
apply isequiv_surj_emb; exact _. Qed. Global Existing Instance is_isomorphism_second_isomorphism.
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ

A && P / Ψ ≅ A / Φ && (λ (s : Sort σ) (x : (A / Φ) s), Q s x)
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ

A && P / Ψ ≅ A / Φ && (λ (s : Sort σ) (x : (A / Φ) s), Q s x)
exact (BuildIsomorphic def_second_isomorphism). Defined.
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ

A && P / Ψ = A / Φ && (λ (s : Sort σ) (x : (A / Φ) s), Q s x)
H: Univalence
σ: Signature
A: Algebra σ
P: forall s : Sort σ, A s -> Type
IsSubalgebraPredicate0: IsSubalgebraPredicate A P
Φ: forall s : Sort σ, Relation (A s)
IsCongruence0: IsCongruence A Φ

A && P / Ψ = A / Φ && (λ (s : Sort σ) (x : (A / Φ) s), Q s x)
exact (id_isomorphic isomorphic_second_isomorphism). Defined. End second_isomorphism.