---
layout: default
title : "Legacy.Base.Varieties.Closure  module (The Agda Universal Algebra Library)"
date : "2021-01-14"
author: "agda-algebras development team"
---

### <a id="closure-operators">Closure Operators</a>

Fix a signature `𝑆`, let `𝒦` be a class of `𝑆`-algebras, and define

* `H 𝒦` = algebras isomorphic to a homomorphic image of a member of `𝒦`;
* `S 𝒦` = algebras isomorphic to a subalgebra of a member of `𝒦`;
* `P 𝒦` = algebras isomorphic to a product of members of `𝒦`.

A straight-forward verification confirms that `H`, `S`, and `P` are *closure operators* (expansive, monotone, and idempotent).  A class `𝒦` of `𝑆`-algebras is said to be *closed under the taking of homomorphic images* provided `H 𝒦 βŠ† 𝒦`. Similarly, `𝒦` is *closed under the taking of subalgebras* (resp., *arbitrary products*) provided `S 𝒦 βŠ† 𝒦` (resp., `P 𝒦 βŠ† 𝒦`). The operators `H`, `S`, and `P` can be composed with one another repeatedly, forming yet more closure operators.

An algebra is a homomorphic image (resp., subalgebra; resp., product) of every algebra to which it is isomorphic. Thus, the class `H 𝒦` (resp., `S 𝒦`; resp., `P 𝒦`) is closed under isomorphism.

A *variety* is a class of algebras, in the same signature, that is closed under the taking of homomorphic images, subalgebras, and arbitrary products.  To represent varieties we define inductive types for the closure operators `H`, `S`, and `P` that are composable.  Separately, we define an inductive type `V` which simultaneously represents closure under all three operators, `H`, `S`, and `P`.



```agda


{-# OPTIONS --cubical-compatible --exact-split --safe #-}

open import Overture using ( π“ž ; π“₯ ; Signature )

module Legacy.Base.Varieties.Closure {𝑆 : Signature π“ž π“₯} where

-- Imports from Agda and the Agda Standard Library ---------------------------------------
open import Agda.Primitive  using () renaming ( Set to Type )
open import Level           using ( Level ;  Lift ; _βŠ”_ ; suc )
open import Relation.Unary  using ( Pred ; _∈_ ; _βŠ†_ )
open import Data.Product    using ( _,_ ; Ξ£-syntax )
                            renaming ( proj₁ to fst ; projβ‚‚ to snd )

open  import Axiom.Extensionality.Propositional
      using () renaming ( Extensionality to funext )

-- Imports from the Agda Universal Algebra Library ---------------------------------------
open import Overture               using ( ∣_∣ ; βˆ₯_βˆ₯ )
open import Legacy.Base.Algebras {𝑆 = 𝑆}  using ( Algebra ; Lift-Alg ; ov ; β¨… )

open  import Legacy.Base.Homomorphisms {𝑆 = 𝑆}
      using ( _β‰…_ ; β‰…-sym ; Lift-β‰… ; β‰…-trans ; β‰…-refl ; Lift-Alg-iso ; Lift-Alg-β¨…β‰… )
      using ( Lift-Alg-assoc ; HomImages ; _IsHomImageOf_ ; Lift-Alg-hom-image )

open  import Legacy.Base.Subalgebras {𝑆 = 𝑆}
      using ( _≀_ ; _IsSubalgebraOfClass_ ; Subalgebra ; ≀-refl ; β‰…-RESP-≀ )
      using ( ≀-RESP-β‰… ; ≀-trans ; Lift-≀-Lift )
```


#### <a id="the-inductive-type-h">The Inductive Type H</a>

We define the inductive type `H` to represent classes of algebras that include
all homomorphic images of algebras in the class; i.e., classes that are closed
under the taking of homomorphic images.


```agda


data H{Ξ± Ξ² : Level}(𝒦 : Pred(Algebra Ξ±)(ov Ξ±)) : Pred(Algebra (Ξ± βŠ” Ξ²))(ov(Ξ± βŠ” Ξ²))
 where
 hbase : {𝑨 : Algebra Ξ±} β†’ 𝑨 ∈ 𝒦 β†’ Lift-Alg 𝑨 Ξ² ∈ H 𝒦
 hhimg : {𝑨 𝑩 : Algebra (Ξ± βŠ” Ξ²)} β†’ 𝑨 ∈ H {Ξ±} {Ξ²} 𝒦 β†’ ((𝑩 , _) : HomImages 𝑨) β†’ 𝑩 ∈ H 𝒦
```


