/-- The special case that more or less by definition `QuaternionGroup 0` is isomorphic to the
infinite dihedral group. -/
def quaternionGroupZeroEquivDihedralGroupZero : QuaternionGroup 0 ≃* DihedralGroup 0 where
  toFun i :=
    -- Porting note: Originally `QuaternionGroup.recOn i DihedralGroup.r DihedralGroup.sr`
    match i with
    | a j => DihedralGroup.r j
    | xa j => DihedralGroup.sr j
  invFun i :=
    match i with
    | DihedralGroup.r j => a j
    | DihedralGroup.sr j => xa j
  left_inv := by rintro (k | k) <;> rfl
  right_inv := by rintro (k | k) <;> rfl
  map_mul' := by rintro (k | k) (l | l) <;> 

Proof state:
case xa.xa
n : ℕ
k l : ZMod (2 * 0)
⊢ Equiv.toFun
      {
        toFun := fun i =>
          match i with
          | a j => DihedralGroup.r j
          | xa j => DihedralGroup.sr j,
        invFun := fun i =>
          match i with
          | DihedralGroup.r j => a j
          | DihedralGroup.sr j => xa j,
        left_inv :=
          (_ :
            ∀ (x : QuaternionGroup 0),
              (fun i =>
                    match i with
                    | DihedralGroup.r j => a j
                    | DihedralGroup.sr j => xa j)
                  ((fun i =>
                      match i with
                      | a j => DihedralGroup.r j
                      | xa j => DihedralGroup.sr j)
                    x) =
                x),
        right_inv :=
          (_ :
            ∀ (x : DihedralGroup 0),
              (fun i =>
                    match i with
                    | a j => DihedralGroup.r j
                    | xa j => DihedralGroup.sr j)
                  ((fun i =>
                      match i with
                      | DihedralGroup.r j => a j
                      | DihedralGroup.sr j => xa j)
                    x) =
                x) }
      (xa k * xa l) =
    Equiv.toFun
        {
          toFun := fun i =>
            match i with
            | a j => DihedralGroup.r j
            | xa j => DihedralGroup.sr j,
          invFun := fun i =>
            match i with
            | DihedralGroup.r j => a j
            | DihedralGroup.sr j => xa j,
          left_inv :=
            (_ :
              ∀ (x : QuaternionGroup 0),
                (fun i =>
                      match i with
                      | DihedralGroup.r j => a j
                      | DihedralGroup.sr j => xa j)
                    ((fun i =>
                        match i with
                        | a j => DihedralGroup.r j
                        | xa j => DihedralGroup.sr j)
                      x) =
                  x),
          right_inv :=
            (_ :
              ∀ (x : DihedralGroup 0),
                (fun i =>
                      match i with
                      | a j => DihedralGroup.r j
                      | xa j => DihedralGroup.sr j)
                    ((fun i =>
                        match i with
                        | DihedralGroup.r j => a j
                        | DihedralGroup.sr j => xa j)
                      x) =
                  x) }
        (xa k) *
      Equiv.toFun
        {
          toFun := fun i =>
            match i with
            | a j => DihedralGroup.r j
            | xa j => DihedralGroup.sr j,
          invFun := fun i =>
            match i with
            | DihedralGroup.r j => a j
            | DihedralGroup.sr j => xa j,
          left_inv :=
            (_ :
              ∀ (x : QuaternionGroup 0),
                (fun i =>
                      match i with
                      | DihedralGroup.r j => a j
                      | DihedralGroup.sr j => xa j)
                    ((fun i =>
                        match i with
                        | a j => DihedralGroup.r j
                        | xa j => DihedralGroup.sr j)
                      x) =
                  x),
          right_inv :=
            (_ :
              ∀ (x : DihedralGroup 0),
                (fun i =>
                      match i with
                      | a j => DihedralGroup.r j
                      | xa j => DihedralGroup.sr j)
                    ((fun i =>
                        match i with
                        | DihedralGroup.r j => a j
                        | DihedralGroup.sr j => xa j)
                      x) =
                  x) }
        (xa l)

Next tactic:
simp