---
layout: default
file: "src/Classical/Structures/Group/SubgroupLattice.lagda.md"
title: "Classical.Structures.Group.SubgroupLattice module"
date: "2026-07-11"
author: "the agda-algebras development team"
---
### The subgroup lattice of an arbitrary group
This is the [Classical.Structures.Group.SubgroupLattice][] module of the [Agda Universal Algebra Library][].
For a group `𝑮`{.AgdaBound} over [`Sig-Group`][Classical.Signatures.Group], the
subuniverses of the underlying algebra form a complete lattice under inclusion — this
is exactly the `Sublattice`{.AgdaModule} construction of
[Setoid.Subalgebras.CompleteLattice][], instantiated at the group algebra. Because
`Sig-Group` carries the binary `∙-Op`, the nullary `ε-Op`, and the unary `⁻¹-Op`, a
subuniverse of the group algebra is precisely a subgroup, so this instance *is* the
subgroup lattice `Sub(G)`. This module packages the instantiation once, as the
parameterized module `GroupSublattice`{.AgdaModule}, generalizing what
[Examples.Setoid.SubgroupLattice][] does concretely for the Klein four-group.
Opening `GroupSublattice 𝑮 ℓ₀` re-exports the whole `Sublattice`{.AgdaModule} kit
specialized to the group algebra — the carrier `Subᴸ`{.AgdaFunction}, the inclusion
order `_≤_`{.AgdaFunction}, binary `_∧_`{.AgdaFunction}/`_∨_`{.AgdaFunction}, bounds
`0ˢ`{.AgdaFunction}/`1ˢ`{.AgdaFunction}, infinitary `⨅`{.AgdaFunction}/`⨆`{.AgdaFunction},
and the stdlib lattice bundles — and adds the group-specific facts below.
On the relationship with `IsSubgroup`{.AgdaRecord} of
[Classical.Structures.Group.Subgroups][]: the lattice elements are *bare*
subuniverses, which is all the lattice structure needs; equality-respecting subgroups
embed into the lattice by forgetting `respects`{.AgdaField}
(`subgroup→Subᴸ`{.AgdaFunction}), and the respecting property is preserved by the meets
(`∧-isSubgroup`{.AgdaFunction}, `⨅-isSubgroup`{.AgdaFunction}) since these are plain
intersections. It is *not* automatically preserved by the joins, because the join is
the inductively *generated* subuniverse `Sg (B ∪ C)`, whose `app` constructor pins
exact elements rather than ≈-classes; a respecting join would take the ≈-saturation of
`Sg`, which we leave for future work.
<!--
```agda
{-# OPTIONS --cubical-compatible --exact-split --safe #-}
module Classical.Structures.Group.SubgroupLattice where
open import Agda.Primitive using () renaming ( Set to Type )
open import Data.Product using ( _,_ ; proj₁ ; proj₂ )
open import Level using ( Level )
open import Relation.Unary using ( Pred ; _∈_ )
open import Classical.Structures.Group.Basic using ( Group ; module Group-Op )
open import Classical.Structures.Group.Subgroups using ( IsSubgroup ; sub-ε-closed )
open import Order.Interval using ( module IntervalLattice )
open import Setoid.Algebras.Basic using ( 𝕌[_] )
open import Setoid.Subalgebras.CompleteLattice using ( module Sublattice )
```
-->
#### The instantiation
`GroupSublattice 𝑮 ℓ₀` is `Sublattice` applied to the underlying algebra of `𝑮`,
with the base level `ℓ₀` of the `Sublattice` construction left as a parameter (the
lattice's predicates live at the absorbing level `L = α ⊔ ℓ₀`, since the two
signature levels of `Sig-Group` are zero).
```agda
module GroupSublattice {α ρ : Level} (𝒢 : Group α ρ) (ℓ₀ : Level) where
private
𝑮 = proj₁ 𝒢
G = 𝕌[ 𝑮 ]
open Group-Op 𝒢 using ( ε )
open Sublattice 𝑮 ℓ₀ public
```
#### Group-specific facts
Every subuniverse of a group algebra contains the identity element — the nullary
operation symbol `ε-Op` forces it. In particular every lattice element is nonempty,
and the lattice bottom `0ˢ = Sg ∅` is the subuniverse generated by the identity.
```agda
ε-mem : (B : Subᴸ) → ε ∈ proj₁ B
ε-mem (B , Bsub) = sub-ε-closed 𝒢 B Bsub
```
An equality-respecting subgroup (at the lattice's predicate level `L`) is an element
of the lattice, by forgetting the `respects`{.AgdaField} field.
```agda
subgroup→Subᴸ : (B : Pred G L) → IsSubgroup 𝒢 B → Subᴸ
subgroup→Subᴸ B B-sg = B , IsSubgroup.isSubuniverse B-sg
```
The meet operations preserve the respecting property, because binary meet and
infinitary meet are the (pointwise) intersections of the underlying predicates.
```agda
∧-isSubgroup : (B C : Subᴸ)
→ IsSubgroup 𝒢 (proj₁ B) → IsSubgroup 𝒢 (proj₁ C)
→ IsSubgroup 𝒢 (proj₁ (B ∧ C))
∧-isSubgroup B C B-sg C-sg = record
{ respects = λ x≈y x∈ → IsSubgroup.respects B-sg x≈y (proj₁ x∈)
, IsSubgroup.respects C-sg x≈y (proj₂ x∈)
; isSubuniverse = proj₂ (B ∧ C)
}
⨅-isSubgroup : {I : Type ℓ₀} (𝒜 : I → Subᴸ)
→ (∀ i → IsSubgroup 𝒢 (proj₁ (𝒜 i)))
→ IsSubgroup 𝒢 (proj₁ (⨅ 𝒜))
⨅-isSubgroup 𝒜 sg = record
{ respects = λ x≈y x∈ i → IsSubgroup.respects (sg i) x≈y (x∈ i)
; isSubuniverse = proj₂ (⨅ 𝒜)
}
```
#### Upper intervals
An upper interval `[B, C]` in the subgroup lattice — the subgroups sandwiched
between `B` and `C` — is a bounded lattice, by the generic interval construction of
[Order.Interval][] applied to the lattice bundle `Sub-Lattice`{.AgdaFunction}.
Opening `SubInterval B C B≤C` provides the interval carrier, its order, and the
`Lattice`/`BoundedLattice` bundles; the FLRP-side intervals `[H, G]` of the
Pálfy–Pudlák correspondence are the instances with `C` the full subgroup.
```agda
module SubInterval (B C : Subᴸ) (B≤C : B ≤ C) = IntervalLattice Sub-Lattice B C B≤C
```