#### <a id="the-inductive-type-s">The Inductive Type S</a>

Here we define the inductive type `S` to represent classes of algebras closed under the taking of subalgebras.


```agda


data S {Ξ± Ξ² : Level}(𝒦 : Pred(Algebra Ξ±)(ov Ξ±)) : Pred(Algebra(Ξ± βŠ” Ξ²))(ov(Ξ± βŠ” Ξ²))
 where
 sbase : {𝑨 : Algebra Ξ±} β†’ 𝑨 ∈ 𝒦 β†’ Lift-Alg 𝑨 Ξ² ∈ S 𝒦
 slift : {𝑨 : Algebra Ξ±} β†’ 𝑨 ∈ S{Ξ±}{Ξ±} 𝒦 β†’ Lift-Alg 𝑨 Ξ² ∈ S 𝒦
 ssub  : {𝑨 : Algebra Ξ±}{𝑩 : Algebra _} β†’ 𝑨 ∈ S{Ξ±}{Ξ±} 𝒦 β†’ 𝑩 ≀ 𝑨 β†’ 𝑩 ∈ S 𝒦
 siso  : {𝑨 : Algebra Ξ±}{𝑩 : Algebra _} β†’ 𝑨 ∈ S{Ξ±}{Ξ±} 𝒦 β†’ 𝑨 β‰… 𝑩 β†’ 𝑩 ∈ S 𝒦
```


#### <a id="the-inductive-types-p">The Inductive Type P </a>

Here we define the inductive type `P` to represent classes of algebras closed under the taking of arbitrary products.


```agda


data P {Ξ± Ξ² : Level}(𝒦 : Pred(Algebra Ξ±)(ov Ξ±)) : Pred(Algebra(Ξ± βŠ” Ξ²))(ov(Ξ± βŠ” Ξ²))
 where
 pbase  : {𝑨 : Algebra Ξ±} β†’ 𝑨 ∈ 𝒦 β†’ Lift-Alg 𝑨 Ξ² ∈ P 𝒦
 pliftu : {𝑨 : Algebra Ξ±} β†’ 𝑨 ∈ P{Ξ±}{Ξ±} 𝒦 β†’ Lift-Alg 𝑨 Ξ² ∈ P 𝒦
 pliftw : {𝑨 : Algebra (Ξ± βŠ” Ξ²)} β†’ 𝑨 ∈ P{Ξ±}{Ξ²} 𝒦 β†’ Lift-Alg 𝑨 (Ξ± βŠ” Ξ²) ∈ P 𝒦
 produ  : {I : Type Ξ² }{π’œ : I β†’ Algebra Ξ±} β†’ (βˆ€ i β†’ (π’œ i) ∈ P{Ξ±}{Ξ±} 𝒦) β†’ β¨… π’œ ∈ P 𝒦
 prodw  : {I : Type Ξ² }{π’œ : I β†’ Algebra _} β†’ (βˆ€ i β†’ (π’œ i) ∈ P{Ξ±}{Ξ²} 𝒦) β†’ β¨… π’œ ∈ P 𝒦
 pisow  : {𝑨 𝑩 : Algebra _} β†’ 𝑨 ∈ P{Ξ±}{Ξ²} 𝒦 β†’ 𝑨 β‰… 𝑩 β†’ 𝑩 ∈ P 𝒦
```



#### <a id="the-inductive-types-v">The Inductive Types V</a>

A class `𝒦` of `𝑆`-algebras is called a *variety* if it is closed under each of
the closure operators `H`, `S`, and `P` introduced elsewhere; the corresponding
closure operator is often denoted `𝕍`, but we will denote it by `V`.

We now define `V` as an inductive type which is crafted to contain all the parts
of `H`, `S` and `P`, under different names.


