Built with Alectryon, running Coq+SerAPI v8.19.0+0.19.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.
(** 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 σ | forall s, 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. *)
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
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)
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 σ, Reflexive (R s) u: Symbol σ c: foralli : Arity (σ u),
CarriersTermAlgebra C (sorts_dom (σ u) i) h: foralli : Arity (σ u),
ExtendRelTermAlgebra R (c i) (c i) i: Arity (σ u)
ExtendDRelTermAlgebra R (c i)
(c (transport (funv : Symbol σ => Arity (σ v)) 1 i))
apply h.Qed.
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 σ, Symmetric (R s) s1, s2: Sort σ S: CarriersTermAlgebra C s1 T: CarriersTermAlgebra C s2 h: ExtendDRelTermAlgebra R S T
ExtendDRelTermAlgebra R T S
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 σ, Symmetric (R s) s1, s2: Sort σ S: CarriersTermAlgebra C s1 T: CarriersTermAlgebra C s2 h: ExtendDRelTermAlgebra R S T
ExtendDRelTermAlgebra R T S
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 σ, Symmetric (R s) s1: Sort σ S: CarriersTermAlgebra C s1
forall (s2 : Sort σ) (T : CarriersTermAlgebra C s2),
ExtendDRelTermAlgebra R S T ->
ExtendDRelTermAlgebra R T S
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 σ, Symmetric (R s) s: Sort σ c: C s s2, s0: Sort σ c0: C s0 p: ExtendDRelTermAlgebra R (var_term_algebra C s c)
(var_term_algebra C s0 c0)
ExtendDRelTermAlgebra R (var_term_algebra C s0 c0)
(var_term_algebra C s c)
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 σ, Symmetric (R s) s: Sort σ c: C s s2: Sort σ u: Symbol σ c0: foralli : Arity (σ u),
CarriersTermAlgebra C (sorts_dom (σ u) i) p: ExtendDRelTermAlgebra R (var_term_algebra C s c)
(ops_term_algebra C u c0)
ExtendDRelTermAlgebra R (ops_term_algebra C u c0)
(var_term_algebra C s c)
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 σ, Symmetric (R s) u: Symbol σ c: foralli : Arity (σ u),
CarriersTermAlgebra C (sorts_dom (σ u) i) h: forall (i : Arity (σ u)) (s2 : Sort σ)
(T : CarriersTermAlgebra C s2),
ExtendDRelTermAlgebra R (c i) T ->
ExtendDRelTermAlgebra R T (c i) s2, s: Sort σ c0: C s p: ExtendDRelTermAlgebra R (ops_term_algebra C u c)
(var_term_algebra C s c0)
ExtendDRelTermAlgebra R (var_term_algebra C s c0)
(ops_term_algebra C u c)
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 σ, Symmetric (R s) u: Symbol σ c: foralli : Arity (σ u),
CarriersTermAlgebra C (sorts_dom (σ u) i) h: forall (i : Arity (σ u)) (s2 : Sort σ)
(T : CarriersTermAlgebra C s2),
ExtendDRelTermAlgebra R (c i) T ->
ExtendDRelTermAlgebra R T (c i) s2: Sort σ u0: Symbol σ c0: foralli : Arity (σ u0),
CarriersTermAlgebra C (sorts_dom (σ u0) i) p: ExtendDRelTermAlgebra R (ops_term_algebra C u c)
(ops_term_algebra C u0 c0)
ExtendDRelTermAlgebra R (ops_term_algebra C u0 c0)
(ops_term_algebra C u c)
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 σ, Symmetric (R s) s: Sort σ c: C s s2, s0: Sort σ c0: C s0 p: ExtendDRelTermAlgebra R (var_term_algebra C s c)
(var_term_algebra C s0 c0)
ExtendDRelTermAlgebra R (var_term_algebra C s0 c0)
(var_term_algebra C s c)
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 σ, Symmetric (R s) s: Sort σ c: C s s2, s0: Sort σ c0: C s0 p1: s = s0 p2: R s0 (transport C p1 c) c0
ExtendDRelTermAlgebra R (var_term_algebra C s0 c0)
(var_term_algebra C s c)
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 σ, Symmetric (R s) s: Sort σ c: C s s2: Sort σ c0: C s p2: R s (transport C 1 c) c0
ExtendDRelTermAlgebra R (var_term_algebra C s c0)
(var_term_algebra C s c)
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 σ, Symmetric (R s) s: Sort σ c: C s s2: Sort σ c0: C s p2: R s (transport C 1 c) c0
R s (transport C 1 c0) c
bysymmetry.
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 σ, Symmetric (R s) s: Sort σ c: C s s2: Sort σ u: Symbol σ c0: foralli : Arity (σ u),
CarriersTermAlgebra C (sorts_dom (σ u) i) p: ExtendDRelTermAlgebra R (var_term_algebra C s c)
(ops_term_algebra C u c0)
ExtendDRelTermAlgebra R (ops_term_algebra C u c0)
(var_term_algebra C s c)
elim p.
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 σ, Symmetric (R s) u: Symbol σ c: foralli : Arity (σ u),
CarriersTermAlgebra C (sorts_dom (σ u) i) h: forall (i : Arity (σ u)) (s2 : Sort σ)
(T : CarriersTermAlgebra C s2),
ExtendDRelTermAlgebra R (c i) T ->
ExtendDRelTermAlgebra R T (c i) s2, s: Sort σ c0: C s p: ExtendDRelTermAlgebra R (ops_term_algebra C u c)
(var_term_algebra C s c0)
ExtendDRelTermAlgebra R (var_term_algebra C s c0)
(ops_term_algebra C u c)
elim p.
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 σ, Symmetric (R s) u: Symbol σ c: foralli : Arity (σ u),
CarriersTermAlgebra C (sorts_dom (σ u) i) h: forall (i : Arity (σ u)) (s2 : Sort σ)
(T : CarriersTermAlgebra C s2),
ExtendDRelTermAlgebra R (c i) T ->
ExtendDRelTermAlgebra R T (c i) s2: Sort σ u0: Symbol σ c0: foralli : Arity (σ u0),
CarriersTermAlgebra C (sorts_dom (σ u0) i) p: ExtendDRelTermAlgebra R (ops_term_algebra C u c)
(ops_term_algebra C u0 c0)
ExtendDRelTermAlgebra R (ops_term_algebra C u0 c0)
(ops_term_algebra C u c)
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 σ, Symmetric (R s) u: Symbol σ c: foralli : Arity (σ u),
CarriersTermAlgebra C (sorts_dom (σ u) i) h: forall (i : Arity (σ u)) (s2 : Sort σ)
(T : CarriersTermAlgebra C s2),
ExtendDRelTermAlgebra R (c i) T ->
ExtendDRelTermAlgebra R T (c i) s2: Sort σ u0: Symbol σ c0: foralli : Arity (σ u0),
CarriersTermAlgebra C (sorts_dom (σ u0) i) p: u = u0 f: foralli : Arity (σ u),
ExtendDRelTermAlgebra R (c i)
(c0
(transport (funv : Symbol σ => Arity (σ v))
p i))
ExtendDRelTermAlgebra R (ops_term_algebra C u0 c0)
(ops_term_algebra C u c)
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 σ, Symmetric (R s) u: Symbol σ c: foralli : Arity (σ u),
CarriersTermAlgebra C (sorts_dom (σ u) i) h: forall (i : Arity (σ u)) (s2 : Sort σ)
(T : CarriersTermAlgebra C s2),
ExtendDRelTermAlgebra R (c i) T ->
ExtendDRelTermAlgebra R T (c i) s2: Sort σ c0: foralli : Arity (σ u),
CarriersTermAlgebra C (sorts_dom (σ u) i) f: foralli : Arity (σ u),
ExtendDRelTermAlgebra R (c i)
(c0
(transport (funv : Symbol σ => Arity (σ v))
1 i))
ExtendDRelTermAlgebra R (ops_term_algebra C u c0)
(ops_term_algebra C u c)
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 σ, Symmetric (R s) u: Symbol σ c: foralli : Arity (σ u),
CarriersTermAlgebra C (sorts_dom (σ u) i) h: forall (i : Arity (σ u)) (s2 : Sort σ)
(T : CarriersTermAlgebra C s2),
ExtendDRelTermAlgebra R (c i) T ->
ExtendDRelTermAlgebra R T (c i) s2: Sort σ c0: foralli : Arity (σ u),
CarriersTermAlgebra C (sorts_dom (σ u) i) f: foralli : Arity (σ u),
ExtendDRelTermAlgebra R (c i)
(c0
(transport (funv : Symbol σ => Arity (σ v))
1 i))
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 σ, Symmetric (R s) s: Sort σ S, T: CarriersTermAlgebra C s
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: foralls : Sort σ, Relation (C s) H0: forall (s : Sort σ) (xy : C s),
IsHProp (R s x y) H1: foralls : Sort σ, Transitive (R s) 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)) (s2 : Sort σ)
(T : CarriersTermAlgebra C s2),
ExtendDRelTermAlgebra R (c i) T ->
forall (s3 : Sort σ)
(U : CarriersTermAlgebra C s3),
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) 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) 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: foralls : Sort σ, Relation (C s) H0: forall (s : Sort σ) (xy : C s),
IsHProp (R s x y) H1: foralls : Sort σ, Transitive (R s) 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: foralls : Sort σ, Relation (C s) H0: forall (s : Sort σ) (xy : C s),
IsHProp (R s x y) H1: foralls : Sort σ, Transitive (R s) 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)) (s2 : Sort σ)
(T : CarriersTermAlgebra C s2),
ExtendDRelTermAlgebra R (c i) T ->
forall (s3 : Sort σ)
(U : CarriersTermAlgebra C s3),
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)) (s2 : Sort σ)
(T : CarriersTermAlgebra C s2),
ExtendDRelTermAlgebra R (c i) T ->
forall (s3 : Sort σ)
(U : CarriersTermAlgebra C s3),
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: foralls : Sort σ, IsHSet (C s) s: Sort σ c: C s s2, s0: Sort σ d: C s0 p: s = s0 e: transport C p c = d
{p : s = s0 &
transport (CarriersTermAlgebra C) p
(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)) (s2 : Sort σ)
(T : CarriersTermAlgebra C s2),
ExtendDRelTermAlgebra (funs : Sort σ => paths)
(c i) T ->
{p : sorts_dom (σ u) i = s2 &
transport (CarriersTermAlgebra C) p (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))
{p : sort_cod (σ u) = sort_cod (σ u0) &
transport (CarriersTermAlgebra C) p
(ops_term_algebra C u c) = ops_term_algebra C u0 d}
H: Funext σ: Signature C: Carriers σ H0: foralls : Sort σ, IsHSet (C s) s: Sort σ c: C s s2, s0: Sort σ d: C s0 p: s = s0 e: transport C p c = d
{p : s = s0 &
transport (CarriersTermAlgebra C) p
(var_term_algebra C s c) = var_term_algebra C s0 d}
H: Funext σ: Signature C: Carriers σ H0: foralls : Sort σ, IsHSet (C s) 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)) (s2 : Sort σ)
(T : CarriersTermAlgebra C s2),
ExtendDRelTermAlgebra (funs : Sort σ => paths)
(c i) T ->
{p : sorts_dom (σ u) i = s2 &
transport (CarriersTermAlgebra C) p (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))
{p : sort_cod (σ u) = sort_cod (σ u0) &
transport (CarriersTermAlgebra C) p
(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)) (s2 : Sort σ)
(T : CarriersTermAlgebra C s2),
ExtendDRelTermAlgebra (funs : Sort σ => paths)
(c i) T ->
{p : sorts_dom (σ u) i = s2 &
transport (CarriersTermAlgebra C) p (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: foralls : Sort σ, IsHSet (C s) s: Sort σ S, T: CarriersTermAlgebra C s e: ExtendPathTermAlgebra S T
S = T
H: Funext σ: Signature C: Carriers σ H0: foralls : Sort σ, IsHSet (C s) s: Sort σ S, T: CarriersTermAlgebra C s e: ExtendPathTermAlgebra S T
S = T
H: Funext σ: Signature C: Carriers σ H0: foralls : Sort σ, IsHSet (C s) 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: foralli : Arity (σ u),
TermAlgebra C (sorts_dom (σ u) i) c: foralli : Arity (σ u),
ExtendRelTermAlgebra R (a i) (b i) 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).
(fix F
(s : Sort σ) (c : CarriersTermAlgebra C s) {struct
c} : A s :=
match
c in (CarriersTermAlgebra _ s0) return (A s0)
with
| @var_term_algebra _ _ s0 y =>
precomp_var_term_algebra f s0 y
| @ops_term_algebra _ _ u c0 =>
u.#A
(funi : Arity (σ u) =>
F (sorts_dom (σ u) i) (c0 i))
end) (sorts_dom (σ u) i) (c i) =
f (sorts_dom (σ u) i) (c i)
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. *)