This section presents the Terms.Operations module of the Agda Universal Algebra Library.
Here we define term operations which are simply terms interpreted in a particular algebra, and we prove some compatibility properties of term operations.
{-# OPTIONS --without-K --exact-split --safe #-} open import Algebras.Signatures using (Signature; ๐; ๐ฅ) module Terms.Operations {๐ : Signature ๐ ๐ฅ} where open import Terms.Basic{๐ = ๐} renaming (generator to โ) public
Notation. In the line above, we renamed for notational convenience the generator
constructor of the Term
type, so from now on we use โ
in place of generator
.
When we interpret a term in an algebra we call the resulting function a term operation. Given a term ๐
and an algebra ๐จ
, we denote by ๐ ฬ ๐จ
the interpretation of ๐
in ๐จ
. This is defined inductively as follows.
If ๐
is a variable symbol x : X
and if ๐ : X โ โฃ ๐จ โฃ
is a tuple of elements of โฃ ๐จ โฃ
, then (๐ ฬ ๐จ) ๐ := ๐ x
.
If ๐ = ๐ ๐ก
, where ๐ : โฃ ๐ โฃ
is an operation symbol, if ๐ก : โฅ ๐ โฅ ๐ โ ๐ป X
is a tuple of terms, and if ๐ : X โ โฃ ๐จ โฃ
is a tuple from ๐จ
, then we define (๐ ฬ ๐จ) ๐ = (๐ ๐ก ฬ ๐จ) ๐ := (๐ ฬ ๐จ) (ฮป i โ (๐ก i ฬ ๐จ) ๐)
.
Thus the interpretation of a term is defined by induction on the structure of the term, and the definition is formally implemented in the UALib as follows.
module _ {๐ค ๐ง : Universe}{X : ๐ง ฬ } where -- new notation _โฆ_โง : (๐จ : Algebra ๐ค ๐) โ Term X โ (X โ โฃ ๐จ โฃ) โ โฃ ๐จ โฃ ๐จ โฆ โ x โง = ฮป ฮท โ ฮท x ๐จ โฆ node ๐ ๐ก โง = ฮป ฮท โ (๐ ฬ ๐จ) (ฮป i โ (๐จ โฆ ๐ก i โง) ฮท) -- old notation: _ฬ_ : Term X โ (๐จ : Algebra ๐ค ๐) โ (X โ โฃ ๐จ โฃ) โ โฃ ๐จ โฃ (โ x ฬ ๐จ) ๐ = ๐ x (node ๐ ๐ก ฬ ๐จ) ๐ = (๐ ฬ ๐จ) ฮป i โ (๐ก i ฬ ๐จ) ๐
It turns out that the intepretation of a term is the same as the free-lift
(modulo argument order and assuming function extensionality).
free-lift-interp : dfunext ๐ฅ ๐ค โ (๐จ : Algebra ๐ค ๐)(ฮท : X โ โฃ ๐จ โฃ)(p : Term X) โ (๐จ โฆ p โง) ฮท โก (free-lift ๐จ ฮท) p free-lift-interp _ ๐จ ฮท (โ x) = refl free-lift-interp fe ๐จ ฮท (node ๐ ๐ก) = ap (๐ ฬ ๐จ) (fe ฮป i โ free-lift-interp fe ๐จ ฮท (๐ก i)) -- old version free-lift-interp' : dfunext ๐ฅ ๐ค โ (๐จ : Algebra ๐ค ๐)(h : X โ โฃ ๐จ โฃ)(p : Term X) โ (p ฬ ๐จ) h โก (free-lift ๐จ h) p free-lift-interp' _ ๐จ h (โ x) = refl free-lift-interp' fe ๐จ h (node ๐ ๐ก) = ap (๐ ฬ ๐จ) (fe ฮป i โ free-lift-interp' fe ๐จ h (๐ก i))
If the algebra ๐จ happens to be ๐ป X
, then we expect that โ ๐
we have (p ฬ ๐ป X) ๐ โก p ๐
. But what is (๐ ฬ ๐ป X) ๐
exactly? By definition, it depends on the form of ๐ as follows:
if ๐ = โ x
, then (๐ ฬ ๐ป X) ๐ := (โ x ฬ ๐ป X) ๐ โก ๐ x
if ๐ = node ๐ ๐ก
, then (๐ ฬ ๐ป X) ๐ := (node ๐ ๐ก ฬ ๐ป X) ๐ = (๐ ฬ ๐ป X) ฮป i โ (๐ก i ฬ ๐ป X) ๐
Now, assume ฯ : hom ๐ป ๐จ
. Then by comm-hom-term
, we have โฃ ฯ โฃ (p ฬ ๐ป X) ๐ = (p ฬ ๐จ) โฃ ฯ โฃ โ ๐
.
if p = โ x
(and ๐ก : X โ โฃ ๐ป X โฃ
), then
โฃ ฯ โฃ p โก โฃ ฯ โฃ (โ x) โก โฃ ฯ โฃ (ฮป ๐ก โ h ๐ก) โก ฮป ๐ก โ (โฃ ฯ โฃ โ ๐ก) x
if p = node ๐ ๐ก
, then
โฃ ฯ โฃ p โก โฃ ฯ โฃ (p ฬ ๐ป X) ๐ = (node ๐ ๐ก ฬ ๐ป X) ๐ = (๐ ฬ ๐ป X) ฮป i โ (๐ก i ฬ ๐ป X) ๐
We claim that for all p : Term X
there exists q : Term X
and ๐ฑ : X โ โฃ ๐ป X โฃ
such that p โก (q ฬ ๐ป X) ๐ฑ
. We prove this fact as follows.
term-interp : {๐ง : Universe}{X : ๐ง ฬ} (๐ : โฃ ๐ โฃ){๐ ๐ก : โฅ ๐ โฅ ๐ โ Term X} โ ๐ โก ๐ก โ node ๐ ๐ โก (๐ ฬ ๐ป X) ๐ก term-interp ๐ {๐ }{๐ก} st = ap (node ๐) st module _ {๐ง : Universe}{X : ๐ง ฬ}{fe : dfunext ๐ฅ (ov ๐ง)} where term-gen : (p : โฃ ๐ป X โฃ) โ ฮฃ q ๊ โฃ ๐ป X โฃ , p โก (๐ป X โฆ q โง) โ term-gen (โ x) = (โ x) , refl term-gen (node ๐ ๐ก) = node ๐ (ฮป i โ โฃ term-gen (๐ก i) โฃ) , term-interp ๐ (fe ฮป i โ โฅ term-gen (๐ก i) โฅ) term-gen-agreement : (p : โฃ ๐ป X โฃ) โ (๐ป X โฆ p โง) โ โก (๐ป X โฆ โฃ term-gen p โฃ โง) โ term-gen-agreement (โ x) = refl term-gen-agreement (node f ๐ก) = ap (f ฬ ๐ป X) (fe ฮป x โ term-gen-agreement (๐ก x)) term-agreement : (p : โฃ ๐ป X โฃ) โ p โก (๐ป X โฆ p โง) โ term-agreement p = snd (term-gen p) โ (term-gen-agreement p)โปยน -- old version: term-gen' : (p : โฃ ๐ป X โฃ) โ ฮฃ q ๊ โฃ ๐ป X โฃ , p โก (q ฬ ๐ป X) โ term-gen' (โ x) = (โ x) , refl term-gen' (node ๐ ๐ก) = node ๐ (ฮป i โ โฃ term-gen' (๐ก i) โฃ) , term-interp ๐ (fe ฮป i โ โฅ term-gen' (๐ก i) โฅ) term-gen-agreement' : (p : โฃ ๐ป X โฃ) โ (p ฬ ๐ป X) โ โก (โฃ term-gen' p โฃ ฬ ๐ป X) โ term-gen-agreement' (โ x) = refl term-gen-agreement' (node f ๐ก) = ap (f ฬ ๐ป X) (fe ฮป x โ term-gen-agreement' (๐ก x)) term-agreement' : (p : โฃ ๐ป X โฃ) โ p โก (p ฬ ๐ป X) โ term-agreement' p = snd (term-gen' p) โ (term-gen-agreement' p)โปยน
module _ {๐ค ๐ฆ ๐ง : Universe}{X : ๐ง ฬ }{I : ๐ฆ ฬ} where interp-prod : dfunext ๐ฅ (๐ค โ ๐ฆ) โ (p : Term X)(๐ : I โ Algebra ๐ค ๐)(๐ : X โ โ i โ โฃ ๐ i โฃ) โ (โจ ๐ โฆ p โง) ๐ โก ฮป i โ (๐ i โฆ p โง) (ฮป j โ ๐ j i) interp-prod _ (โ xโ) ๐ ๐ = refl interp-prod fe (node ๐ ๐ก) ๐ ๐ = let IH = ฮป x โ interp-prod fe (๐ก x) ๐ ๐ in (๐ ฬ โจ ๐) (ฮป x โ (โจ ๐ โฆ ๐ก x โง) ๐) โกโจ ap (๐ ฬ โจ ๐)(fe IH) โฉ (๐ ฬ โจ ๐)(ฮป x โ ฮป i โ (๐ i โฆ ๐ก x โง) ฮป j โ ๐ j i) โกโจ refl โฉ (ฮป i โ (๐ ฬ ๐ i) (ฮป x โ (๐ i โฆ ๐ก x โง) ฮป j โ ๐ j i)) โ -- inferred type: ๐ก : X โ โฃ โจ ๐ โฃ interp-prod2 : dfunext (๐ค โ ๐ฆ โ ๐ง) (๐ค โ ๐ฆ) โ dfunext ๐ฅ (๐ค โ ๐ฆ) โ (p : Term X)(๐ : I โ Algebra ๐ค ๐) โ โจ ๐ โฆ p โง โก (ฮป ๐ก โ (ฮป i โ (๐ i โฆ p โง) ฮป x โ ๐ก x i)) interp-prod2 _ _ (โ xโ) ๐ = refl interp-prod2 fe fev (node f t) ๐ = fe ฮป (tup : X โ โฃ โจ ๐ โฃ) โ let IH = ฮป x โ interp-prod fev (t x) ๐ in let tA = ฮป z โ โจ ๐ โฆ t z โง in (f ฬ โจ ๐)(ฮป s โ tA s tup) โกโจ ap(f ฬ โจ ๐)(fev ฮป x โ IH x tup)โฉ (f ฬ โจ ๐)(ฮป s โ ฮป j โ (๐ j โฆ t s โง) (ฮป โ โ tup โ j)) โกโจ refl โฉ (ฮป i โ (f ฬ ๐ i)(ฮป s โ (๐ i โฆ t s โง) (ฮป โ โ tup โ i))) โ module _ {๐ค ๐ง : Universe}{X : ๐ง ฬ } where interp-prod' : {๐ฆ : Universe} โ dfunext ๐ฅ (๐ค โ ๐ฆ) โ (p : Term X){I : ๐ฆ ฬ} (๐ : I โ Algebra ๐ค ๐)(๐ : X โ โ i โ โฃ ๐ i โฃ) --------------------------------------------------- โ (p ฬ (โจ ๐)) ๐ โก (ฮป i โ (p ฬ ๐ i) (ฮป j โ ๐ j i)) interp-prod' _ (โ xโ) ๐ ๐ = refl interp-prod' fe (node ๐ ๐ก) ๐ ๐ = let IH = ฮป x โ interp-prod' fe (๐ก x) ๐ ๐ in (๐ ฬ โจ ๐)(ฮป x โ (๐ก x ฬ โจ ๐) ๐) โกโจ ap (๐ ฬ โจ ๐)(fe IH) โฉ (๐ ฬ โจ ๐)(ฮป x โ (ฮป i โ (๐ก x ฬ ๐ i)(ฮป j โ ๐ j i))) โกโจ refl โฉ (ฮป i โ (๐ ฬ ๐ i) (ฮป x โ (๐ก x ฬ ๐ i)(ฮป j โ ๐ j i))) โ interp-prod2' : dfunext (๐ค โ ๐ง) ๐ค โ dfunext ๐ฅ ๐ค โ (p : Term X){I : ๐ค ฬ }(๐ : I โ Algebra ๐ค ๐) ------------------------------------------------------------------ โ (p ฬ โจ ๐) โก ฮป(๐ก : X โ โฃ โจ ๐ โฃ) โ (ฮป i โ (p ฬ ๐ i)(ฮป x โ ๐ก x i)) interp-prod2' _ _ (โ xโ) ๐ = refl interp-prod2' fe fev (node f t) ๐ = fe ฮป (tup : X โ โฃ โจ ๐ โฃ) โ let IH = ฮป x โ interp-prod' fev (t x) ๐ in let tA = ฮป z โ t z ฬ โจ ๐ in (f ฬ โจ ๐)(ฮป s โ tA s tup) โกโจ ap(f ฬ โจ ๐)(fev ฮป x โ IH x tup)โฉ (f ฬ โจ ๐)(ฮป s โ ฮป j โ (t s ฬ ๐ j)(ฮป โ โ tup โ j)) โกโจ refl โฉ (ฮป i โ (f ฬ ๐ i)(ฮป s โ (t s ฬ ๐ i)(ฮป โ โ tup โ i))) โ
We now prove two important facts about term operations. The first of these, which is used very often in the sequel, asserts that every term commutes with every homomorphism.
module _ {๐ค ๐ฆ ๐ง : Universe}{X : ๐ง ฬ} where comm-hom-term : dfunext ๐ฅ ๐ฆ โ {๐จ : Algebra ๐ค ๐} (๐ฉ : Algebra ๐ฆ ๐) (h : hom ๐จ ๐ฉ) (t : Term X) (a : X โ โฃ ๐จ โฃ) ----------------------------------------- โ โฃ h โฃ ((๐จ โฆ t โง) a) โก (๐ฉ โฆ t โง) (โฃ h โฃ โ a) comm-hom-term _ ๐ฉ h (โ x) a = refl comm-hom-term fe {๐จ} ๐ฉ h (node ๐ ๐ก) a = โฃ h โฃ((๐ ฬ ๐จ) ฮป i โ (๐จ โฆ ๐ก i โง) a) โกโจ i โฉ (๐ ฬ ๐ฉ)(ฮป i โ โฃ h โฃ ((๐จ โฆ ๐ก i โง) a)) โกโจ ii โฉ (๐ ฬ ๐ฉ)(ฮป r โ (๐ฉ โฆ ๐ก r โง) (โฃ h โฃ โ a)) โ where i = โฅ h โฅ ๐ ฮป r โ (๐จ โฆ ๐ก r โง) a ii = ap (๐ ฬ ๐ฉ)(fe (ฮป i โ comm-hom-term fe ๐ฉ h (๐ก i) a)) comm-hom-term' : dfunext ๐ฅ ๐ฆ โ {๐จ : Algebra ๐ค ๐} (๐ฉ : Algebra ๐ฆ ๐) (h : hom ๐จ ๐ฉ) (t : Term X) (a : X โ โฃ ๐จ โฃ) ----------------------------------------- โ โฃ h โฃ ((๐จ โฆ t โง) a) โก (๐ฉ โฆ t โง) (โฃ h โฃ โ a) comm-hom-term' _ ๐ฉ h (โ x) a = refl comm-hom-term' fe {๐จ} ๐ฉ h (node ๐ ๐ก) a = โฃ h โฃ ((๐ ฬ ๐จ)ฮป i โ (๐จ โฆ ๐ก i โง) a) โกโจ i โฉ (๐ ฬ ๐ฉ)(ฮป i โ โฃ h โฃ ((๐จ โฆ ๐ก i โง) a)) โกโจ ii โฉ (๐ ฬ ๐ฉ)(ฮป r โ (๐ฉ โฆ ๐ก r โง) (โฃ h โฃ โ a)) โ where i = โฅ h โฅ ๐ ฮป r โ (๐จ โฆ ๐ก r โง) a ii = ap (๐ ฬ ๐ฉ)(fe (ฮป i โ comm-hom-term' fe ๐ฉ h (๐ก i) a))
To conclude this module, we prove that every term is compatible with every congruence relation. That is, if t : Term X
and ฮธ : Con ๐จ
, then a ฮธ b โ t(a) ฮธ t(b)
. (Recall, the compatibility relation |:
was defined in Relations.Discrete.)
module _ {๐ฆ ๐ค : Universe}{X : ๐ค ฬ} where open IsCongruence _โฃ:_ : {๐จ : Algebra ๐ค ๐}(t : Term X)(ฮธ : Con{๐ฆ} ๐จ) ----------------------------------------- โ (๐จ โฆ t โง) |: โฃ ฮธ โฃ ((โ x) โฃ: ฮธ) p = p x ((node ๐ ๐ก) โฃ: ฮธ) p = (is-compatible โฅ ฮธ โฅ) ๐ ฮป x โ ((๐ก x) โฃ: ฮธ) p
For the sake of comparison, here is the analogous theorem using compatible-fun
.
compatible-term : {๐จ : Algebra ๐ค ๐}(t : Term X)(ฮธ : Con{๐ฆ} ๐จ) ----------------------------------------- โ compatible-fun (๐จ โฆ t โง) โฃ ฮธ โฃ compatible-term (โ x) ฮธ p = ฮป y z โ z x compatible-term (node ๐ ๐ก) ฮธ u v p = (is-compatible โฅ ฮธ โฅ) ๐ ฮป x โ ((compatible-term (๐ก x) ฮธ) u v) p compatible-term' : {๐จ : Algebra ๐ค ๐}(t : Term X)(ฮธ : Con{๐ฆ} ๐จ) ----------------------------------------- โ compatible-fun (t ฬ ๐จ) โฃ ฮธ โฃ compatible-term' (โ x) ฮธ p = ฮป y z โ z x compatible-term' (node ๐ ๐ก) ฮธ u v p = (is-compatible โฅ ฮธ โฅ) ๐ ฮป x โ ((compatible-term' (๐ก x) ฮธ) u v) p
1We plan to resolve this before the next major release of the Agda UALib.