```agda


data V {Ξ± Ξ² : Level}(𝒦 : Pred(Algebra Ξ±)(ov Ξ±)) : Pred(Algebra(Ξ± βŠ” Ξ²))(ov(Ξ± βŠ” Ξ²))
 where
 vbase   : {𝑨 : Algebra Ξ±} β†’ 𝑨 ∈ 𝒦 β†’ Lift-Alg 𝑨 Ξ² ∈ V 𝒦
 vlift   : {𝑨 : Algebra Ξ±} β†’ 𝑨 ∈ V{Ξ±}{Ξ±} 𝒦 β†’ Lift-Alg 𝑨 Ξ² ∈ V 𝒦
 vliftw  : {𝑨 : Algebra _} β†’ 𝑨 ∈ V{Ξ±}{Ξ²} 𝒦 β†’ Lift-Alg 𝑨 (Ξ± βŠ” Ξ²) ∈ V 𝒦
 vhimg   : {𝑨 𝑩 : Algebra _} β†’ 𝑨 ∈ V{Ξ±}{Ξ²} 𝒦 β†’ ((𝑩 , _) : HomImages 𝑨) β†’ 𝑩 ∈ V 𝒦
 vssubw  : {𝑨 𝑩 : Algebra _} β†’ 𝑨 ∈ V{Ξ±}{Ξ²} 𝒦 β†’ 𝑩 ≀ 𝑨 β†’ 𝑩 ∈ V 𝒦
 vprodu  : {I : Type Ξ²}{π’œ : I β†’ Algebra Ξ±} β†’ (βˆ€ i β†’ (π’œ i) ∈ V{Ξ±}{Ξ±} 𝒦) β†’ β¨… π’œ ∈ V 𝒦
 vprodw  : {I : Type Ξ²}{π’œ : I β†’ Algebra _} β†’ (βˆ€ i β†’ (π’œ i) ∈ V{Ξ±}{Ξ²} 𝒦) β†’ β¨… π’œ ∈ V 𝒦
 visou   : {𝑨 : Algebra Ξ±}{𝑩 : Algebra _} β†’ 𝑨 ∈ V{Ξ±}{Ξ±} 𝒦 β†’ 𝑨 β‰… 𝑩 β†’ 𝑩 ∈ V 𝒦
 visow   : {𝑨 𝑩 : Algebra _} β†’ 𝑨 ∈ V{Ξ±}{Ξ²} 𝒦 β†’ 𝑨 β‰… 𝑩 β†’ 𝑩 ∈ V 𝒦
```


Thus, if 𝒦 is a class of 𝑆-algebras, then the *variety generated by* 𝒦 is denoted
by `V 𝒦` and defined to be the smallest class that contains 𝒦 and is closed under
`H`, `S`, and `P`.

With the closure operator V representing closure under HSP, we represent formally
what it means to be a variety of algebras as follows.


```agda


is-variety : {Ξ± : Level}(𝒱 : Pred (Algebra Ξ±)(ov Ξ±)) β†’ Type(ov Ξ±)
is-variety{Ξ±} 𝒱 = V{Ξ±}{Ξ±} 𝒱 βŠ† 𝒱

variety : (Ξ± : Level) β†’ Type(suc (π“ž βŠ” π“₯ βŠ” (suc Ξ±)))
variety Ξ± = Ξ£[ 𝒱 ∈ (Pred (Algebra Ξ±)(ov Ξ±)) ] is-variety 𝒱
```



#### <a id="closure-properties-of-S">Closure properties of S</a>

`S` is a closure operator.  The facts that S is idempotent and expansive won't be
needed, so we omit these, but we will make use of monotonicity of S.  Here is the
proof of the latter.


```agda


S-mono :  {Ξ± Ξ² : Level}{𝒦 𝒦' : Pred (Algebra Ξ±)(ov Ξ±)}
 β†’        𝒦 βŠ† 𝒦' β†’ S{Ξ±}{Ξ²} 𝒦 βŠ† S{Ξ±}{Ξ²} 𝒦'

S-mono kk (sbase x)            = sbase (kk x)
S-mono kk (slift{𝑨} x)         = slift (S-mono kk x)
S-mono kk (ssub{𝑨}{𝑩} sA B≀A)  = ssub (S-mono kk sA) B≀A
S-mono kk (siso x x₁)          = siso (S-mono kk x) x₁
```


We sometimes want to go back and forth between our two representations of subalgebras
of algebras in a class. The tools `subalgebra→S` and `S→subalgebra` are made for
that purpose.


