module Cubical.Algebra.AbGroup.FinitePresentation where

open import Cubical.Foundations.Prelude

open import Cubical.Data.Nat
open import Cubical.Data.Int

open import Cubical.HITs.PropositionalTruncation

open import Cubical.Algebra.Group
open import Cubical.Algebra.Group.Morphisms
open import Cubical.Algebra.Group.MorphismProperties
open import Cubical.Algebra.AbGroup
open import Cubical.Algebra.AbGroup.Instances.FreeAbGroup

open import Cubical.Algebra.Group.QuotientGroup
open import Cubical.Algebra.Group.Subgroup

private
  variable
     : Level

record FinitePresentation (A : AbGroup ) : Type  where
  field
    nGens : 
    nRels : 
    rels : AbGroupHom ℤ[Fin nRels ] ℤ[Fin nGens ]
    fpiso : AbGroupIso A (ℤ[Fin nGens ] /Im rels)

isFinitelyPresented : AbGroup   Type 
isFinitelyPresented G =  FinitePresentation G ∥₁

open FinitePresentation
GrIsoPresFinitePresentation :  { ℓ'} {A : AbGroup } {B : AbGroup ℓ'}
   AbGroupIso A B  FinitePresentation A  FinitePresentation B
nGens (GrIsoPresFinitePresentation abG fpA) = nGens fpA
nRels (GrIsoPresFinitePresentation abG fpA) = nRels fpA
rels (GrIsoPresFinitePresentation abG fpA) = rels fpA
fpiso (GrIsoPresFinitePresentation abG fpA) =
  compGroupIso (invGroupIso abG) (fpiso fpA)