Built with Alectryon. 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.
(** This file defines the term algebra [TermAlgebra], also referred to as the absolutely free algebra.
We show that term algebra forms an adjoint functor from the category of hset carriers
<<
{C : Carrier σ | foralls, IsHSet (C s)}
>>
to the category of algebras (without equations) [Algebra σ], where [Carriers σ] is notation for [Sort σ -> Type]. See [ump_term_algebra].
There is a similar construction for algebras with equations, the free algebra [FreeAlgebra]. The free algebra is defined in another file. *)
Require Export HoTT.Algebra.Universal.Algebra.Require Import
HoTT.Universes.HSet
HoTT.Classes.interfaces.canonical_names
HoTT.Algebra.Universal.Homomorphism
HoTT.Algebra.Universal.Congruence.Unset Elimination Schemes.LocalOpen Scope Algebra_scope.(** The term algebra carriers are generated by [C : Carriers σ], with an element for each element of [C s], and an operation for each operation symbol [u : Symbol σ]. *)InductiveCarriersTermAlgebra {σ} (C : Carriers σ) : Carriers σ :=
| var_term_algebra : foralls, C s -> CarriersTermAlgebra C s
| ops_term_algebra : forall (u : Symbol σ),
DomOperation (CarriersTermAlgebra C) (σ u) ->
CarriersTermAlgebra C (sort_cod (σ u)).SchemeCarriersTermAlgebra_ind := Induction for CarriersTermAlgebra SortType.Arguments CarriersTermAlgebra_ind {σ}.DefinitionCarriersTermAlgebra_rect {σ} := @CarriersTermAlgebra_ind σ.DefinitionCarriersTermAlgebra_rec {σ : Signature} (C : Carriers σ)
(P : Sort σ -> Type) (vs : forall (s : Sort σ), C s -> P s)
(os : forall (u : Symbol σ) (c : DomOperation (CarriersTermAlgebra C) (σ u)),
(foralli : Arity (σ u), P (sorts_dom (σ u) i)) -> P (sort_cod (σ u)))
(s : Sort σ) (T : CarriersTermAlgebra C s)
: P s
:= CarriersTermAlgebra_ind C (funs_ => P s) vs os s T.(** A family of relations [R : forall s, Relation (C s)] can be extended to a family of relations on the term algebra carriers,<< forall s, Relation (CarriersTermAlgebra C s)>> See [ExtendDRelTermAlgebra] and [ExtendRelTermAlgebra] below. *)FixpointExtendDRelTermAlgebra {σ : Signature} {C : Carriers σ}
(R : foralls, Relation (C s)) {s1s2 : Sort σ}
(S : CarriersTermAlgebra C s1) (T : CarriersTermAlgebra C s2)
: Type
:= match S, T with
| var_term_algebra s1 x, var_term_algebra s2 y =>
{p : s1 = s2 | R s2 (p # x) y}
| ops_term_algebra u1 a, ops_term_algebra u2 b =>
{ p : u1 = u2 |
foralli : Arity (σ u1),
ExtendDRelTermAlgebra
R (a i) (b (transport (funv => Arity (σ v)) p i))}
| _, _ => Empty
end.DefinitionExtendRelTermAlgebra {σ : Signature} {C : Carriers σ}
(R : foralls, Relation (C s)) {s : Sort σ}
: CarriersTermAlgebra C s -> CarriersTermAlgebra C s -> Type
:= ExtendDRelTermAlgebra R.(** The next section shows, in particular, the following: If [R : forall s, Relation (C s)] is a family of mere equivalence relations, then [@ExtendRelTermAlgebra σ C R] is a family of mere equivalence relations. *)Sectionextend_rel_term_algebra.Context `{Funext} {σ : Signature} {C : Carriers σ}
(R : foralls, Relation (C s))
`{!foralls, is_mere_relation (C s) (R s)}.
H: Funext σ: Signature C: Carriers σ R: foralls : Sort σ, Relation (C s) H0: forall (s : Sort σ) (xy : C s), IsHProp (R s x y) s1, s2: Sort σ S: CarriersTermAlgebra C s1 T: CarriersTermAlgebra C s2
IsHProp (ExtendDRelTermAlgebra R S T)
H: Funext σ: Signature C: Carriers σ R: foralls : Sort σ, Relation (C s) H0: forall (s : Sort σ) (xy : C s), IsHProp (R s x y) s1, s2: Sort σ S: CarriersTermAlgebra C s1 T: CarriersTermAlgebra C s2
IsHProp (ExtendDRelTermAlgebra R S T)
H: Funext σ: Signature C: Carriers σ R: foralls : Sort σ, Relation (C s) H0: forall (s : Sort σ) (xy : C s), IsHProp (R s x y) s1: Sort σ S: CarriersTermAlgebra C s1
forall (s2 : Sort σ) (T : CarriersTermAlgebra C s2),
IsHProp (ExtendDRelTermAlgebra R S T)
ExtendRelTermAlgebra R S T -> ExtendRelTermAlgebra R T S
apply symmetric_extend_drel_term_algebra.Defined.
H: Funext σ: Signature C: Carriers σ R: foralls : Sort σ, Relation (C s) H0: forall (s : Sort σ) (xy : C s), IsHProp (R s x y) H1: foralls : Sort σ, Transitive (R s) s1, s2, s3: Sort σ S: CarriersTermAlgebra C s1 T: CarriersTermAlgebra C s2 U: CarriersTermAlgebra C s3 h1: ExtendDRelTermAlgebra R S T h2: ExtendDRelTermAlgebra R T U
ExtendDRelTermAlgebra R S U
H: Funext σ: Signature C: Carriers σ R: foralls : Sort σ, Relation (C s) H0: forall (s : Sort σ) (xy : C s), IsHProp (R s x y) H1: foralls : Sort σ, Transitive (R s) s1, s2, s3: Sort σ S: CarriersTermAlgebra C s1 T: CarriersTermAlgebra C s2 U: CarriersTermAlgebra C s3 h1: ExtendDRelTermAlgebra R S T h2: ExtendDRelTermAlgebra R T U
ExtendDRelTermAlgebra R S U
H: Funext σ: Signature C: Carriers σ R: foralls : Sort σ, Relation (C s) H0: forall (s : Sort σ) (xy : C s), IsHProp (R s x y) H1: foralls : Sort σ, Transitive (R s) s1, s2: Sort σ S: CarriersTermAlgebra C s1 T: CarriersTermAlgebra C s2 h1: ExtendDRelTermAlgebra R S T
forall (s3 : Sort σ) (U : CarriersTermAlgebra C s3),
ExtendDRelTermAlgebra R T U -> ExtendDRelTermAlgebra R S U
H: Funext σ: Signature C: Carriers σ R: foralls : Sort σ, Relation (C s) H0: forall (s : Sort σ) (xy : C s), IsHProp (R s x y) H1: foralls : Sort σ, Transitive (R s) s1: Sort σ S: CarriersTermAlgebra C s1
forall (s2 : Sort σ) (T : CarriersTermAlgebra C s2),
ExtendDRelTermAlgebra R S T ->
forall (s3 : Sort σ) (U : CarriersTermAlgebra C s3),
ExtendDRelTermAlgebra R T U -> ExtendDRelTermAlgebra R S U
H: Funext σ: Signature C: Carriers σ R: foralls4 : Sort σ, Relation (C s4) H0: forall (s4 : Sort σ) (xy : C s4), IsHProp (R s4 x y) H1: foralls4 : Sort σ, Transitive (R s4) s: Sort σ c: C s s2, s0: Sort σ d: C s0 p2: s = s0 P2: R s0 (transport C p2 c) d s3, s1: Sort σ c0: C s1 p3: s0 = s1 P3: R s1 (transport C p3 d) c0
ExtendDRelTermAlgebra R (var_term_algebra C s c) (var_term_algebra C s1 c0)
H: Funext σ: Signature C: Carriers σ R: foralls : Sort σ, Relation (C s) H0: forall (s : Sort σ) (xy : C s), IsHProp (R s x y) H1: foralls : Sort σ, Transitive (R s) u: Symbol σ c: foralli : Arity (σ u), CarriersTermAlgebra C (sorts_dom (σ u) i) h: forall (i : Arity (σ u)) (s0 : Sort σ) (T : CarriersTermAlgebra C s0),
ExtendDRelTermAlgebra R (c i) T ->
forall (s1 : Sort σ) (U : CarriersTermAlgebra C s1),
ExtendDRelTermAlgebra R T U -> ExtendDRelTermAlgebra R (c i) U s2: Sort σ u0: Symbol σ d: foralli : Arity (σ u0), CarriersTermAlgebra C (sorts_dom (σ u0) i) p2: u = u0 P2: foralli : Arity (σ u),
ExtendDRelTermAlgebra R (c i)
(d (transport (funv : Symbol σ => Arity (σ v)) p2 i)) s3: Sort σ u1: Symbol σ c0: foralli : Arity (σ u1), CarriersTermAlgebra C (sorts_dom (σ u1) i) p3: u0 = u1 P3: foralli : Arity (σ u0),
ExtendDRelTermAlgebra R (d i)
(c0 (transport (funv : Symbol σ => Arity (σ v)) p3 i))
ExtendDRelTermAlgebra R (ops_term_algebra C u c) (ops_term_algebra C u1 c0)
H: Funext σ: Signature C: Carriers σ R: foralls4 : Sort σ, Relation (C s4) H0: forall (s4 : Sort σ) (xy : C s4), IsHProp (R s4 x y) H1: foralls4 : Sort σ, Transitive (R s4) s: Sort σ c: C s s2, s0: Sort σ d: C s0 p2: s = s0 P2: R s0 (transport C p2 c) d s3, s1: Sort σ c0: C s1 p3: s0 = s1 P3: R s1 (transport C p3 d) c0
ExtendDRelTermAlgebra R (var_term_algebra C s c) (var_term_algebra C s1 c0)
H: Funext σ: Signature C: Carriers σ R: foralls4 : Sort σ, Relation (C s4) H0: forall (s4 : Sort σ) (xy : C s4), IsHProp (R s4 x y) H1: foralls4 : Sort σ, Transitive (R s4) s: Sort σ c: C s s2, s0: Sort σ d: C s0 p2: s = s0 P2: R s0 (transport C p2 c) d s3, s1: Sort σ c0: C s1 p3: s0 = s1 P3: R s1 (transport C p3 d) c0
R s1 (transport C (p2 @ p3) c) c0
H: Funext σ: Signature C: Carriers σ R: foralls4 : Sort σ, Relation (C s4) H0: forall (s4 : Sort σ) (xy : C s4), IsHProp (R s4 x y) H1: foralls4 : Sort σ, Transitive (R s4) s: Sort σ c: C s s2, s0: Sort σ d: C s0 p2: s = s0 P2: R s0 (transport C p2 c) d s3, s1: Sort σ c0: C s1 p3: s0 = s1 P3: R s1 (transport C p3 d) c0
R s1 (transport C p3 (transport C p2 c)) c0
H: Funext σ: Signature C: Carriers σ R: foralls0 : Sort σ, Relation (C s0) H0: forall (s0 : Sort σ) (xy : C s0), IsHProp (R s0 x y) H1: foralls0 : Sort σ, Transitive (R s0) s: Sort σ c: C s s2: Sort σ d: C s P2: R s (transport C 1 c) d s3: Sort σ c0: C s P3: R s (transport C 1 d) c0
R s (transport C 1 (transport C 1 c)) c0
bytransitivity d.
H: Funext σ: Signature C: Carriers σ R: foralls : Sort σ, Relation (C s) H0: forall (s : Sort σ) (xy : C s), IsHProp (R s x y) H1: foralls : Sort σ, Transitive (R s) u: Symbol σ c: foralli : Arity (σ u), CarriersTermAlgebra C (sorts_dom (σ u) i) h: forall (i : Arity (σ u)) (s0 : Sort σ) (T : CarriersTermAlgebra C s0),
ExtendDRelTermAlgebra R (c i) T ->
forall (s1 : Sort σ) (U : CarriersTermAlgebra C s1),
ExtendDRelTermAlgebra R T U -> ExtendDRelTermAlgebra R (c i) U s2: Sort σ u0: Symbol σ d: foralli : Arity (σ u0), CarriersTermAlgebra C (sorts_dom (σ u0) i) p2: u = u0 P2: foralli : Arity (σ u),
ExtendDRelTermAlgebra R (c i)
(d (transport (funv : Symbol σ => Arity (σ v)) p2 i)) s3: Sort σ u1: Symbol σ c0: foralli : Arity (σ u1), CarriersTermAlgebra C (sorts_dom (σ u1) i) p3: u0 = u1 P3: foralli : Arity (σ u0),
ExtendDRelTermAlgebra R (d i)
(c0 (transport (funv : Symbol σ => Arity (σ v)) p3 i))
ExtendDRelTermAlgebra R (ops_term_algebra C u c) (ops_term_algebra C u1 c0)
H: Funext σ: Signature C: Carriers σ R: foralls : Sort σ, Relation (C s) H0: forall (s : Sort σ) (xy : C s), IsHProp (R s x y) H1: foralls : Sort σ, Transitive (R s) u: Symbol σ c: foralli : Arity (σ u), CarriersTermAlgebra C (sorts_dom (σ u) i) h: forall (i : Arity (σ u)) (s0 : Sort σ) (T : CarriersTermAlgebra C s0),
ExtendDRelTermAlgebra R (c i) T ->
forall (s1 : Sort σ) (U : CarriersTermAlgebra C s1),
ExtendDRelTermAlgebra R T U -> ExtendDRelTermAlgebra R (c i) U s2: Sort σ u0: Symbol σ d: foralli : Arity (σ u0), CarriersTermAlgebra C (sorts_dom (σ u0) i) p2: u = u0 P2: foralli : Arity (σ u),
ExtendDRelTermAlgebra R (c i)
(d (transport (funv : Symbol σ => Arity (σ v)) p2 i)) s3: Sort σ u1: Symbol σ c0: foralli : Arity (σ u1), CarriersTermAlgebra C (sorts_dom (σ u1) i) p3: u0 = u1 P3: foralli : Arity (σ u0),
ExtendDRelTermAlgebra R (d i)
(c0 (transport (funv : Symbol σ => Arity (σ v)) p3 i))
constructor; exact _.Qed.Endextend_rel_term_algebra.(** By using path (propositional equality) as equivalence relation for [ExtendRelTermAlgebra], we obtain an equivalent notion of equality of term algebra carriers, [equiv_path_extend_path_term_algebra]. The reason for introducing [ExtendRelTermAlgebra] is to have a notion of equality which works well together with induction on term algebras. *)Sectionextend_path_term_algebra.Context `{Funext} {σ} {C : Carriers σ} `{!foralls, IsHSet (C s)}.DefinitionExtendPathTermAlgebra {s : Sort σ}
(S : CarriersTermAlgebra C s) (T : CarriersTermAlgebra C s)
: Type
:= ExtendRelTermAlgebra (funs => paths) S T.
forall (s2 : Sort σ) (T : CarriersTermAlgebra C s2),
ExtendDRelTermAlgebra (funs : Sort σ => paths) S T ->
{p : s1 = s2 & transport (CarriersTermAlgebra C) p S = T}
H: Funext σ: Signature C: Carriers σ H0: foralls1 : Sort σ, IsHSet (C s1) s: Sort σ c: C s s2, s0: Sort σ d: C s0 p: s = s0 e: transport C p c = d
{p0 : s = s0 &
transport (CarriersTermAlgebra C) p0 (var_term_algebra C s c) =
var_term_algebra C s0 d}
H: Funext σ: Signature C: Carriers σ H0: foralls : Sort σ, IsHSet (C s) u: Symbol σ c: foralli : Arity (σ u), CarriersTermAlgebra C (sorts_dom (σ u) i) h: forall (i : Arity (σ u)) (s0 : Sort σ) (T : CarriersTermAlgebra C s0),
ExtendDRelTermAlgebra (funs : Sort σ => paths) (c i) T ->
{p0 : sorts_dom (σ u) i = s0 &
transport (CarriersTermAlgebra C) p0 (c i) = T} s2: Sort σ u0: Symbol σ d: foralli : Arity (σ u0), CarriersTermAlgebra C (sorts_dom (σ u0) i) p: u = u0 e: foralli : Arity (σ u),
ExtendDRelTermAlgebra (funs : Sort σ => paths) (c i)
(d (transport (funv : Symbol σ => Arity (σ v)) p i))
{p0 : sort_cod (σ u) = sort_cod (σ u0) &
transport (CarriersTermAlgebra C) p0 (ops_term_algebra C u c) =
ops_term_algebra C u0 d}
H: Funext σ: Signature C: Carriers σ H0: foralls1 : Sort σ, IsHSet (C s1) s: Sort σ c: C s s2, s0: Sort σ d: C s0 p: s = s0 e: transport C p c = d
{p0 : s = s0 &
transport (CarriersTermAlgebra C) p0 (var_term_algebra C s c) =
var_term_algebra C s0 d}
H: Funext σ: Signature C: Carriers σ H0: foralls1 : Sort σ, IsHSet (C s1) s: Sort σ c: C s s2, s0: Sort σ d: C s0 p: s = s0 e: transport C p c = d
transport (CarriersTermAlgebra C) p (var_term_algebra C s c) =
var_term_algebra C s0 d
byinduction p, e.
H: Funext σ: Signature C: Carriers σ H0: foralls : Sort σ, IsHSet (C s) u: Symbol σ c: foralli : Arity (σ u), CarriersTermAlgebra C (sorts_dom (σ u) i) h: forall (i : Arity (σ u)) (s0 : Sort σ) (T : CarriersTermAlgebra C s0),
ExtendDRelTermAlgebra (funs : Sort σ => paths) (c i) T ->
{p0 : sorts_dom (σ u) i = s0 &
transport (CarriersTermAlgebra C) p0 (c i) = T} s2: Sort σ u0: Symbol σ d: foralli : Arity (σ u0), CarriersTermAlgebra C (sorts_dom (σ u0) i) p: u = u0 e: foralli : Arity (σ u),
ExtendDRelTermAlgebra (funs : Sort σ => paths) (c i)
(d (transport (funv : Symbol σ => Arity (σ v)) p i))
{p0 : sort_cod (σ u) = sort_cod (σ u0) &
transport (CarriersTermAlgebra C) p0 (ops_term_algebra C u c) =
ops_term_algebra C u0 d}
H: Funext σ: Signature C: Carriers σ H0: foralls : Sort σ, IsHSet (C s) u: Symbol σ c: foralli : Arity (σ u), CarriersTermAlgebra C (sorts_dom (σ u) i) h: forall (i : Arity (σ u)) (s0 : Sort σ) (T : CarriersTermAlgebra C s0),
ExtendDRelTermAlgebra (funs : Sort σ => paths) (c i) T ->
{p0 : sorts_dom (σ u) i = s0 &
transport (CarriersTermAlgebra C) p0 (c i) = T} s2: Sort σ d: foralli : Arity (σ u), CarriersTermAlgebra C (sorts_dom (σ u) i) e: foralli : Arity (σ u),
ExtendDRelTermAlgebra (funs : Sort σ => paths) (c i)
(d (transport (funv : Symbol σ => Arity (σ v)) 1 i)) a: Arity (σ u) p: sorts_dom (σ u) a = sorts_dom (σ u) a q: transport (CarriersTermAlgebra C) p (c a) = d a
c a = d a
byinduction (hset_path2 idpath p).Defined.
H: Funext σ: Signature C: Carriers σ H0: foralls0 : Sort σ, IsHSet (C s0) s: Sort σ S, T: CarriersTermAlgebra C s e: ExtendPathTermAlgebra S T
S = T
H: Funext σ: Signature C: Carriers σ H0: foralls0 : Sort σ, IsHSet (C s0) s: Sort σ S, T: CarriersTermAlgebra C s e: ExtendPathTermAlgebra S T
S = T
H: Funext σ: Signature C: Carriers σ H0: foralls0 : Sort σ, IsHSet (C s0) s: Sort σ S, T: CarriersTermAlgebra C s e: ExtendPathTermAlgebra S T p: s = s q: transport (CarriersTermAlgebra C) p S = T
forallxy : CarriersTermAlgebra C s, ExtendPathTermAlgebra x y -> x = y
exact path_extend_path_term_algebra.Defined.Definitionequiv_path_extend_path_term_algebra {s : Sort σ}
(ST : CarriersTermAlgebra C s)
: ExtendPathTermAlgebra S T <~> (S = T)
:= equiv_iff_hprop
(path_extend_path_term_algebra S T)
reflexive_extend_path_term_algebra_path.Endextend_path_term_algebra.(** At this point we can define the term algebra. *)DefinitionTermAlgebra `{Funext} {σ : Signature}
(C : Carriers σ) `{!foralls, IsHSet (C s)}
: Algebra σ
:= Build_Algebra (CarriersTermAlgebra C) (@ops_term_algebra _ C).
σ: Signature C: Carriers σ s: Sort σ x, y: C s
var_term_algebra C s x = var_term_algebra C s y -> x = y
σ: Signature C: Carriers σ s: Sort σ x, y: C s
var_term_algebra C s x = var_term_algebra C s y -> x = y
σ: Signature C: Carriers σ s: Sort σ x, y: C s p: var_term_algebra C s x = var_term_algebra C s y
x = y
σ: Signature C: Carriers σ s: Sort σ x, y: C s p: ExtendPathTermAlgebra (var_term_algebra C s x) (var_term_algebra C s y)
x = y
σ: Signature C: Carriers σ s: Sort σ x, y: C s p1: s = s p2: transport C p1 x = y
x = y
bydestruct (hset_path2 p1 idpath)^.Qed.
H: Funext σ: Signature C: Carriers σ u: Symbol σ a, b: foralli : Arity (σ u), CarriersTermAlgebra C (sorts_dom (σ u) i)
ops_term_algebra C u a = ops_term_algebra C u b -> a = b
H: Funext σ: Signature C: Carriers σ u: Symbol σ a, b: foralli : Arity (σ u), CarriersTermAlgebra C (sorts_dom (σ u) i)
ops_term_algebra C u a = ops_term_algebra C u b -> a = b
H: Funext σ: Signature C: Carriers σ u: Symbol σ a, b: foralli : Arity (σ u), CarriersTermAlgebra C (sorts_dom (σ u) i) p: ops_term_algebra C u a = ops_term_algebra C u b
a = b
H: Funext σ: Signature C: Carriers σ u: Symbol σ a, b: foralli : Arity (σ u), CarriersTermAlgebra C (sorts_dom (σ u) i) p: ExtendPathTermAlgebra (ops_term_algebra C u a) (ops_term_algebra C u b)
a = b
H: Funext σ: Signature C: Carriers σ u: Symbol σ a, b: foralli : Arity (σ u), CarriersTermAlgebra C (sorts_dom (σ u) i) p1: u = u p2: foralli : Arity (σ u),
ExtendDRelTermAlgebra (funs : Sort σ => paths) (a i)
(b (transport (funv : Symbol σ => Arity (σ v)) p1 i))
a = b
H: Funext σ: Signature C: Carriers σ u: Symbol σ a, b: foralli : Arity (σ u), CarriersTermAlgebra C (sorts_dom (σ u) i) p2: foralli : Arity (σ u),
ExtendDRelTermAlgebra (funs : Sort σ => paths) (a i)
(b (transport (funv : Symbol σ => Arity (σ v)) 1 i))
OpsCompatible (TermAlgebra C) (@ExtendRelTermAlgebra σ C R)
H: Funext σ: Signature C: Carriers σ H0: foralls : Sort σ, IsHSet (C s) R: foralls : Sort σ, Relation (C s) H1: foralls : Sort σ, EquivRel (R s) H2: forall (s : Sort σ) (xy : C s), IsHProp (R s x y) u: Symbol σ a, b: foralli : Arity (σ u), TermAlgebra C (sorts_dom (σ u) i) c: foralli : Arity (σ u), ExtendRelTermAlgebra R (a i) (b i)
ExtendRelTermAlgebra R (u.#(TermAlgebra C) a) (u.#(TermAlgebra C) b)
H: Funext σ: Signature C: Carriers σ H0: foralls : Sort σ, IsHSet (C s) R: foralls : Sort σ, Relation (C s) H1: foralls : Sort σ, EquivRel (R s) H2: forall (s : Sort σ) (xy : C s), IsHProp (R s x y) u: Symbol σ a, b: foralli : Arity (σ u), TermAlgebra C (sorts_dom (σ u) i) c: foralli : Arity (σ u), ExtendRelTermAlgebra R (a i) (b i)
foralli : Arity (σ u),
ExtendDRelTermAlgebra R (a i)
(b (transport (funv : Symbol σ => Arity (σ v)) 1 i))
H: Funext σ: Signature C: Carriers σ H0: foralls : Sort σ, IsHSet (C s) R: foralls : Sort σ, Relation (C s) H1: foralls : Sort σ, EquivRel (R s) H2: forall (s : Sort σ) (xy : C s), IsHProp (R s x y) u: Symbol σ a, b: foralli0 : Arity (σ u), TermAlgebra C (sorts_dom (σ u) i0) c: foralli0 : Arity (σ u), ExtendRelTermAlgebra R (a i0) (b i0) i: Arity (σ u)
ExtendDRelTermAlgebra R (a i)
(b (transport (funv : Symbol σ => Arity (σ v)) 1 i))
apply c.Defined.(** Given and family of functions [f : forall s, C s -> A s], we can extend it to a [TermAlgebra C $-> A], as shown in the next section. *)Sectionhom_term_algebra.Context
`{Funext} {σ} {C : Carriers σ} `{!foralls, IsHSet (C s)}
(A : Algebra σ) (f : foralls, C s -> A s).Definitionmap_term_algebra {σ} {C : Carriers σ} (A : Algebra σ)
(f : foralls, C s -> A s) (s : Sort σ) (T : CarriersTermAlgebra C s)
: A s
:= CarriersTermAlgebra_rec C A f (funu_r => u.#A r) s T.
H: Funext σ: Signature C: Carriers σ H0: foralls : Sort σ, IsHSet (C s) A: Algebra σ f: foralls : Sort σ, C s -> A s
IsHomomorphism (map_term_algebra A f)
H: Funext σ: Signature C: Carriers σ H0: foralls : Sort σ, IsHSet (C s) A: Algebra σ f: foralls : Sort σ, C s -> A s
IsHomomorphism (map_term_algebra A f)
H: Funext σ: Signature C: Carriers σ H0: foralls : Sort σ, IsHSet (C s) A: Algebra σ f: foralls : Sort σ, C s -> A s u: Symbol σ a: foralli : Arity (σ u), TermAlgebra C (sorts_dom (σ u) i)
map_term_algebra A f (sort_cod (σ u)) (u.#(TermAlgebra C) a) =
u.#A (funi : Arity (σ u) => map_term_algebra A f (sorts_dom (σ u) i) (a i))
byrefine (ap u.#A _).Qed.Definitionhom_term_algebra : TermAlgebra C $-> A
:= @Build_Homomorphism σ (TermAlgebra C) A (map_term_algebra A f) _.Endhom_term_algebra.(** The next section proves the universal property of the term algebra, that [TermAlgebra] is a left adjoint functor<< {C : Carriers σ | forall s, IsHSet (C s)} -> Algebra σ,>> with right adjoint the forgetful functor. This is stated below as an equivalence<< Homomorphism (TermAlgebra C) A <~> (forall s, C s -> A s),>> given by precomposition with<< var_term_algebra C s : C s -> TermAlgebra C s.>>*)Sectionump_term_algebra.Context
`{Funext} {σ} (C : Carriers σ) `{foralls, IsHSet (C s)} (A : Algebra σ).(** By precomposing [Homomorphism (TermAlgebra C) A] with [var_term_algebra], we obtain a family [forall s, C s -> A s]. *)Definitionprecomp_var_term_algebra (f : TermAlgebra C $-> A)
: foralls, C s -> A s
:= funsx => f s (var_term_algebra C s x).
hom_term_algebra A (precomp_var_term_algebra x) = x
apply path_precomp_var_term_algebra_to_hom_term_algebra.Defined.(** The universal property of the term algebra: The [TermAlgebra] is a left adjoint functor. Notice [isequiv_precomp_var_term_algebra] above. *)