```agda


module _ {Ξ± Ξ² : Level}{𝒦 : Pred (Algebra Ξ±)(ov Ξ±)} where

 subalgebraβ†’S : {𝑩 : Algebra (Ξ± βŠ” Ξ²)} β†’ 𝑩 IsSubalgebraOfClass 𝒦 β†’ 𝑩 ∈ S{Ξ±}{Ξ²} 𝒦
 subalgebraβ†’S {𝑩} (𝑨 , ((π‘ͺ , C≀A) , KA , Bβ‰…C)) = ssub sA B≀A
  where
   B≀A : 𝑩 ≀ 𝑨
   B≀A = β‰…-RESP-≀ {π‘ͺ = 𝑨} Bβ‰…C C≀A

   slAu : Lift-Alg 𝑨 Ξ± ∈ S{Ξ±}{Ξ±} 𝒦
   slAu = sbase KA

   sA : 𝑨 ∈ S{Ξ±}{Ξ±} 𝒦
   sA = siso slAu (β‰…-sym Lift-β‰…)


module _ {Ξ± : Level}{𝒦 : Pred (Algebra Ξ±)(ov Ξ±)} where

 Sβ†’subalgebra : {𝑩 : Algebra Ξ±} β†’ 𝑩 ∈ S{Ξ±}{Ξ±} 𝒦  β†’  𝑩 IsSubalgebraOfClass 𝒦
 Sβ†’subalgebra (sbase{𝑩} x) =  𝑩 , ((𝑩 , (≀-refl β‰…-refl)) , x , β‰…-sym Lift-β‰…)
 Sβ†’subalgebra (slift{𝑩} x) =  ∣ BS ∣ ,
                              SA , ∣ snd βˆ₯ BS βˆ₯ ∣ , β‰…-trans (β‰…-sym Lift-β‰…) Bβ‰…SA
  where
   BS : 𝑩 IsSubalgebraOfClass 𝒦
   BS = S→subalgebra x
   SA : Subalgebra ∣ BS ∣
   SA = fst βˆ₯ BS βˆ₯
   Bβ‰…SA : 𝑩 β‰… ∣ SA ∣
   Bβ‰…SA = βˆ₯ snd βˆ₯ BS βˆ₯ βˆ₯

 Sβ†’subalgebra {𝑩} (ssub{𝑨} sA B≀A) = ∣ AS ∣ , (𝑩 , B≀AS) , ∣ snd βˆ₯ AS βˆ₯ ∣ , β‰…-refl
  where
   AS : 𝑨 IsSubalgebraOfClass 𝒦
   AS = S→subalgebra sA
   SA : Subalgebra ∣ AS ∣
   SA = fst βˆ₯ AS βˆ₯
   B≀SA : 𝑩 ≀ ∣ SA ∣
   B≀SA = ≀-RESP-β‰… B≀A (βˆ₯ snd βˆ₯ AS βˆ₯ βˆ₯)
   B≀AS : 𝑩 ≀ ∣ AS ∣
   B≀AS = ≀-trans 𝑩 ∣ AS ∣ B≀SA βˆ₯ SA βˆ₯

 Sβ†’subalgebra {𝑩} (siso{𝑨} sA Aβ‰…B) =  ∣ AS ∣ ,
                                      SA ,
                                      ∣ snd βˆ₯ AS βˆ₯ ∣ , (β‰…-trans (β‰…-sym Aβ‰…B) Aβ‰…SA)
  where
   AS : 𝑨 IsSubalgebraOfClass 𝒦
   AS = S→subalgebra sA
   SA : Subalgebra ∣ AS ∣
   SA = fst βˆ₯ AS βˆ₯
   Aβ‰…SA : 𝑨 β‰… ∣ SA ∣
   Aβ‰…SA = snd βˆ₯ snd AS βˆ₯
```



#### <a id="closure-properties-of-P">Closure properties of P</a>

`P` is a closure operator.  This is proved by checking that `P` is *monotone*,
*expansive*, and *idempotent*. The meaning of these terms will be clear from
the definitions of the types that follow.


```agda


P-mono :  {Ξ± Ξ² : Level}{𝒦 𝒦' : Pred(Algebra Ξ±)(ov Ξ±)}
 β†’        𝒦 βŠ† 𝒦' β†’ P{Ξ±}{Ξ²} 𝒦 βŠ† P{Ξ±}{Ξ²} 𝒦'

P-mono kk' (pbase x)     = pbase (kk' x)
P-mono kk' (pliftu x)    = pliftu (P-mono kk' x)
P-mono kk' (pliftw x)    = pliftw (P-mono kk' x)
P-mono kk' (produ x)     = produ (Ξ» i β†’ P-mono kk' (x i))
P-mono kk' (prodw x)     = prodw (Ξ» i β†’ P-mono kk' (x i))
P-mono kk' (pisow x x₁)  = pisow (P-mono kk' x) x₁


P-expa : {Ξ± : Level}{𝒦 : Pred (Algebra Ξ±)(ov Ξ±)} β†’ 𝒦 βŠ† P{Ξ±}{Ξ±} 𝒦
P-expa{Ξ±}{𝒦} {𝑨} KA = pisow {𝑩 = 𝑨} (pbase KA) (β‰…-sym Lift-β‰…)

module _ {Ξ± Ξ² : Level} where

 P-idemp :  {𝒦 : Pred (Algebra Ξ±)(ov Ξ±)}
  β†’         P{Ξ± βŠ” Ξ²}{Ξ± βŠ” Ξ²} (P{Ξ±}{Ξ± βŠ” Ξ²} 𝒦) βŠ† P{Ξ±}{Ξ± βŠ” Ξ²} 𝒦

 P-idemp (pbase x)     = pliftw x
 P-idemp (pliftu x)    = pliftw (P-idemp x)
 P-idemp (pliftw x)    = pliftw (P-idemp x)
 P-idemp (produ x)     = prodw (Ξ» i β†’ P-idemp (x i))
 P-idemp (prodw x)     = prodw (Ξ» i β†’ P-idemp (x i))
 P-idemp (pisow x x₁)  = pisow (P-idemp x) x₁
```


Next we observe that lifting to a higher universe does not break the property of being a subalgebra of an algebra of a class.  In other words, if we lift a subalgebra of an algebra in a class, the result is still a subalgebra of an algebra in the class.


```agda


module _ {Ξ± Ξ² : Level}{𝒦 : Pred (Algebra Ξ±)(ov Ξ±)} where

 Lift-Alg-subP :  {𝑩 : Algebra Ξ²}
  β†’               𝑩 IsSubalgebraOfClass (P{Ξ±}{Ξ²} 𝒦)
  β†’               (Lift-Alg 𝑩 Ξ±) IsSubalgebraOfClass (P{Ξ±}{Ξ²} 𝒦)

 Lift-Alg-subP (𝑨 , (π‘ͺ , C≀A) , pA , Bβ‰…C ) =  lA ,
                                              (lC , lC≀lA) ,
                                              plA , (Lift-Alg-iso B≅C)
   where
   lA lC : Algebra (Ξ± βŠ” Ξ²)
   lA = Lift-Alg 𝑨 (Ξ± βŠ” Ξ²)
   lC = Lift-Alg π‘ͺ Ξ±

   lC≀lA : lC ≀ lA
   lC≀lA = Lift-≀-Lift Ξ± {𝑨} (Ξ± βŠ” Ξ²) C≀A
   plA : lA ∈ P{Ξ±}{Ξ²} 𝒦
   plA = pliftw pA

 Lift-Alg-subP' :  {𝑨 : Algebra Ξ±}
  β†’                𝑨 IsSubalgebraOfClass (P{Ξ±}{Ξ±} 𝒦)
  β†’                (Lift-Alg 𝑨 Ξ²) IsSubalgebraOfClass (P{Ξ±}{Ξ²} 𝒦)

 Lift-Alg-subP' (𝑩 , (π‘ͺ , C≀B) , pB , Aβ‰…C ) = lB , (lC , lC≀lB) , plB , (Lift-Alg-iso Aβ‰…C)
   where
   lB lC : Algebra (Ξ± βŠ” Ξ²)
   lB = Lift-Alg 𝑩 Ξ²
   lC = Lift-Alg π‘ͺ Ξ²

   lC≀lB : lC ≀ lB
   lC≀lB = Lift-≀-Lift Ξ² {𝑩} Ξ² C≀B
   plB : lB ∈ P{Ξ±}{Ξ²} 𝒦
   plB = pliftu pB
```


#### <a id="V-is-closed-under-lift">V is closed under lift</a>

As mentioned earlier, a technical hurdle that must be overcome when formalizing proofs in Agda is the proper handling of universe levels. In particular, in the proof of the Birkhoff's theorem, for example, we will need to know that if an algebra 𝑨 belongs to the variety V 𝒦, then so does the lift of 𝑨.  Let us get the tedious proof of this technical lemma out of the way.


```agda


open Level

module Vlift  {Ξ± : Level} {feβ‚€ : funext (ov Ξ±) Ξ±}
              {fe₁ : funext ((ov Ξ±) βŠ” (suc (ov Ξ±))) (suc (ov Ξ±))}
              {feβ‚‚ : funext (ov Ξ±) (ov Ξ±)}
              {𝒦 : Pred (Algebra Ξ±)(ov Ξ±)} where

 VlA :  {𝑨 : Algebra (ov Ξ±)} β†’ 𝑨 ∈ V{Ξ±}{ov Ξ±} 𝒦
  β†’     Lift-Alg 𝑨 (suc (ov Ξ±)) ∈ V{Ξ±}{suc (ov Ξ±)} 𝒦
 VlA (vbase{𝑨} x) = visow (vbase x) (Lift-Alg-assoc _ _ {𝑨})
 VlA (vlift{𝑨} x) = visow (vlift x) (Lift-Alg-assoc _ _ {𝑨})
 VlA (vliftw{𝑨} x) = visow (VlA x) (Lift-Alg-assoc _ _ {𝑨})

 VlA (vhimg{𝑨}{𝑩} x hB) = vhimg {𝑩 = Lift-Alg 𝑩 (suc (ov Ξ±))} (VlA x) (lC , lChi)
  where
  lC : Algebra (suc (ov Ξ±))
  lC = Lift-Alg ∣ hB ∣ (suc (ov α))
  lChi : lC IsHomImageOf _
  lChi = (Lift-Alg-hom-image (suc (ov(Ξ±))) {∣ hB ∣} (suc (ov(Ξ±))) βˆ₯ hB βˆ₯)

 VlA (vssubw{𝑨}{𝑩} x B≀A) =
  vssubw (VlA x) (Lift-≀-Lift (suc (ov(Ξ±))) {𝑨} (suc (ov(Ξ±))) B≀A)

 VlA (vprodu{I}{π’œ} x) = visow (vprodw vlA) (β‰…-sym Bβ‰…A)
  where
  𝑰 : Type (suc (ov Ξ±))
  𝑰 = Lift (suc (ov Ξ±)) I

  lA : 𝑰 β†’ Algebra (suc (ov Ξ±))
  lA i = Lift-Alg (π’œ (lower i)) (suc (ov Ξ±))

  vlA : βˆ€ i β†’ (lA i) ∈ V{Ξ±}{suc (ov Ξ±)} 𝒦
  vlA i = vlift (x (lower i))

  iso-components : βˆ€ i β†’ π’œ i β‰… lA (lift i)
  iso-components i = Lift-β‰…

  Bβ‰…A : Lift-Alg (β¨… π’œ) (suc (ov Ξ±)) β‰… β¨… lA
  Bβ‰…A = Lift-Alg-β¨…β‰…  {fizw = fe₁}{fiu = feβ‚€} iso-components

 VlA (vprodw{I}{π’œ} x) = visow (vprodw vlA) (β‰…-sym Bβ‰…A)
  where
  𝑰 : Type (suc (ov Ξ±))
  𝑰 = Lift (suc (ov Ξ±)) I

  lA : 𝑰 β†’ Algebra (suc (ov Ξ±))
  lA i = Lift-Alg (π’œ (lower i)) (suc (ov Ξ±))

  vlA : βˆ€ i β†’ (lA i) ∈ V{Ξ±}{suc (ov Ξ±)} 𝒦
  vlA i = VlA (x (lower i))

  iso-components : βˆ€ i β†’ π’œ i β‰… lA (lift i)
  iso-components i = Lift-β‰…

  Bβ‰…A : Lift-Alg (β¨… π’œ) (suc (ov Ξ±)) β‰… β¨… lA
  Bβ‰…A = Lift-Alg-β¨…β‰… {fizw = fe₁}{fiu = feβ‚‚} iso-components

 VlA (visou{𝑨}{𝑩} x Aβ‰…B) = visow (vlift x) (Lift-Alg-iso Aβ‰…B)
 VlA (visow{𝑨}{𝑩} x Aβ‰…B) = visow (VlA x) (Lift-Alg-iso Aβ‰…B)
```