Blueprint (GPT formalization): a profinite presentation of the absolute Galois group of ℚ₂

3. The tame and maximal pro-2 quotients🔗

Lemma3.1
Group: The tame and maximal pro-2 quotients (6)
Hover another entry in this group to preview it.
L∃∀N
Used by 3
Hover a use site to preview it.
Preview
Theorem 3.2
Loading preview
Hover a use site to preview it.

Lemma 3.1 of the paper (Finite tame quotients).

In every finite quotient generated by s,t with t^s=t^2, the element t has odd order, and the quotient has the form

C_e\rtimes C_n, \qquad e\text{ odd}, \qquad s^{-1}ts=t^2.

Every normal 2-subgroup of such a quotient is central and lies in the unramified cyclic direction.

Lean code for Lemma3.15 declarations
  • theoremdefined in Q2Presentation/Boundary/TameFinite.lean
    complete
    theorem Q2Presentation.finite_tame_tau_odd.{u_1} {GType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [GroupGroup.{u} (G : Type u) : Type uA `Group` is a `Monoid` with an operation `⁻¹` satisfying `a⁻¹ * a = 1`.
    
    There is also a division operation `/` such that `a / b = a * b⁻¹`,
    with a default so that `a / b = a * b⁻¹` holds by definition.
    
    Use `Group.ofLeftAxioms` or `Group.ofRightAxioms` to define a group structure
    on a type with the minimum proof obligations.
     GType u_1]
      [FiniteFinite.{u_3} (α : Sort u_3) : PropA type is `Finite` if it is in bijective correspondence to some `Fin n`.
    
    This is similar to `Fintype`, but `Finite` is a proposition rather than data.
    A particular benefit to this is that `Finite` instances are definitionally equal to one another
    (due to proof irrelevance) rather than being merely propositionally equal,
    and, furthermore, `Finite` instances generally avoid the need for `Decidable` instances.
    One other notable difference is that `Finite` allows there to be `Finite p` instances
    for all `p : Prop`, which is not allowed by `Fintype` due to universe constraints.
    An application of this is that `Finite (x ∈ s → β x)` follows from the general instance for pi
    types, assuming `[∀ x, Finite (β x)]`.
    Implementation note: this is a reason `Finite α` is not defined as `Nonempty (Fintype α)`.
    
    Every `Fintype` instance provides a `Finite` instance via `Finite.of_fintype`.
    Conversely, one can noncomputably create a `Fintype` instance from a `Finite` instance
    via `Fintype.ofFinite`. In a proof one might write
    ```lean
      have := Fintype.ofFinite α
    ```
    to obtain such an instance.
    
    Do not write noncomputable `Fintype` instances; instead write `Finite` instances
    and use this `Fintype.ofFinite` interface.
    The `Fintype` instances should be relied upon to be computable for evaluation purposes.
    
    Theorems should use `Finite` instead of `Fintype`, unless definitions in the theorem statement
    require `Fintype`.
    Definitions should prefer `Finite` as well, unless it is important that the definitions
    are meant to be computable in the reduction or `#eval` sense.
     GType u_1] {sG tG : GType u_1} (hQ2Presentation.rconj t s = t ^ 2 : Q2Presentation.rconjQ2Presentation.rconj.{u_1} {G : Type u_1} [Group G] (x g : G) : GRight conjugation `x^g = g⁻¹ * x * g` (manuscript convention).  tG sG =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. tG ^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`. 2) :
      OddOdd.{u_2} {α : Type u_2} [Semiring α] (a : α) : PropAn element `a` of a semiring is odd if there exists `k` such `a = 2*k + 1`.  (orderOforderOf.{u_1} {G : Type u_1} [Monoid G] (x : G) : ℕ`orderOf x` is the order of the element `x`, i.e. the `n ≥ 1`, s.t. `x ^ n = 1` if it exists.
    Otherwise, i.e. if `x` is of infinite order, then `orderOf x` is `0` by convention.  tG)
    theorem Q2Presentation.finite_tame_tau_odd.{u_1}
      {GType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [GroupGroup.{u} (G : Type u) : Type uA `Group` is a `Monoid` with an operation `⁻¹` satisfying `a⁻¹ * a = 1`.
    
    There is also a division operation `/` such that `a / b = a * b⁻¹`,
    with a default so that `a / b = a * b⁻¹` holds by definition.
    
    Use `Group.ofLeftAxioms` or `Group.ofRightAxioms` to define a group structure
    on a type with the minimum proof obligations.
     GType u_1] [FiniteFinite.{u_3} (α : Sort u_3) : PropA type is `Finite` if it is in bijective correspondence to some `Fin n`.
    
    This is similar to `Fintype`, but `Finite` is a proposition rather than data.
    A particular benefit to this is that `Finite` instances are definitionally equal to one another
    (due to proof irrelevance) rather than being merely propositionally equal,
    and, furthermore, `Finite` instances generally avoid the need for `Decidable` instances.
    One other notable difference is that `Finite` allows there to be `Finite p` instances
    for all `p : Prop`, which is not allowed by `Fintype` due to universe constraints.
    An application of this is that `Finite (x ∈ s → β x)` follows from the general instance for pi
    types, assuming `[∀ x, Finite (β x)]`.
    Implementation note: this is a reason `Finite α` is not defined as `Nonempty (Fintype α)`.
    
    Every `Fintype` instance provides a `Finite` instance via `Finite.of_fintype`.
    Conversely, one can noncomputably create a `Fintype` instance from a `Finite` instance
    via `Fintype.ofFinite`. In a proof one might write
    ```lean
      have := Fintype.ofFinite α
    ```
    to obtain such an instance.
    
    Do not write noncomputable `Fintype` instances; instead write `Finite` instances
    and use this `Fintype.ofFinite` interface.
    The `Fintype` instances should be relied upon to be computable for evaluation purposes.
    
    Theorems should use `Finite` instead of `Fintype`, unless definitions in the theorem statement
    require `Fintype`.
    Definitions should prefer `Finite` as well, unless it is important that the definitions
    are meant to be computable in the reduction or `#eval` sense.
     GType u_1]
      {sG tG : GType u_1}
      (hQ2Presentation.rconj t s = t ^ 2 : Q2Presentation.rconjQ2Presentation.rconj.{u_1} {G : Type u_1} [Group G] (x g : G) : GRight conjugation `x^g = g⁻¹ * x * g` (manuscript convention).  tG sG =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. tG ^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`. 2) :
      OddOdd.{u_2} {α : Type u_2} [Semiring α] (a : α) : PropAn element `a` of a semiring is odd if there exists `k` such `a = 2*k + 1`.  (orderOforderOf.{u_1} {G : Type u_1} [Monoid G] (x : G) : ℕ`orderOf x` is the order of the element `x`, i.e. the `n ≥ 1`, s.t. `x ^ n = 1` if it exists.
    Otherwise, i.e. if `x` is of infinite order, then `orderOf x` is `0` by convention.  tG)
    **Lemma 3.1, oddness part.**  In a finite group, if `t` satisfies the tame
    relation `tˢ = t²` (i.e. `rconj t s = t ^ 2`), then `t` has odd order.
    
    Proof (manuscript l.416): conjugation preserves order, so
    `orderOf (rconj t s) = orderOf t`; on the other hand
    `orderOf (t²) = orderOf t / gcd (orderOf t) 2`.  Combining forces
    `gcd (orderOf t) 2 = 1`, i.e. `Odd (orderOf t)`. 
  • theoremdefined in Q2Presentation/Boundary/TameFinite.lean
    complete
    theorem Q2Presentation.finite_tame_normal_two_subgroup_unramified.{u_1}
      {GType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [GroupGroup.{u} (G : Type u) : Type uA `Group` is a `Monoid` with an operation `⁻¹` satisfying `a⁻¹ * a = 1`.
    
    There is also a division operation `/` such that `a / b = a * b⁻¹`,
    with a default so that `a / b = a * b⁻¹` holds by definition.
    
    Use `Group.ofLeftAxioms` or `Group.ofRightAxioms` to define a group structure
    on a type with the minimum proof obligations.
     GType u_1] [FiniteFinite.{u_3} (α : Sort u_3) : PropA type is `Finite` if it is in bijective correspondence to some `Fin n`.
    
    This is similar to `Fintype`, but `Finite` is a proposition rather than data.
    A particular benefit to this is that `Finite` instances are definitionally equal to one another
    (due to proof irrelevance) rather than being merely propositionally equal,
    and, furthermore, `Finite` instances generally avoid the need for `Decidable` instances.
    One other notable difference is that `Finite` allows there to be `Finite p` instances
    for all `p : Prop`, which is not allowed by `Fintype` due to universe constraints.
    An application of this is that `Finite (x ∈ s → β x)` follows from the general instance for pi
    types, assuming `[∀ x, Finite (β x)]`.
    Implementation note: this is a reason `Finite α` is not defined as `Nonempty (Fintype α)`.
    
    Every `Fintype` instance provides a `Finite` instance via `Finite.of_fintype`.
    Conversely, one can noncomputably create a `Fintype` instance from a `Finite` instance
    via `Fintype.ofFinite`. In a proof one might write
    ```lean
      have := Fintype.ofFinite α
    ```
    to obtain such an instance.
    
    Do not write noncomputable `Fintype` instances; instead write `Finite` instances
    and use this `Fintype.ofFinite` interface.
    The `Fintype` instances should be relied upon to be computable for evaluation purposes.
    
    Theorems should use `Finite` instead of `Fintype`, unless definitions in the theorem statement
    require `Fintype`.
    Definitions should prefer `Finite` as well, unless it is important that the definitions
    are meant to be computable in the reduction or `#eval` sense.
     GType u_1] {sG tG : GType u_1}
      (hgenSubgroup.closure {s, t} = ⊤ : Subgroup.closureSubgroup.closure.{u_1} {G : Type u_1} [Group G] (k : Set G) : Subgroup GThe `Subgroup` generated by a set.  {Insert.insert.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Insert α γ] : α → γ → γ`insert x xs` inserts the element `x` into the collection `xs`. sG,Insert.insert.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Insert α γ] : α → γ → γ`insert x xs` inserts the element `x` into the collection `xs`.  tG}Insert.insert.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Insert α γ] : α → γ → γ`insert x xs` inserts the element `x` into the collection `xs`.  =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. Top.top.{u_1} {α : Type u_1} [self : Top α] : αThe top (`⊤`, `\top`) element 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `⊤` in identifiers is `top`.)
      (htameQ2Presentation.rconj t s = t ^ 2 : Q2Presentation.rconjQ2Presentation.rconj.{u_1} {G : Type u_1} [Group G] (x g : G) : GRight conjugation `x^g = g⁻¹ * x * g` (manuscript convention).  tG sG =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. tG ^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`. 2) (NSubgroup G : SubgroupSubgroup.{u_3} (G : Type u_3) [Group G] : Type u_3A subgroup of a group `G` is a subset containing 1, closed under multiplication
    and closed under multiplicative inverse.  GType u_1) [NSubgroup G.NormalSubgroup.Normal.{u_1} {G : Type u_1} [Group G] (H : Subgroup G) : PropA subgroup `H` is normal if whenever `n ∈ H`, then `g * n * g⁻¹ ∈ H` for every `g : G` ]
      (hN2IsPGroup 2 ↥N : IsPGroupIsPGroup.{u_1} (p : ℕ) (G : Type u_1) [Group G] : PropA p-group is a group in which the order of every element is a power of `p`.  2 NSubgroup G) :
      NSubgroup G LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
    
     * The recommended spelling of `<=` in identifiers is `le` (prefer `≤` over `<=`). Subgroup.centerSubgroup.center.{u_1} (G : Type u_1) [Group G] : Subgroup GThe center of a group `G` is the set of elements that commute with everything in `G`  GType u_1 And (a b : Prop) : Prop`And a b`, or `a ∧ b`, is the conjunction of propositions. It can be
    constructed and destructed like a pair: if `ha : a` and `hb : b` then
    `⟨ha, hb⟩ : a ∧ b`, and if `h : a ∧ b` then `h.left : a` and `h.right : b`.
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∧` in identifiers is `and`.
    
     * The recommended spelling of `/\` in identifiers is `and` (prefer `∧` over `/\`). NSubgroup G  Subgroup.zpowersSubgroup.zpowers.{u_1} {G : Type u_1} [Group G] (g : G) : Subgroup GThe subgroup generated by an element.  tG =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. Bot.bot.{u_1} {α : Type u_1} [self : Bot α] : αThe bot (`⊥`, `\bot`) element 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `⊥` in identifiers is `bot`.
    theorem Q2Presentation.finite_tame_normal_two_subgroup_unramified.{u_1}
      {GType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [GroupGroup.{u} (G : Type u) : Type uA `Group` is a `Monoid` with an operation `⁻¹` satisfying `a⁻¹ * a = 1`.
    
    There is also a division operation `/` such that `a / b = a * b⁻¹`,
    with a default so that `a / b = a * b⁻¹` holds by definition.
    
    Use `Group.ofLeftAxioms` or `Group.ofRightAxioms` to define a group structure
    on a type with the minimum proof obligations.
     GType u_1] [FiniteFinite.{u_3} (α : Sort u_3) : PropA type is `Finite` if it is in bijective correspondence to some `Fin n`.
    
    This is similar to `Fintype`, but `Finite` is a proposition rather than data.
    A particular benefit to this is that `Finite` instances are definitionally equal to one another
    (due to proof irrelevance) rather than being merely propositionally equal,
    and, furthermore, `Finite` instances generally avoid the need for `Decidable` instances.
    One other notable difference is that `Finite` allows there to be `Finite p` instances
    for all `p : Prop`, which is not allowed by `Fintype` due to universe constraints.
    An application of this is that `Finite (x ∈ s → β x)` follows from the general instance for pi
    types, assuming `[∀ x, Finite (β x)]`.
    Implementation note: this is a reason `Finite α` is not defined as `Nonempty (Fintype α)`.
    
    Every `Fintype` instance provides a `Finite` instance via `Finite.of_fintype`.
    Conversely, one can noncomputably create a `Fintype` instance from a `Finite` instance
    via `Fintype.ofFinite`. In a proof one might write
    ```lean
      have := Fintype.ofFinite α
    ```
    to obtain such an instance.
    
    Do not write noncomputable `Fintype` instances; instead write `Finite` instances
    and use this `Fintype.ofFinite` interface.
    The `Fintype` instances should be relied upon to be computable for evaluation purposes.
    
    Theorems should use `Finite` instead of `Fintype`, unless definitions in the theorem statement
    require `Fintype`.
    Definitions should prefer `Finite` as well, unless it is important that the definitions
    are meant to be computable in the reduction or `#eval` sense.
     GType u_1]
      {sG tG : GType u_1}
      (hgenSubgroup.closure {s, t} = ⊤ : Subgroup.closureSubgroup.closure.{u_1} {G : Type u_1} [Group G] (k : Set G) : Subgroup GThe `Subgroup` generated by a set.  {Insert.insert.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Insert α γ] : α → γ → γ`insert x xs` inserts the element `x` into the collection `xs`. sG,Insert.insert.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Insert α γ] : α → γ → γ`insert x xs` inserts the element `x` into the collection `xs`.  tG}Insert.insert.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Insert α γ] : α → γ → γ`insert x xs` inserts the element `x` into the collection `xs`.  =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. Top.top.{u_1} {α : Type u_1} [self : Top α] : αThe top (`⊤`, `\top`) element 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `⊤` in identifiers is `top`.)
      (htameQ2Presentation.rconj t s = t ^ 2 :
        Q2Presentation.rconjQ2Presentation.rconj.{u_1} {G : Type u_1} [Group G] (x g : G) : GRight conjugation `x^g = g⁻¹ * x * g` (manuscript convention).  tG sG =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. tG ^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`. 2)
      (NSubgroup G : SubgroupSubgroup.{u_3} (G : Type u_3) [Group G] : Type u_3A subgroup of a group `G` is a subset containing 1, closed under multiplication
    and closed under multiplicative inverse.  GType u_1) [NSubgroup G.NormalSubgroup.Normal.{u_1} {G : Type u_1} [Group G] (H : Subgroup G) : PropA subgroup `H` is normal if whenever `n ∈ H`, then `g * n * g⁻¹ ∈ H` for every `g : G` ]
      (hN2IsPGroup 2 ↥N : IsPGroupIsPGroup.{u_1} (p : ℕ) (G : Type u_1) [Group G] : PropA p-group is a group in which the order of every element is a power of `p`.  2 NSubgroup G) :
      NSubgroup G LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
    
     * The recommended spelling of `<=` in identifiers is `le` (prefer `≤` over `<=`). Subgroup.centerSubgroup.center.{u_1} (G : Type u_1) [Group G] : Subgroup GThe center of a group `G` is the set of elements that commute with everything in `G`  GType u_1 And (a b : Prop) : Prop`And a b`, or `a ∧ b`, is the conjunction of propositions. It can be
    constructed and destructed like a pair: if `ha : a` and `hb : b` then
    `⟨ha, hb⟩ : a ∧ b`, and if `h : a ∧ b` then `h.left : a` and `h.right : b`.
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∧` in identifiers is `and`.
    
     * The recommended spelling of `/\` in identifiers is `and` (prefer `∧` over `/\`).
        NSubgroup G  Subgroup.zpowersSubgroup.zpowers.{u_1} {G : Type u_1} [Group G] (g : G) : Subgroup GThe subgroup generated by an element.  tG =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. Bot.bot.{u_1} {α : Type u_1} [self : Bot α] : αThe bot (`⊥`, `\bot`) element 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `⊥` in identifiers is `bot`.
    **Lemma 3.1, normal 2-subgroup part.**  Let `G` be a finite group generated
    by `s, t` with the tame relation `tˢ = t²`.  Then every normal `2`-subgroup `N`
    of `G` is **central** (`N ≤ center G`) and **lies in the unramified cyclic
    direction**, formalised as having trivial intersection with the tame inertia
    `I = ⟨t⟩` (so `N` injects into the procyclic unramified quotient `G/⟨t⟩`).
    
    This matches the manuscript (`reference/q2_manuscript.tex`, l.412 & l.418): "every
    normal `2`-subgroup of such a quotient is central and lies in the unramified
    cyclic direction"; the proof there shows `N ∩ I = 1` and `[N, I] ≤ N ∩ I = 1`.
    
    Proof: `I = ⟨t⟩` has odd order (`finite_tame_tau_odd`); being a `2`-group, `N`
    meets `I` trivially (`N ⊓ I = ⊥`).  The relation makes `I` normal with cyclic —
    hence abelian — quotient `G/I`, so for every `g` and `n ∈ N` the commutator
    `g n g⁻¹ n⁻¹` lies in both `N` and `I`, i.e. in `N ⊓ I = ⊥`; thus every `g`
    commutes with every `n ∈ N`, i.e. `N ≤ center G`. 
  • defdefined in Q2Presentation/Boundary/TameMaxPro2.lean
    complete
    def Q2Presentation.Ttame_maximal_pro2 :
      Q2Presentation.MaximalPro2QuotientQ2Presentation.MaximalPro2Quotient.{u} (P : ProfiniteGrp.{u}) : ProfiniteGrp.{u}**The maximal pro-`2` quotient** `MaximalPro2Quotient P`, the cofiltered inverse
    limit (in `ProfiniteGrp`) of the finite `2`-group quotients of `P`.  Q2Presentation.TtameQ2Presentation.Ttame : ProfiniteGrp.{0}The profinite **tame group** `T_A`, the cofiltered inverse limit (in
    `ProfiniteGrp`) of all finite marked tame quotients (manuscript `T_A`, l.401).  CategoryTheory.Iso.{v, u} {C : Type u} [CategoryTheory.Category.{v, u} C] (X Y : C) : Type vAn isomorphism (a.k.a. an invertible morphism) between two objects of a category.
    The inverse morphism is bundled.
    
    See also `CategoryTheory.Core` for the category with the same objects and isomorphisms playing
    the role of morphisms. 
        Q2Presentation.ProfiniteZ2Q2Presentation.ProfiniteZ2 : ProfiniteGrp.{0}The profinite group `ℤ₂`, the inverse limit of the layers `C2Pow n`. 
    def Q2Presentation.Ttame_maximal_pro2 :
      Q2Presentation.MaximalPro2QuotientQ2Presentation.MaximalPro2Quotient.{u} (P : ProfiniteGrp.{u}) : ProfiniteGrp.{u}**The maximal pro-`2` quotient** `MaximalPro2Quotient P`, the cofiltered inverse
    limit (in `ProfiniteGrp`) of the finite `2`-group quotients of `P`. 
          Q2Presentation.TtameQ2Presentation.Ttame : ProfiniteGrp.{0}The profinite **tame group** `T_A`, the cofiltered inverse limit (in
    `ProfiniteGrp`) of all finite marked tame quotients (manuscript `T_A`, l.401).  CategoryTheory.Iso.{v, u} {C : Type u} [CategoryTheory.Category.{v, u} C] (X Y : C) : Type vAn isomorphism (a.k.a. an invertible morphism) between two objects of a category.
    The inverse morphism is bundled.
    
    See also `CategoryTheory.Core` for the category with the same objects and isomorphisms playing
    the role of morphisms. 
        Q2Presentation.ProfiniteZ2Q2Presentation.ProfiniteZ2 : ProfiniteGrp.{0}The profinite group `ℤ₂`, the inverse limit of the layers `C2Pow n`. 
    **The maximal pro-`2` quotient of the tame group is the unramified `ℤ₂`** (manuscript
    Lemma 3.1 + Prop 3.2).  The unramified character `nu_t` lifts (since `ℤ₂` is pro-`2`) to a
    canonical comparison `g : MaximalPro2Quotient Ttame ⟶ ℤ₂`; it is **surjective** because
    `nu_t` is, and **injective** by the maximality core `nu_t_ker_le` (every finite `2`-group
    quotient of `Ttame` kills `τ`, hence factors through the unramified line), so it is an
    isomorphism. 
  • theoremdefined in Q2Presentation/Induction/BaseModelHeadStructure.lean
    complete
    theorem Q2Presentation.Induction.headTau_zpowers_normal
      {pQ2Presentation.Induction.FramedPair : Q2Presentation.Induction.FramedPairQ2Presentation.Induction.FramedPair : Type 1A **framed pair** `(𝒴, F)`: a boundary-framed marked target together with a
    boundary frame for it (manuscript Definition 4.1 + `eq:beta`).  This is the index of
    Theorem 4.2: the boundary-framed surjection count `e_Γ^β` is a function of the pair.
    The induction of `sec:induction` ranges over *all* such pairs simultaneously
    ("the induction is stated globally", l.1213), ordered by `|L_Y|`. }
      (chiefQ2Presentation.Induction.FirstNonScalarChiefFactor p : Q2Presentation.Induction.FirstNonScalarChiefFactorQ2Presentation.Induction.FirstNonScalarChiefFactor (p : Q2Presentation.Induction.FramedPair) : TypeA non-scalar chief factor of `L_Y` that is **first**: every chief factor strictly
    below it (i.e. with upper term contained in `lower`) is scalar.  This is the manuscript's
    choice `S ◁ P` at l.3616–3623 ("all chief factors below `S` are scalar and `V` is the
    first non-scalar simple factor"), which `lem:collapse` requires for the coprime step
    `[S, Ñ] = 1`.  pQ2Presentation.Induction.FramedPair)
      (KQ2Presentation.Induction.KernelMinimal chief.toNonScalarChiefFactor :
        Q2Presentation.Induction.KernelMinimalQ2Presentation.Induction.KernelMinimal {p : Q2Presentation.Induction.FramedPair}
      (chief : Q2Presentation.Induction.NonScalarChiefFactor p) : TypeThe manuscript's kernel choice (l.3623): `K ◁ Y`, `K ≤ P`, `KS = P`, and `K` is
    **⊆-minimal** with these properties — stated as: any `Y`-normal `K' ≤ K` still joining
    with `S` to `P` equals `K`.  (This, not leastness among all candidates, is what
    `lem:simplehead` and `lem:collapse` use: both apply it to subgroups of `K`.) 
          chiefQ2Presentation.Induction.FirstNonScalarChiefFactor p.toNonScalarChiefFactorQ2Presentation.Induction.FirstNonScalarChiefFactor.toNonScalarChiefFactor {p : Q2Presentation.Induction.FramedPair}
      (self : Q2Presentation.Induction.FirstNonScalarChiefFactor p) : Q2Presentation.Induction.NonScalarChiefFactor p) :
      (Subgroup.zpowersSubgroup.zpowers.{u_1} {G : Type u_1} [Group G] (g : G) : Subgroup GThe subgroup generated by an element.  (Q2Presentation.Induction.headTauQ2Presentation.Induction.headTau {p : Q2Presentation.Induction.FramedPair}
      (chief : Q2Presentation.Induction.FirstNonScalarChiefFactor p)
      (K : Q2Presentation.Induction.KernelMinimal chief.toNonScalarChiefFactor) : Q2Presentation.Induction.HeadIm chief K**`τ̃` — THE canonical ramification operator of the block** (design
    §4.2/§4.5: `headTau = 1` exactly captures the unramified discharge
    below; when P8-S2a lands, `blockTameRamFlag` is to be DEFINED as the
    Bool-spelling of `headTau ≠ 1`, so the F-ram gate and the sign-lane
    flag are the same object).  chiefQ2Presentation.Induction.FirstNonScalarChiefFactor p KQ2Presentation.Induction.KernelMinimal chief.toNonScalarChiefFactor)).NormalSubgroup.Normal.{u_1} {G : Type u_1} [Group G] (H : Subgroup G) : PropA subgroup `H` is normal if whenever `n ∈ H`, then `g * n * g⁻¹ ∈ H` for every `g : G` 
    theorem Q2Presentation.Induction.headTau_zpowers_normal
      {pQ2Presentation.Induction.FramedPair :
        Q2Presentation.Induction.FramedPairQ2Presentation.Induction.FramedPair : Type 1A **framed pair** `(𝒴, F)`: a boundary-framed marked target together with a
    boundary frame for it (manuscript Definition 4.1 + `eq:beta`).  This is the index of
    Theorem 4.2: the boundary-framed surjection count `e_Γ^β` is a function of the pair.
    The induction of `sec:induction` ranges over *all* such pairs simultaneously
    ("the induction is stated globally", l.1213), ordered by `|L_Y|`. }
      (chiefQ2Presentation.Induction.FirstNonScalarChiefFactor p :
        Q2Presentation.Induction.FirstNonScalarChiefFactorQ2Presentation.Induction.FirstNonScalarChiefFactor (p : Q2Presentation.Induction.FramedPair) : TypeA non-scalar chief factor of `L_Y` that is **first**: every chief factor strictly
    below it (i.e. with upper term contained in `lower`) is scalar.  This is the manuscript's
    choice `S ◁ P` at l.3616–3623 ("all chief factors below `S` are scalar and `V` is the
    first non-scalar simple factor"), which `lem:collapse` requires for the coprime step
    `[S, Ñ] = 1`. 
          pQ2Presentation.Induction.FramedPair)
      (KQ2Presentation.Induction.KernelMinimal chief.toNonScalarChiefFactor :
        Q2Presentation.Induction.KernelMinimalQ2Presentation.Induction.KernelMinimal {p : Q2Presentation.Induction.FramedPair}
      (chief : Q2Presentation.Induction.NonScalarChiefFactor p) : TypeThe manuscript's kernel choice (l.3623): `K ◁ Y`, `K ≤ P`, `KS = P`, and `K` is
    **⊆-minimal** with these properties — stated as: any `Y`-normal `K' ≤ K` still joining
    with `S` to `P` equals `K`.  (This, not leastness among all candidates, is what
    `lem:simplehead` and `lem:collapse` use: both apply it to subgroups of `K`.) 
          chiefQ2Presentation.Induction.FirstNonScalarChiefFactor p.toNonScalarChiefFactorQ2Presentation.Induction.FirstNonScalarChiefFactor.toNonScalarChiefFactor {p : Q2Presentation.Induction.FramedPair}
      (self : Q2Presentation.Induction.FirstNonScalarChiefFactor p) : Q2Presentation.Induction.NonScalarChiefFactor p) :
      (Subgroup.zpowersSubgroup.zpowers.{u_1} {G : Type u_1} [Group G] (g : G) : Subgroup GThe subgroup generated by an element. 
          (Q2Presentation.Induction.headTauQ2Presentation.Induction.headTau {p : Q2Presentation.Induction.FramedPair}
      (chief : Q2Presentation.Induction.FirstNonScalarChiefFactor p)
      (K : Q2Presentation.Induction.KernelMinimal chief.toNonScalarChiefFactor) : Q2Presentation.Induction.HeadIm chief K**`τ̃` — THE canonical ramification operator of the block** (design
    §4.2/§4.5: `headTau = 1` exactly captures the unramified discharge
    below; when P8-S2a lands, `blockTameRamFlag` is to be DEFINED as the
    Bool-spelling of `headTau ≠ 1`, so the F-ram gate and the sign-lane
    flag are the same object). 
            chiefQ2Presentation.Induction.FirstNonScalarChiefFactor p KQ2Presentation.Induction.KernelMinimal chief.toNonScalarChiefFactor)).NormalSubgroup.Normal.{u_1} {G : Type u_1} [Group G] (H : Subgroup G) : PropA subgroup `H` is normal if whenever `n ∈ H`, then `g * n * g⁻¹ ∈ H` for every `g : G` 
    **`⟨τ̃⟩ ⊴ HeadIm`** — normal inertia (design §4.1 F-H4), via the
    banked GREEN generic `OddSplitting.tame_zpowers_normal`
    (`Lifting/OddSplitting.lean:214` — generation + tame relation + odd
    order; the mechanism of manuscript Lemma 3.1). 
  • theoremdefined in Q2Presentation/Lifting/OddSplitting.lean
    complete
    theorem Q2Presentation.OddSplitting.tame_zpowers_normal.{u_4} {GType u_4 : Type u_4A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. }
      [GroupGroup.{u} (G : Type u) : Type uA `Group` is a `Monoid` with an operation `⁻¹` satisfying `a⁻¹ * a = 1`.
    
    There is also a division operation `/` such that `a / b = a * b⁻¹`,
    with a default so that `a / b = a * b⁻¹` holds by definition.
    
    Use `Group.ofLeftAxioms` or `Group.ofRightAxioms` to define a group structure
    on a type with the minimum proof obligations.
     GType u_4] [FiniteFinite.{u_3} (α : Sort u_3) : PropA type is `Finite` if it is in bijective correspondence to some `Fin n`.
    
    This is similar to `Fintype`, but `Finite` is a proposition rather than data.
    A particular benefit to this is that `Finite` instances are definitionally equal to one another
    (due to proof irrelevance) rather than being merely propositionally equal,
    and, furthermore, `Finite` instances generally avoid the need for `Decidable` instances.
    One other notable difference is that `Finite` allows there to be `Finite p` instances
    for all `p : Prop`, which is not allowed by `Fintype` due to universe constraints.
    An application of this is that `Finite (x ∈ s → β x)` follows from the general instance for pi
    types, assuming `[∀ x, Finite (β x)]`.
    Implementation note: this is a reason `Finite α` is not defined as `Nonempty (Fintype α)`.
    
    Every `Fintype` instance provides a `Finite` instance via `Finite.of_fintype`.
    Conversely, one can noncomputably create a `Fintype` instance from a `Finite` instance
    via `Fintype.ofFinite`. In a proof one might write
    ```lean
      have := Fintype.ofFinite α
    ```
    to obtain such an instance.
    
    Do not write noncomputable `Fintype` instances; instead write `Finite` instances
    and use this `Fintype.ofFinite` interface.
    The `Fintype` instances should be relied upon to be computable for evaluation purposes.
    
    Theorems should use `Finite` instead of `Fintype`, unless definitions in the theorem statement
    require `Fintype`.
    Definitions should prefer `Finite` as well, unless it is important that the definitions
    are meant to be computable in the reduction or `#eval` sense.
     GType u_4] {sG tG : GType u_4} (hgenSubgroup.closure {s, t} = ⊤ : Subgroup.closureSubgroup.closure.{u_1} {G : Type u_1} [Group G] (k : Set G) : Subgroup GThe `Subgroup` generated by a set.  {Insert.insert.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Insert α γ] : α → γ → γ`insert x xs` inserts the element `x` into the collection `xs`. sG,Insert.insert.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Insert α γ] : α → γ → γ`insert x xs` inserts the element `x` into the collection `xs`.  tG}Insert.insert.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Insert α γ] : α → γ → γ`insert x xs` inserts the element `x` into the collection `xs`.  =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. Top.top.{u_1} {α : Type u_1} [self : Top α] : αThe top (`⊤`, `\top`) element 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `⊤` in identifiers is `top`.)
      (htames⁻¹ * t * s = t ^ 2 : sG⁻¹Inv.inv.{u} {α : Type u} [self : Inv α] : α → α`a⁻¹` computes the inverse of `a`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `⁻¹` in identifiers is `inv`. *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. tG *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. sG =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. tG ^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`. 2) (htoddOdd (orderOf t) : OddOdd.{u_2} {α : Type u_2} [Semiring α] (a : α) : PropAn element `a` of a semiring is odd if there exists `k` such `a = 2*k + 1`.  (orderOforderOf.{u_1} {G : Type u_1} [Monoid G] (x : G) : ℕ`orderOf x` is the order of the element `x`, i.e. the `n ≥ 1`, s.t. `x ^ n = 1` if it exists.
    Otherwise, i.e. if `x` is of infinite order, then `orderOf x` is `0` by convention.  tG)) :
      (Subgroup.zpowersSubgroup.zpowers.{u_1} {G : Type u_1} [Group G] (g : G) : Subgroup GThe subgroup generated by an element.  tG).NormalSubgroup.Normal.{u_1} {G : Type u_1} [Group G] (H : Subgroup G) : PropA subgroup `H` is normal if whenever `n ∈ H`, then `g * n * g⁻¹ ∈ H` for every `g : G` 
    theorem Q2Presentation.OddSplitting.tame_zpowers_normal.{u_4}
      {GType u_4 : Type u_4A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [GroupGroup.{u} (G : Type u) : Type uA `Group` is a `Monoid` with an operation `⁻¹` satisfying `a⁻¹ * a = 1`.
    
    There is also a division operation `/` such that `a / b = a * b⁻¹`,
    with a default so that `a / b = a * b⁻¹` holds by definition.
    
    Use `Group.ofLeftAxioms` or `Group.ofRightAxioms` to define a group structure
    on a type with the minimum proof obligations.
     GType u_4] [FiniteFinite.{u_3} (α : Sort u_3) : PropA type is `Finite` if it is in bijective correspondence to some `Fin n`.
    
    This is similar to `Fintype`, but `Finite` is a proposition rather than data.
    A particular benefit to this is that `Finite` instances are definitionally equal to one another
    (due to proof irrelevance) rather than being merely propositionally equal,
    and, furthermore, `Finite` instances generally avoid the need for `Decidable` instances.
    One other notable difference is that `Finite` allows there to be `Finite p` instances
    for all `p : Prop`, which is not allowed by `Fintype` due to universe constraints.
    An application of this is that `Finite (x ∈ s → β x)` follows from the general instance for pi
    types, assuming `[∀ x, Finite (β x)]`.
    Implementation note: this is a reason `Finite α` is not defined as `Nonempty (Fintype α)`.
    
    Every `Fintype` instance provides a `Finite` instance via `Finite.of_fintype`.
    Conversely, one can noncomputably create a `Fintype` instance from a `Finite` instance
    via `Fintype.ofFinite`. In a proof one might write
    ```lean
      have := Fintype.ofFinite α
    ```
    to obtain such an instance.
    
    Do not write noncomputable `Fintype` instances; instead write `Finite` instances
    and use this `Fintype.ofFinite` interface.
    The `Fintype` instances should be relied upon to be computable for evaluation purposes.
    
    Theorems should use `Finite` instead of `Fintype`, unless definitions in the theorem statement
    require `Fintype`.
    Definitions should prefer `Finite` as well, unless it is important that the definitions
    are meant to be computable in the reduction or `#eval` sense.
     GType u_4]
      {sG tG : GType u_4}
      (hgenSubgroup.closure {s, t} = ⊤ : Subgroup.closureSubgroup.closure.{u_1} {G : Type u_1} [Group G] (k : Set G) : Subgroup GThe `Subgroup` generated by a set.  {Insert.insert.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Insert α γ] : α → γ → γ`insert x xs` inserts the element `x` into the collection `xs`. sG,Insert.insert.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Insert α γ] : α → γ → γ`insert x xs` inserts the element `x` into the collection `xs`.  tG}Insert.insert.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Insert α γ] : α → γ → γ`insert x xs` inserts the element `x` into the collection `xs`.  =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. Top.top.{u_1} {α : Type u_1} [self : Top α] : αThe top (`⊤`, `\top`) element 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `⊤` in identifiers is `top`.)
      (htames⁻¹ * t * s = t ^ 2 : sG⁻¹Inv.inv.{u} {α : Type u} [self : Inv α] : α → α`a⁻¹` computes the inverse of `a`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `⁻¹` in identifiers is `inv`. *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. tG *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. sG =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. tG ^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`. 2)
      (htoddOdd (orderOf t) : OddOdd.{u_2} {α : Type u_2} [Semiring α] (a : α) : PropAn element `a` of a semiring is odd if there exists `k` such `a = 2*k + 1`.  (orderOforderOf.{u_1} {G : Type u_1} [Monoid G] (x : G) : ℕ`orderOf x` is the order of the element `x`, i.e. the `n ≥ 1`, s.t. `x ^ n = 1` if it exists.
    Otherwise, i.e. if `x` is of infinite order, then `orderOf x` is `0` by convention.  tG)) :
      (Subgroup.zpowersSubgroup.zpowers.{u_1} {G : Type u_1} [Group G] (g : G) : Subgroup GThe subgroup generated by an element.  tG).NormalSubgroup.Normal.{u_1} {G : Type u_1} [Group G] (H : Subgroup G) : PropA subgroup `H` is normal if whenever `n ∈ H`, then `g * n * g⁻¹ ∈ H` for every `g : G` 
    In a finite group generated by `s, t` with the tame relation
    `s⁻¹ t s = t²`, the subgroup `⟨t⟩` is normal (manuscript Lemma 3.1
    mechanism). 
Theorem3.2
Group: The tame and maximal pro-2 quotients (6)
Hover another entry in this group to preview it.
L∃∀Nused by 1

Proposition 3.2 of the paper (Common tame quotient).

There are canonical isomorphisms

\GA/\WA\cong \TA\cong \GQ/\WF,

where \WF is wild inertia.

Lean code for Theorem3.22 theorems
  • theoremdefined in Q2Presentation/Induction/FrameExhaustion.lean
    complete
    theorem Q2Presentation.Induction.gammaA_tameQuotientFactor (GType : TypeA type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. ) [GroupGroup.{u} (G : Type u) : Type uA `Group` is a `Monoid` with an operation `⁻¹` satisfying `a⁻¹ * a = 1`.
    
    There is also a division operation `/` such that `a / b = a * b⁻¹`,
    with a default so that `a / b = a * b⁻¹` holds by definition.
    
    Use `Group.ofLeftAxioms` or `Group.ofRightAxioms` to define a group structure
    on a type with the minimum proof obligations.
     GType]
      [FiniteFinite.{u_3} (α : Sort u_3) : PropA type is `Finite` if it is in bijective correspondence to some `Fin n`.
    
    This is similar to `Fintype`, but `Finite` is a proposition rather than data.
    A particular benefit to this is that `Finite` instances are definitionally equal to one another
    (due to proof irrelevance) rather than being merely propositionally equal,
    and, furthermore, `Finite` instances generally avoid the need for `Decidable` instances.
    One other notable difference is that `Finite` allows there to be `Finite p` instances
    for all `p : Prop`, which is not allowed by `Fintype` due to universe constraints.
    An application of this is that `Finite (x ∈ s → β x)` follows from the general instance for pi
    types, assuming `[∀ x, Finite (β x)]`.
    Implementation note: this is a reason `Finite α` is not defined as `Nonempty (Fintype α)`.
    
    Every `Fintype` instance provides a `Finite` instance via `Finite.of_fintype`.
    Conversely, one can noncomputably create a `Fintype` instance from a `Finite` instance
    via `Fintype.ofFinite`. In a proof one might write
    ```lean
      have := Fintype.ofFinite α
    ```
    to obtain such an instance.
    
    Do not write noncomputable `Fintype` instances; instead write `Finite` instances
    and use this `Fintype.ofFinite` interface.
    The `Fintype` instances should be relied upon to be computable for evaluation purposes.
    
    Theorems should use `Finite` instead of `Fintype`, unless definitions in the theorem statement
    require `Fintype`.
    Definitions should prefer `Finite` as well, unless it is important that the definitions
    are meant to be computable in the reduction or `#eval` sense.
     GType] [NonemptyNonempty.{u} (α : Sort u) : Prop`Nonempty α` is a typeclass that says that `α` is not an empty type,
    that is, there exists an element in the type. It differs from `Inhabited α`
    in that `Nonempty α` is a `Prop`, which means that it does not actually carry
    an element of `α`, only a proof that *there exists* such an element.
    Given `Nonempty α`, you can construct an element of `α` *nonconstructively*
    using `Classical.choice`.
     GType]
      (fQ2Presentation.Profinite.SurjContHom Q2Presentation.GammaA (ProfiniteGrp.ofFiniteGrp (FiniteGrp.of G)) :
        Q2Presentation.Profinite.SurjContHomQ2Presentation.Profinite.SurjContHom.{u} (P Q : ProfiniteGrp.{u}) : Type uA surjective continuous homomorphism of profinite groups (a profinite
    "epimorphism", recorded as data: the morphism together with surjectivity of the
    underlying map).  Q2Presentation.GammaAQ2Presentation.GammaA : ProfiniteGrp.{0}The candidate profinite group `Γ_A`, the cofiltered inverse limit (in
    `ProfiniteGrp`) of all admissible finite marked quotients (manuscript
    eq. `candidateinverse`). 
          (ProfiniteGrp.ofFiniteGrpProfiniteGrp.ofFiniteGrp.{u_1} (G : FiniteGrp.{u_1}) : ProfiniteGrp.{u_1}A `FiniteGrp` when given the discrete topology can be considered as a profinite group.  (FiniteGrp.ofFiniteGrp.of.{u} (G : Type u) [Group G] [Finite G] : FiniteGrp.{u}Construct a term of `FiniteGrp` from a type endowed with the structure of a finite group.  GType))) :
       αQ2Presentation.Ttame ⟶ ProfiniteGrp.ofFiniteGrp (FiniteGrp.of (G ⧸ Q2Presentation.twoCore G)),
         (γ↑Q2Presentation.GammaA.toProfinite.toTop : Q2Presentation.GammaAQ2Presentation.GammaA : ProfiniteGrp.{0}The candidate profinite group `Γ_A`, the cofiltered inverse limit (in
    `ProfiniteGrp`) of all admissible finite marked quotients (manuscript
    eq. `candidateinverse`). .toProfiniteProfiniteGrp.toProfinite.{u_1} (self : ProfiniteGrp.{u_1}) : ProfiniteThe underlying profinite topological space. .toTopCompHausLike.toTop.{u} {P : TopCat → Prop} (self : CompHausLike P) : TopCatThe underlying topological space of an object of `CompHausLike P`. ),
          (QuotientGroup.mk'QuotientGroup.mk'.{u_1} {G : Type u_1} [Group G] (N : Subgroup G) [nN : N.Normal] : G →* G ⧸ NThe group homomorphism from `G` to `G/N`.  (Q2Presentation.twoCoreQ2Presentation.twoCore.{u_1} (G : Type u_1) [Group G] : Subgroup GThe **2-core** `O₂(G)` — the wild subgroup of the `Q₂` presentation.  GType))
              ((ProfiniteGrp.Hom.homProfiniteGrp.Hom.hom.{u} {M N : ProfiniteGrp.{u}} (f : M.Hom N) : ↑M.toProfinite.toTop →ₜ* ↑N.toProfinite.toTopThe underlying `ContinuousMonoidHom`.  fQ2Presentation.Profinite.SurjContHom Q2Presentation.GammaA (ProfiniteGrp.ofFiniteGrp (FiniteGrp.of G)).homQ2Presentation.Profinite.SurjContHom.hom.{u} {P Q : ProfiniteGrp.{u}}
      (self : Q2Presentation.Profinite.SurjContHom P Q) : P ⟶ QThe underlying morphism of profinite groups. ) γ↑Q2Presentation.GammaA.toProfinite.toTop) =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
            (ProfiniteGrp.Hom.homProfiniteGrp.Hom.hom.{u} {M N : ProfiniteGrp.{u}} (f : M.Hom N) : ↑M.toProfinite.toTop →ₜ* ↑N.toProfinite.toTopThe underlying `ContinuousMonoidHom`.  αQ2Presentation.Ttame ⟶ ProfiniteGrp.ofFiniteGrp (FiniteGrp.of (G ⧸ Q2Presentation.twoCore G)))
              ((ProfiniteGrp.Hom.homProfiniteGrp.Hom.hom.{u} {M N : ProfiniteGrp.{u}} (f : M.Hom N) : ↑M.toProfinite.toTop →ₜ* ↑N.toProfinite.toTopThe underlying `ContinuousMonoidHom`. 
                  Q2Presentation.boundaryPackage_GammaAQ2Presentation.boundaryPackage_GammaA : Q2Presentation.BoundaryPackage Q2Presentation.GammaA**The candidate boundary package** (manuscript Prop 3.14, `prop:compatiblemarking`;
    plan Turn 4 §6).  The Stage-C data of `Γ_A`: the common tame quotient `gammaTameMap`,
    the maximal pro-`2` quotient `p : Γ_A ⟶ Π`, and the common unramified character
    `ν = gammaTameMap ≫ ν_t`, through which both factor. .tameMapQ2Presentation.BoundaryPackage.tameMap {Γ : ProfiniteGrp.{0}} (self : Q2Presentation.BoundaryPackage Γ) :
      Γ ⟶ Q2Presentation.TtameThe tame quotient map `Γ ↠ T_A`. )
                γ↑Q2Presentation.GammaA.toProfinite.toTop)
    theorem Q2Presentation.Induction.gammaA_tameQuotientFactor
      (GType : TypeA type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. ) [GroupGroup.{u} (G : Type u) : Type uA `Group` is a `Monoid` with an operation `⁻¹` satisfying `a⁻¹ * a = 1`.
    
    There is also a division operation `/` such that `a / b = a * b⁻¹`,
    with a default so that `a / b = a * b⁻¹` holds by definition.
    
    Use `Group.ofLeftAxioms` or `Group.ofRightAxioms` to define a group structure
    on a type with the minimum proof obligations.
     GType] [FiniteFinite.{u_3} (α : Sort u_3) : PropA type is `Finite` if it is in bijective correspondence to some `Fin n`.
    
    This is similar to `Fintype`, but `Finite` is a proposition rather than data.
    A particular benefit to this is that `Finite` instances are definitionally equal to one another
    (due to proof irrelevance) rather than being merely propositionally equal,
    and, furthermore, `Finite` instances generally avoid the need for `Decidable` instances.
    One other notable difference is that `Finite` allows there to be `Finite p` instances
    for all `p : Prop`, which is not allowed by `Fintype` due to universe constraints.
    An application of this is that `Finite (x ∈ s → β x)` follows from the general instance for pi
    types, assuming `[∀ x, Finite (β x)]`.
    Implementation note: this is a reason `Finite α` is not defined as `Nonempty (Fintype α)`.
    
    Every `Fintype` instance provides a `Finite` instance via `Finite.of_fintype`.
    Conversely, one can noncomputably create a `Fintype` instance from a `Finite` instance
    via `Fintype.ofFinite`. In a proof one might write
    ```lean
      have := Fintype.ofFinite α
    ```
    to obtain such an instance.
    
    Do not write noncomputable `Fintype` instances; instead write `Finite` instances
    and use this `Fintype.ofFinite` interface.
    The `Fintype` instances should be relied upon to be computable for evaluation purposes.
    
    Theorems should use `Finite` instead of `Fintype`, unless definitions in the theorem statement
    require `Fintype`.
    Definitions should prefer `Finite` as well, unless it is important that the definitions
    are meant to be computable in the reduction or `#eval` sense.
     GType]
      [NonemptyNonempty.{u} (α : Sort u) : Prop`Nonempty α` is a typeclass that says that `α` is not an empty type,
    that is, there exists an element in the type. It differs from `Inhabited α`
    in that `Nonempty α` is a `Prop`, which means that it does not actually carry
    an element of `α`, only a proof that *there exists* such an element.
    Given `Nonempty α`, you can construct an element of `α` *nonconstructively*
    using `Classical.choice`.
     GType]
      (fQ2Presentation.Profinite.SurjContHom Q2Presentation.GammaA (ProfiniteGrp.ofFiniteGrp (FiniteGrp.of G)) :
        Q2Presentation.Profinite.SurjContHomQ2Presentation.Profinite.SurjContHom.{u} (P Q : ProfiniteGrp.{u}) : Type uA surjective continuous homomorphism of profinite groups (a profinite
    "epimorphism", recorded as data: the morphism together with surjectivity of the
    underlying map). 
          Q2Presentation.GammaAQ2Presentation.GammaA : ProfiniteGrp.{0}The candidate profinite group `Γ_A`, the cofiltered inverse limit (in
    `ProfiniteGrp`) of all admissible finite marked quotients (manuscript
    eq. `candidateinverse`). 
          (ProfiniteGrp.ofFiniteGrpProfiniteGrp.ofFiniteGrp.{u_1} (G : FiniteGrp.{u_1}) : ProfiniteGrp.{u_1}A `FiniteGrp` when given the discrete topology can be considered as a profinite group. 
            (FiniteGrp.ofFiniteGrp.of.{u} (G : Type u) [Group G] [Finite G] : FiniteGrp.{u}Construct a term of `FiniteGrp` from a type endowed with the structure of a finite group.  GType))) :
       αQ2Presentation.Ttame ⟶ ProfiniteGrp.ofFiniteGrp (FiniteGrp.of (G ⧸ Q2Presentation.twoCore G)),
        
          (γ↑Q2Presentation.GammaA.toProfinite.toTop :
            Q2Presentation.GammaAQ2Presentation.GammaA : ProfiniteGrp.{0}The candidate profinite group `Γ_A`, the cofiltered inverse limit (in
    `ProfiniteGrp`) of all admissible finite marked quotients (manuscript
    eq. `candidateinverse`). .toProfiniteProfiniteGrp.toProfinite.{u_1} (self : ProfiniteGrp.{u_1}) : ProfiniteThe underlying profinite topological space. .toTopCompHausLike.toTop.{u} {P : TopCat → Prop} (self : CompHausLike P) : TopCatThe underlying topological space of an object of `CompHausLike P`. ),
          (QuotientGroup.mk'QuotientGroup.mk'.{u_1} {G : Type u_1} [Group G] (N : Subgroup G) [nN : N.Normal] : G →* G ⧸ NThe group homomorphism from `G` to `G/N`. 
                (Q2Presentation.twoCoreQ2Presentation.twoCore.{u_1} (G : Type u_1) [Group G] : Subgroup GThe **2-core** `O₂(G)` — the wild subgroup of the `Q₂` presentation.  GType))
              ((ProfiniteGrp.Hom.homProfiniteGrp.Hom.hom.{u} {M N : ProfiniteGrp.{u}} (f : M.Hom N) : ↑M.toProfinite.toTop →ₜ* ↑N.toProfinite.toTopThe underlying `ContinuousMonoidHom`.  fQ2Presentation.Profinite.SurjContHom Q2Presentation.GammaA (ProfiniteGrp.ofFiniteGrp (FiniteGrp.of G)).homQ2Presentation.Profinite.SurjContHom.hom.{u} {P Q : ProfiniteGrp.{u}}
      (self : Q2Presentation.Profinite.SurjContHom P Q) : P ⟶ QThe underlying morphism of profinite groups. )
                γ↑Q2Presentation.GammaA.toProfinite.toTop) =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
            (ProfiniteGrp.Hom.homProfiniteGrp.Hom.hom.{u} {M N : ProfiniteGrp.{u}} (f : M.Hom N) : ↑M.toProfinite.toTop →ₜ* ↑N.toProfinite.toTopThe underlying `ContinuousMonoidHom`.  αQ2Presentation.Ttame ⟶ ProfiniteGrp.ofFiniteGrp (FiniteGrp.of (G ⧸ Q2Presentation.twoCore G)))
              ((ProfiniteGrp.Hom.homProfiniteGrp.Hom.hom.{u} {M N : ProfiniteGrp.{u}} (f : M.Hom N) : ↑M.toProfinite.toTop →ₜ* ↑N.toProfinite.toTopThe underlying `ContinuousMonoidHom`. 
                  Q2Presentation.boundaryPackage_GammaAQ2Presentation.boundaryPackage_GammaA : Q2Presentation.BoundaryPackage Q2Presentation.GammaA**The candidate boundary package** (manuscript Prop 3.14, `prop:compatiblemarking`;
    plan Turn 4 §6).  The Stage-C data of `Γ_A`: the common tame quotient `gammaTameMap`,
    the maximal pro-`2` quotient `p : Γ_A ⟶ Π`, and the common unramified character
    `ν = gammaTameMap ≫ ν_t`, through which both factor. .tameMapQ2Presentation.BoundaryPackage.tameMap {Γ : ProfiniteGrp.{0}} (self : Q2Presentation.BoundaryPackage Γ) :
      Γ ⟶ Q2Presentation.TtameThe tame quotient map `Γ ↠ T_A`. )
                γ↑Q2Presentation.GammaA.toProfinite.toTop)
    **Tame-quotient factorization, candidate side** (manuscript `prop:tamequotient` for
    `Γ_A`, the sole non-bookkeeping content of `lem:tameframeexhaustion`).  Every continuous
    epimorphism `f : Γ_A ↠ G` onto a finite group induces a quotient map `Γ_A ↠ G/O₂(G)`
    that **factors through the candidate tame quotient** `gammaTameMap : Γ_A ↠ T_A`: there is
    `α : T_A ⟶ G/O₂(G)` with `mk ∘ f = α ∘ gammaTameMap`.  Equivalently the characteristic
    wild subgroup `ker(gammaTameMap) = W_A` maps into `O₂(G)` under `f`.
    
    This is the universal property of the tame quotient `T_A` (the maximal quotient seeing
    no wild `2`-part), i.e. `lem:o2tame` `O₂(Γ_A) = W_A` together with functoriality of the
    `2`-core.  It is genuinely irreducible and *absent from the codebase*: the candidate
    kernel characterisation `ker(gammaTameMap) = W_A` is explicitly left unproved
    (`Boundary/CandidateTame.lean` module docstring), so the factorization cannot be derived
    from `GammaA_epi_equiv_admissible` (admissibility only places the *generators* `x₀, x₁`
    in `O₂`, not the whole closed wild kernel).  It assumes nothing about surjection
    *counts* — only a single `f`'s factorization.  Surjectivity of `α` is *derived*
    (`alpha_surjective_of_factor`). 
  • theoremdefined in Q2Presentation/Induction/FrameExhaustion.lean
    complete
    theorem Q2Presentation.Induction.gq2_tameQuotientFactor (GType : TypeA type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. ) [GroupGroup.{u} (G : Type u) : Type uA `Group` is a `Monoid` with an operation `⁻¹` satisfying `a⁻¹ * a = 1`.
    
    There is also a division operation `/` such that `a / b = a * b⁻¹`,
    with a default so that `a / b = a * b⁻¹` holds by definition.
    
    Use `Group.ofLeftAxioms` or `Group.ofRightAxioms` to define a group structure
    on a type with the minimum proof obligations.
     GType]
      [FiniteFinite.{u_3} (α : Sort u_3) : PropA type is `Finite` if it is in bijective correspondence to some `Fin n`.
    
    This is similar to `Fintype`, but `Finite` is a proposition rather than data.
    A particular benefit to this is that `Finite` instances are definitionally equal to one another
    (due to proof irrelevance) rather than being merely propositionally equal,
    and, furthermore, `Finite` instances generally avoid the need for `Decidable` instances.
    One other notable difference is that `Finite` allows there to be `Finite p` instances
    for all `p : Prop`, which is not allowed by `Fintype` due to universe constraints.
    An application of this is that `Finite (x ∈ s → β x)` follows from the general instance for pi
    types, assuming `[∀ x, Finite (β x)]`.
    Implementation note: this is a reason `Finite α` is not defined as `Nonempty (Fintype α)`.
    
    Every `Fintype` instance provides a `Finite` instance via `Finite.of_fintype`.
    Conversely, one can noncomputably create a `Fintype` instance from a `Finite` instance
    via `Fintype.ofFinite`. In a proof one might write
    ```lean
      have := Fintype.ofFinite α
    ```
    to obtain such an instance.
    
    Do not write noncomputable `Fintype` instances; instead write `Finite` instances
    and use this `Fintype.ofFinite` interface.
    The `Fintype` instances should be relied upon to be computable for evaluation purposes.
    
    Theorems should use `Finite` instead of `Fintype`, unless definitions in the theorem statement
    require `Fintype`.
    Definitions should prefer `Finite` as well, unless it is important that the definitions
    are meant to be computable in the reduction or `#eval` sense.
     GType] [NonemptyNonempty.{u} (α : Sort u) : Prop`Nonempty α` is a typeclass that says that `α` is not an empty type,
    that is, there exists an element in the type. It differs from `Inhabited α`
    in that `Nonempty α` is a `Prop`, which means that it does not actually carry
    an element of `α`, only a proof that *there exists* such an element.
    Given `Nonempty α`, you can construct an element of `α` *nonconstructively*
    using `Classical.choice`.
     GType]
      (fQ2Presentation.Profinite.SurjContHom Q2Presentation.GQ2Profinite (ProfiniteGrp.ofFiniteGrp (FiniteGrp.of G)) :
        Q2Presentation.Profinite.SurjContHomQ2Presentation.Profinite.SurjContHom.{u} (P Q : ProfiniteGrp.{u}) : Type uA surjective continuous homomorphism of profinite groups (a profinite
    "epimorphism", recorded as data: the morphism together with surjectivity of the
    underlying map).  Q2Presentation.GQ2ProfiniteQ2Presentation.GQ2Profinite : ProfiniteGrp.{0}The absolute Galois group `G_{ℚ₂} = Gal(Q̄₂/ℚ₂)` of the `2`-adic field
    `ℚ₂ = ℚ_[2]`, as a profinite group.
    
    Concretely it is `Gal(SeparableClosure ℚ_[2] / ℚ_[2])`, packaged as an object of
    `ProfiniteGrp` by `InfiniteGalois.profiniteGalGrp`.  Since `ℚ_[2]` has
    characteristic `0` its separable closure is an algebraic closure, so this is the
    absolute Galois group in the usual sense, matching the manuscript's `G_{ℚ₂}`. 
          (ProfiniteGrp.ofFiniteGrpProfiniteGrp.ofFiniteGrp.{u_1} (G : FiniteGrp.{u_1}) : ProfiniteGrp.{u_1}A `FiniteGrp` when given the discrete topology can be considered as a profinite group.  (FiniteGrp.ofFiniteGrp.of.{u} (G : Type u) [Group G] [Finite G] : FiniteGrp.{u}Construct a term of `FiniteGrp` from a type endowed with the structure of a finite group.  GType))) :
       αQ2Presentation.Ttame ⟶ ProfiniteGrp.ofFiniteGrp (FiniteGrp.of (G ⧸ Q2Presentation.twoCore G)),
         (γ↑Q2Presentation.GQ2Profinite.toProfinite.toTop : Q2Presentation.GQ2ProfiniteQ2Presentation.GQ2Profinite : ProfiniteGrp.{0}The absolute Galois group `G_{ℚ₂} = Gal(Q̄₂/ℚ₂)` of the `2`-adic field
    `ℚ₂ = ℚ_[2]`, as a profinite group.
    
    Concretely it is `Gal(SeparableClosure ℚ_[2] / ℚ_[2])`, packaged as an object of
    `ProfiniteGrp` by `InfiniteGalois.profiniteGalGrp`.  Since `ℚ_[2]` has
    characteristic `0` its separable closure is an algebraic closure, so this is the
    absolute Galois group in the usual sense, matching the manuscript's `G_{ℚ₂}`. .toProfiniteProfiniteGrp.toProfinite.{u_1} (self : ProfiniteGrp.{u_1}) : ProfiniteThe underlying profinite topological space. .toTopCompHausLike.toTop.{u} {P : TopCat → Prop} (self : CompHausLike P) : TopCatThe underlying topological space of an object of `CompHausLike P`. ),
          (QuotientGroup.mk'QuotientGroup.mk'.{u_1} {G : Type u_1} [Group G] (N : Subgroup G) [nN : N.Normal] : G →* G ⧸ NThe group homomorphism from `G` to `G/N`.  (Q2Presentation.twoCoreQ2Presentation.twoCore.{u_1} (G : Type u_1) [Group G] : Subgroup GThe **2-core** `O₂(G)` — the wild subgroup of the `Q₂` presentation.  GType))
              ((ProfiniteGrp.Hom.homProfiniteGrp.Hom.hom.{u} {M N : ProfiniteGrp.{u}} (f : M.Hom N) : ↑M.toProfinite.toTop →ₜ* ↑N.toProfinite.toTopThe underlying `ContinuousMonoidHom`.  fQ2Presentation.Profinite.SurjContHom Q2Presentation.GQ2Profinite (ProfiniteGrp.ofFiniteGrp (FiniteGrp.of G)).homQ2Presentation.Profinite.SurjContHom.hom.{u} {P Q : ProfiniteGrp.{u}}
      (self : Q2Presentation.Profinite.SurjContHom P Q) : P ⟶ QThe underlying morphism of profinite groups. ) γ↑Q2Presentation.GQ2Profinite.toProfinite.toTop) =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
            (ProfiniteGrp.Hom.homProfiniteGrp.Hom.hom.{u} {M N : ProfiniteGrp.{u}} (f : M.Hom N) : ↑M.toProfinite.toTop →ₜ* ↑N.toProfinite.toTopThe underlying `ContinuousMonoidHom`.  αQ2Presentation.Ttame ⟶ ProfiniteGrp.ofFiniteGrp (FiniteGrp.of (G ⧸ Q2Presentation.twoCore G)))
              ((ProfiniteGrp.Hom.homProfiniteGrp.Hom.hom.{u} {M N : ProfiniteGrp.{u}} (f : M.Hom N) : ↑M.toProfinite.toTop →ₜ* ↑N.toProfinite.toTopThe underlying `ContinuousMonoidHom`. 
                  Q2Presentation.boundaryPackage_GQ2Q2Presentation.boundaryPackage_GQ2 : Q2Presentation.BoundaryPackage Q2Presentation.GQ2Profinite**The local boundary package** `boundaryPackage_GQ2 : BoundaryPackage G_{ℚ₂}`
    (manuscript Prop 3.14 `prop:compatiblemarking` for `Γ = G_{ℚ₂}`; plan Turn 4 §6),
    the `G_{ℚ₂}`-side instance of the uniform Stage-C boundary datum.
    
    * `tameMap`/`tame_surj`/`tame_nu` — the local tame quotient `G_{ℚ₂} ↠ T_A` with
      unramified marking `ν_loc`, from the axiom `gq2_tame_quotient` (Prop 3.2 + the
      local half of Prop `compatiblemarking`);
    * `pro2Map`/`pro2_surj`/`pro2_nu` — the local maximal pro-`2` quotient
      `G_{ℚ₂} ↠ Π` with the *same* unramified marking `ν_loc`, proved from the fully
      marked Labute comparison `labute_GQ2_maxPro2_marked` (`pro2Map_loc`,
      `pro2Map_loc_surjective`, `pro2Map_loc_nu`);
    * `nu := ν_loc` — the common unramified character through which both factor. .tameMapQ2Presentation.BoundaryPackage.tameMap {Γ : ProfiniteGrp.{0}} (self : Q2Presentation.BoundaryPackage Γ) :
      Γ ⟶ Q2Presentation.TtameThe tame quotient map `Γ ↠ T_A`. )
                γ↑Q2Presentation.GQ2Profinite.toProfinite.toTop)
    theorem Q2Presentation.Induction.gq2_tameQuotientFactor
      (GType : TypeA type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. ) [GroupGroup.{u} (G : Type u) : Type uA `Group` is a `Monoid` with an operation `⁻¹` satisfying `a⁻¹ * a = 1`.
    
    There is also a division operation `/` such that `a / b = a * b⁻¹`,
    with a default so that `a / b = a * b⁻¹` holds by definition.
    
    Use `Group.ofLeftAxioms` or `Group.ofRightAxioms` to define a group structure
    on a type with the minimum proof obligations.
     GType] [FiniteFinite.{u_3} (α : Sort u_3) : PropA type is `Finite` if it is in bijective correspondence to some `Fin n`.
    
    This is similar to `Fintype`, but `Finite` is a proposition rather than data.
    A particular benefit to this is that `Finite` instances are definitionally equal to one another
    (due to proof irrelevance) rather than being merely propositionally equal,
    and, furthermore, `Finite` instances generally avoid the need for `Decidable` instances.
    One other notable difference is that `Finite` allows there to be `Finite p` instances
    for all `p : Prop`, which is not allowed by `Fintype` due to universe constraints.
    An application of this is that `Finite (x ∈ s → β x)` follows from the general instance for pi
    types, assuming `[∀ x, Finite (β x)]`.
    Implementation note: this is a reason `Finite α` is not defined as `Nonempty (Fintype α)`.
    
    Every `Fintype` instance provides a `Finite` instance via `Finite.of_fintype`.
    Conversely, one can noncomputably create a `Fintype` instance from a `Finite` instance
    via `Fintype.ofFinite`. In a proof one might write
    ```lean
      have := Fintype.ofFinite α
    ```
    to obtain such an instance.
    
    Do not write noncomputable `Fintype` instances; instead write `Finite` instances
    and use this `Fintype.ofFinite` interface.
    The `Fintype` instances should be relied upon to be computable for evaluation purposes.
    
    Theorems should use `Finite` instead of `Fintype`, unless definitions in the theorem statement
    require `Fintype`.
    Definitions should prefer `Finite` as well, unless it is important that the definitions
    are meant to be computable in the reduction or `#eval` sense.
     GType]
      [NonemptyNonempty.{u} (α : Sort u) : Prop`Nonempty α` is a typeclass that says that `α` is not an empty type,
    that is, there exists an element in the type. It differs from `Inhabited α`
    in that `Nonempty α` is a `Prop`, which means that it does not actually carry
    an element of `α`, only a proof that *there exists* such an element.
    Given `Nonempty α`, you can construct an element of `α` *nonconstructively*
    using `Classical.choice`.
     GType]
      (fQ2Presentation.Profinite.SurjContHom Q2Presentation.GQ2Profinite (ProfiniteGrp.ofFiniteGrp (FiniteGrp.of G)) :
        Q2Presentation.Profinite.SurjContHomQ2Presentation.Profinite.SurjContHom.{u} (P Q : ProfiniteGrp.{u}) : Type uA surjective continuous homomorphism of profinite groups (a profinite
    "epimorphism", recorded as data: the morphism together with surjectivity of the
    underlying map). 
          Q2Presentation.GQ2ProfiniteQ2Presentation.GQ2Profinite : ProfiniteGrp.{0}The absolute Galois group `G_{ℚ₂} = Gal(Q̄₂/ℚ₂)` of the `2`-adic field
    `ℚ₂ = ℚ_[2]`, as a profinite group.
    
    Concretely it is `Gal(SeparableClosure ℚ_[2] / ℚ_[2])`, packaged as an object of
    `ProfiniteGrp` by `InfiniteGalois.profiniteGalGrp`.  Since `ℚ_[2]` has
    characteristic `0` its separable closure is an algebraic closure, so this is the
    absolute Galois group in the usual sense, matching the manuscript's `G_{ℚ₂}`. 
          (ProfiniteGrp.ofFiniteGrpProfiniteGrp.ofFiniteGrp.{u_1} (G : FiniteGrp.{u_1}) : ProfiniteGrp.{u_1}A `FiniteGrp` when given the discrete topology can be considered as a profinite group. 
            (FiniteGrp.ofFiniteGrp.of.{u} (G : Type u) [Group G] [Finite G] : FiniteGrp.{u}Construct a term of `FiniteGrp` from a type endowed with the structure of a finite group.  GType))) :
       αQ2Presentation.Ttame ⟶ ProfiniteGrp.ofFiniteGrp (FiniteGrp.of (G ⧸ Q2Presentation.twoCore G)),
        
          (γ↑Q2Presentation.GQ2Profinite.toProfinite.toTop :
            Q2Presentation.GQ2ProfiniteQ2Presentation.GQ2Profinite : ProfiniteGrp.{0}The absolute Galois group `G_{ℚ₂} = Gal(Q̄₂/ℚ₂)` of the `2`-adic field
    `ℚ₂ = ℚ_[2]`, as a profinite group.
    
    Concretely it is `Gal(SeparableClosure ℚ_[2] / ℚ_[2])`, packaged as an object of
    `ProfiniteGrp` by `InfiniteGalois.profiniteGalGrp`.  Since `ℚ_[2]` has
    characteristic `0` its separable closure is an algebraic closure, so this is the
    absolute Galois group in the usual sense, matching the manuscript's `G_{ℚ₂}`. .toProfiniteProfiniteGrp.toProfinite.{u_1} (self : ProfiniteGrp.{u_1}) : ProfiniteThe underlying profinite topological space. .toTopCompHausLike.toTop.{u} {P : TopCat → Prop} (self : CompHausLike P) : TopCatThe underlying topological space of an object of `CompHausLike P`. ),
          (QuotientGroup.mk'QuotientGroup.mk'.{u_1} {G : Type u_1} [Group G] (N : Subgroup G) [nN : N.Normal] : G →* G ⧸ NThe group homomorphism from `G` to `G/N`. 
                (Q2Presentation.twoCoreQ2Presentation.twoCore.{u_1} (G : Type u_1) [Group G] : Subgroup GThe **2-core** `O₂(G)` — the wild subgroup of the `Q₂` presentation.  GType))
              ((ProfiniteGrp.Hom.homProfiniteGrp.Hom.hom.{u} {M N : ProfiniteGrp.{u}} (f : M.Hom N) : ↑M.toProfinite.toTop →ₜ* ↑N.toProfinite.toTopThe underlying `ContinuousMonoidHom`.  fQ2Presentation.Profinite.SurjContHom Q2Presentation.GQ2Profinite (ProfiniteGrp.ofFiniteGrp (FiniteGrp.of G)).homQ2Presentation.Profinite.SurjContHom.hom.{u} {P Q : ProfiniteGrp.{u}}
      (self : Q2Presentation.Profinite.SurjContHom P Q) : P ⟶ QThe underlying morphism of profinite groups. )
                γ↑Q2Presentation.GQ2Profinite.toProfinite.toTop) =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
            (ProfiniteGrp.Hom.homProfiniteGrp.Hom.hom.{u} {M N : ProfiniteGrp.{u}} (f : M.Hom N) : ↑M.toProfinite.toTop →ₜ* ↑N.toProfinite.toTopThe underlying `ContinuousMonoidHom`.  αQ2Presentation.Ttame ⟶ ProfiniteGrp.ofFiniteGrp (FiniteGrp.of (G ⧸ Q2Presentation.twoCore G)))
              ((ProfiniteGrp.Hom.homProfiniteGrp.Hom.hom.{u} {M N : ProfiniteGrp.{u}} (f : M.Hom N) : ↑M.toProfinite.toTop →ₜ* ↑N.toProfinite.toTopThe underlying `ContinuousMonoidHom`. 
                  Q2Presentation.boundaryPackage_GQ2Q2Presentation.boundaryPackage_GQ2 : Q2Presentation.BoundaryPackage Q2Presentation.GQ2Profinite**The local boundary package** `boundaryPackage_GQ2 : BoundaryPackage G_{ℚ₂}`
    (manuscript Prop 3.14 `prop:compatiblemarking` for `Γ = G_{ℚ₂}`; plan Turn 4 §6),
    the `G_{ℚ₂}`-side instance of the uniform Stage-C boundary datum.
    
    * `tameMap`/`tame_surj`/`tame_nu` — the local tame quotient `G_{ℚ₂} ↠ T_A` with
      unramified marking `ν_loc`, from the axiom `gq2_tame_quotient` (Prop 3.2 + the
      local half of Prop `compatiblemarking`);
    * `pro2Map`/`pro2_surj`/`pro2_nu` — the local maximal pro-`2` quotient
      `G_{ℚ₂} ↠ Π` with the *same* unramified marking `ν_loc`, proved from the fully
      marked Labute comparison `labute_GQ2_maxPro2_marked` (`pro2Map_loc`,
      `pro2Map_loc_surjective`, `pro2Map_loc_nu`);
    * `nu := ν_loc` — the common unramified character through which both factor. .tameMapQ2Presentation.BoundaryPackage.tameMap {Γ : ProfiniteGrp.{0}} (self : Q2Presentation.BoundaryPackage Γ) :
      Γ ⟶ Q2Presentation.TtameThe tame quotient map `Γ ↠ T_A`. )
                γ↑Q2Presentation.GQ2Profinite.toProfinite.toTop)
    **Tame-quotient factorization, local side** (manuscript `prop:tamequotient` for
    `G_{ℚ₂}`).  Every continuous epimorphism `f : G_{ℚ₂} ↠ G` onto a finite group induces a
    quotient map `G_{ℚ₂} ↠ G/O₂(G)` factoring through the local tame quotient
    `G_{ℚ₂} ↠ T_A`: there is `α : T_A ⟶ G/O₂(G)` with `mk ∘ f = α ∘ tameMap_loc`.
    
    This is genuine local class field theory (the maximal tame quotient `G_{ℚ₂}/W_F ≅ T_A`
    absorbs every map to a trivial-`2`-core finite group), and is now exposed as a theorem
    projecting the maximality/factorization field of the already-cited local tame datum
    `gq2_tame_quotient`.  It likewise concerns a single `f`, not surjection counts, so
    `#print axioms tameFrameExhaustion_proven` should contain `gq2_tame_quotient` rather
    than a separate `gq2_tameQuotientFactor` axiom. 
Proof

Proved in §3 of the paper. Ingredients: Lemma 3.1.

Lemma3.3
Group: The tame and maximal pro-2 quotients (6)
Hover another entry in this group to preview it.
L∃∀Nused by 0

Lemma 3.3 of the paper (The wild subgroup is the characteristic 2-core).

The tame group \TA has no nontrivial closed normal pro-2 subgroup. Consequently

O_2(\GA)=\WA, \qquad O_2(\GQ)=\WF.

In particular, the marked wild subgroups of the two sources are characteristic.

Lean code for Lemma3.31 theorem
  • theoremdefined in Q2Presentation/Foundation/TwoCore.lean
    complete
    theorem Q2Presentation.quotient_by_twoCore_has_no_nontrivial_normal_two_subgroup.{u_1}
      (GType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. ) [GroupGroup.{u} (G : Type u) : Type uA `Group` is a `Monoid` with an operation `⁻¹` satisfying `a⁻¹ * a = 1`.
    
    There is also a division operation `/` such that `a / b = a * b⁻¹`,
    with a default so that `a / b = a * b⁻¹` holds by definition.
    
    Use `Group.ofLeftAxioms` or `Group.ofRightAxioms` to define a group structure
    on a type with the minimum proof obligations.
     GType u_1] [FiniteFinite.{u_3} (α : Sort u_3) : PropA type is `Finite` if it is in bijective correspondence to some `Fin n`.
    
    This is similar to `Fintype`, but `Finite` is a proposition rather than data.
    A particular benefit to this is that `Finite` instances are definitionally equal to one another
    (due to proof irrelevance) rather than being merely propositionally equal,
    and, furthermore, `Finite` instances generally avoid the need for `Decidable` instances.
    One other notable difference is that `Finite` allows there to be `Finite p` instances
    for all `p : Prop`, which is not allowed by `Fintype` due to universe constraints.
    An application of this is that `Finite (x ∈ s → β x)` follows from the general instance for pi
    types, assuming `[∀ x, Finite (β x)]`.
    Implementation note: this is a reason `Finite α` is not defined as `Nonempty (Fintype α)`.
    
    Every `Fintype` instance provides a `Finite` instance via `Finite.of_fintype`.
    Conversely, one can noncomputably create a `Fintype` instance from a `Finite` instance
    via `Fintype.ofFinite`. In a proof one might write
    ```lean
      have := Fintype.ofFinite α
    ```
    to obtain such an instance.
    
    Do not write noncomputable `Fintype` instances; instead write `Finite` instances
    and use this `Fintype.ofFinite` interface.
    The `Fintype` instances should be relied upon to be computable for evaluation purposes.
    
    Theorems should use `Finite` instead of `Fintype`, unless definitions in the theorem statement
    require `Fintype`.
    Definitions should prefer `Finite` as well, unless it is important that the definitions
    are meant to be computable in the reduction or `#eval` sense.
     GType u_1]
      (NSubgroup (G ⧸ Q2Presentation.twoCore G) : SubgroupSubgroup.{u_3} (G : Type u_3) [Group G] : Type u_3A subgroup of a group `G` is a subset containing 1, closed under multiplication
    and closed under multiplicative inverse.  (HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
    GType u_1 HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     Q2Presentation.twoCoreQ2Presentation.twoCore.{u_1} (G : Type u_1) [Group G] : Subgroup GThe **2-core** `O₂(G)` — the wild subgroup of the `Q₂` presentation.  GType u_1)HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
    ) (hNN.Normal : NSubgroup (G ⧸ Q2Presentation.twoCore G).NormalSubgroup.Normal.{u_1} {G : Type u_1} [Group G] (H : Subgroup G) : PropA subgroup `H` is normal if whenever `n ∈ H`, then `g * n * g⁻¹ ∈ H` for every `g : G` )
      (h2IsPGroup 2 ↥N : IsPGroupIsPGroup.{u_1} (p : ℕ) (G : Type u_1) [Group G] : PropA p-group is a group in which the order of every element is a power of `p`.  2 NSubgroup (G ⧸ Q2Presentation.twoCore G)) : NSubgroup (G ⧸ Q2Presentation.twoCore G) =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. Bot.bot.{u_1} {α : Type u_1} [self : Bot α] : αThe bot (`⊥`, `\bot`) element 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `⊥` in identifiers is `bot`.
    theorem Q2Presentation.quotient_by_twoCore_has_no_nontrivial_normal_two_subgroup.{u_1}
      (GType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. ) [GroupGroup.{u} (G : Type u) : Type uA `Group` is a `Monoid` with an operation `⁻¹` satisfying `a⁻¹ * a = 1`.
    
    There is also a division operation `/` such that `a / b = a * b⁻¹`,
    with a default so that `a / b = a * b⁻¹` holds by definition.
    
    Use `Group.ofLeftAxioms` or `Group.ofRightAxioms` to define a group structure
    on a type with the minimum proof obligations.
     GType u_1] [FiniteFinite.{u_3} (α : Sort u_3) : PropA type is `Finite` if it is in bijective correspondence to some `Fin n`.
    
    This is similar to `Fintype`, but `Finite` is a proposition rather than data.
    A particular benefit to this is that `Finite` instances are definitionally equal to one another
    (due to proof irrelevance) rather than being merely propositionally equal,
    and, furthermore, `Finite` instances generally avoid the need for `Decidable` instances.
    One other notable difference is that `Finite` allows there to be `Finite p` instances
    for all `p : Prop`, which is not allowed by `Fintype` due to universe constraints.
    An application of this is that `Finite (x ∈ s → β x)` follows from the general instance for pi
    types, assuming `[∀ x, Finite (β x)]`.
    Implementation note: this is a reason `Finite α` is not defined as `Nonempty (Fintype α)`.
    
    Every `Fintype` instance provides a `Finite` instance via `Finite.of_fintype`.
    Conversely, one can noncomputably create a `Fintype` instance from a `Finite` instance
    via `Fintype.ofFinite`. In a proof one might write
    ```lean
      have := Fintype.ofFinite α
    ```
    to obtain such an instance.
    
    Do not write noncomputable `Fintype` instances; instead write `Finite` instances
    and use this `Fintype.ofFinite` interface.
    The `Fintype` instances should be relied upon to be computable for evaluation purposes.
    
    Theorems should use `Finite` instead of `Fintype`, unless definitions in the theorem statement
    require `Fintype`.
    Definitions should prefer `Finite` as well, unless it is important that the definitions
    are meant to be computable in the reduction or `#eval` sense.
     GType u_1]
      (NSubgroup (G ⧸ Q2Presentation.twoCore G) :
        SubgroupSubgroup.{u_3} (G : Type u_3) [Group G] : Type u_3A subgroup of a group `G` is a subset containing 1, closed under multiplication
    and closed under multiplicative inverse. 
          (HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
    GType u_1 HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
     Q2Presentation.twoCoreQ2Presentation.twoCore.{u_1} (G : Type u_1) [Group G] : Subgroup GThe **2-core** `O₂(G)` — the wild subgroup of the `Q₂` presentation.  GType u_1)HasQuotient.Quotient.{u, v} (A : outParam (Type u)) {B : Type v} [self : HasQuotient A B] : B → Type (max u v)`HasQuotient.Quotient A b` (denoted as `A ⧸ b`) is the quotient of the type `A` by `b`.
    
    This differs from `HasQuotient.quotient'` in that the `A` argument is explicit,
    which is necessary to make Lean show the notation in the goal state.
    )
      (hNN.Normal : NSubgroup (G ⧸ Q2Presentation.twoCore G).NormalSubgroup.Normal.{u_1} {G : Type u_1} [Group G] (H : Subgroup G) : PropA subgroup `H` is normal if whenever `n ∈ H`, then `g * n * g⁻¹ ∈ H` for every `g : G` ) (h2IsPGroup 2 ↥N : IsPGroupIsPGroup.{u_1} (p : ℕ) (G : Type u_1) [Group G] : PropA p-group is a group in which the order of every element is a power of `p`.  2 NSubgroup (G ⧸ Q2Presentation.twoCore G)) :
      NSubgroup (G ⧸ Q2Presentation.twoCore G) =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. Bot.bot.{u_1} {α : Type u_1} [self : Bot α] : αThe bot (`⊥`, `\bot`) element 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `⊥` in identifiers is `bot`.
    The quotient by the 2-core has no nontrivial normal 2-subgroup, i.e.
    `O₂(G / O₂(G)) = 1`.  This is what makes the wild subgroup characteristic
    (`lem:o2tame`). 
Theorem3.4
Group: The tame and maximal pro-2 quotients (6)
Hover another entry in this group to preview it.
L∃∀Nused by 0

Proposition 3.10 of the paper (Maximal pro-2 quotient).

The maximal pro-2 quotient of \GA is

\Pi= \left\langle \sigma,x_0,x_1\;\middle|\; x_0^{\sigma^2}x_0[x_1,\sigma]=1 \right\rangle_{\mathrm{pro-}2}.

The group \Pi is abstractly isomorphic to G_{\Qtwo}(2). Equipped with

\nu_2:\Pi\twoheadrightarrow\mathbb{Z}_2, \qquad \nu_2(\sigma)=1,\quad \nu_2(x_0)=\nu_2(x_1)=0,

it is isomorphic to the fully unramified marked pair (G_{\Qtwo}(2),\nu_{\mathrm{ur}}).

Lean code for Theorem3.42 declarations
  • defdefined in Q2Presentation/Boundary/CandidatePro2.lean
    complete
    def Q2Presentation.maxPro2GammaA_iso_PiGrp :
      Q2Presentation.MaximalPro2QuotientQ2Presentation.MaximalPro2Quotient.{u} (P : ProfiniteGrp.{u}) : ProfiniteGrp.{u}**The maximal pro-`2` quotient** `MaximalPro2Quotient P`, the cofiltered inverse
    limit (in `ProfiniteGrp`) of the finite `2`-group quotients of `P`.  Q2Presentation.GammaAQ2Presentation.GammaA : ProfiniteGrp.{0}The candidate profinite group `Γ_A`, the cofiltered inverse limit (in
    `ProfiniteGrp`) of all admissible finite marked quotients (manuscript
    eq. `candidateinverse`).  CategoryTheory.Iso.{v, u} {C : Type u} [CategoryTheory.Category.{v, u} C] (X Y : C) : Type vAn isomorphism (a.k.a. an invertible morphism) between two objects of a category.
    The inverse morphism is bundled.
    
    See also `CategoryTheory.Core` for the category with the same objects and isomorphisms playing
    the role of morphisms. 
        Q2Presentation.PiGrpQ2Presentation.PiGrp : ProfiniteGrp.{0}The profinite pro-`2` group `Π`, the cofiltered inverse limit (in `ProfiniteGrp`) of all
    finite marked pro-`2` boundary quotients (manuscript `Π`, `eq:Pi`).  Named `PiGrp` to avoid
    clashing with Lean's `Pi` dependent-function type. 
    def Q2Presentation.maxPro2GammaA_iso_PiGrp :
      Q2Presentation.MaximalPro2QuotientQ2Presentation.MaximalPro2Quotient.{u} (P : ProfiniteGrp.{u}) : ProfiniteGrp.{u}**The maximal pro-`2` quotient** `MaximalPro2Quotient P`, the cofiltered inverse
    limit (in `ProfiniteGrp`) of the finite `2`-group quotients of `P`. 
          Q2Presentation.GammaAQ2Presentation.GammaA : ProfiniteGrp.{0}The candidate profinite group `Γ_A`, the cofiltered inverse limit (in
    `ProfiniteGrp`) of all admissible finite marked quotients (manuscript
    eq. `candidateinverse`).  CategoryTheory.Iso.{v, u} {C : Type u} [CategoryTheory.Category.{v, u} C] (X Y : C) : Type vAn isomorphism (a.k.a. an invertible morphism) between two objects of a category.
    The inverse morphism is bundled.
    
    See also `CategoryTheory.Core` for the category with the same objects and isomorphisms playing
    the role of morphisms. 
        Q2Presentation.PiGrpQ2Presentation.PiGrp : ProfiniteGrp.{0}The profinite pro-`2` group `Π`, the cofiltered inverse limit (in `ProfiniteGrp`) of all
    finite marked pro-`2` boundary quotients (manuscript `Π`, `eq:Pi`).  Named `PiGrp` to avoid
    clashing with Lean's `Pi` dependent-function type. 
    **Proposition 3.10.**  The maximal pro-`2` quotient of the candidate `Γ_A` is the
    profinite pro-`2` group `Π`. 
  • theoremdefined in Q2Presentation/Boundary/PiFinite.lean
    complete
    theorem Q2Presentation.admissible_twoGroup_iff_piMarked.{u_1} {GType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. }
      [GroupGroup.{u} (G : Type u) : Type uA `Group` is a `Monoid` with an operation `⁻¹` satisfying `a⁻¹ * a = 1`.
    
    There is also a division operation `/` such that `a / b = a * b⁻¹`,
    with a default so that `a / b = a * b⁻¹` holds by definition.
    
    Use `Group.ofLeftAxioms` or `Group.ofRightAxioms` to define a group structure
    on a type with the minimum proof obligations.
     GType u_1] [FiniteFinite.{u_3} (α : Sort u_3) : PropA type is `Finite` if it is in bijective correspondence to some `Fin n`.
    
    This is similar to `Fintype`, but `Finite` is a proposition rather than data.
    A particular benefit to this is that `Finite` instances are definitionally equal to one another
    (due to proof irrelevance) rather than being merely propositionally equal,
    and, furthermore, `Finite` instances generally avoid the need for `Decidable` instances.
    One other notable difference is that `Finite` allows there to be `Finite p` instances
    for all `p : Prop`, which is not allowed by `Fintype` due to universe constraints.
    An application of this is that `Finite (x ∈ s → β x)` follows from the general instance for pi
    types, assuming `[∀ x, Finite (β x)]`.
    Implementation note: this is a reason `Finite α` is not defined as `Nonempty (Fintype α)`.
    
    Every `Fintype` instance provides a `Finite` instance via `Finite.of_fintype`.
    Conversely, one can noncomputably create a `Fintype` instance from a `Finite` instance
    via `Fintype.ofFinite`. In a proof one might write
    ```lean
      have := Fintype.ofFinite α
    ```
    to obtain such an instance.
    
    Do not write noncomputable `Fintype` instances; instead write `Finite` instances
    and use this `Fintype.ofFinite` interface.
    The `Fintype` instances should be relied upon to be computable for evaluation purposes.
    
    Theorems should use `Finite` instead of `Fintype`, unless definitions in the theorem statement
    require `Fintype`.
    Definitions should prefer `Finite` as well, unless it is important that the definitions
    are meant to be computable in the reduction or `#eval` sense.
     GType u_1] (hG2IsPGroup 2 G : IsPGroupIsPGroup.{u_1} (p : ℕ) (G : Type u_1) [Group G] : PropA p-group is a group in which the order of every element is a power of `p`.  2 GType u_1)
      (qQ2Presentation.Marking G : Q2Presentation.MarkingQ2Presentation.Marking.{u_1} (G : Type u_1) [Group G] : Type u_1A marking assigns a group element to each of the four generators.  GType u_1) :
      Q2Presentation.AdmissibleQ2Presentation.Admissible.{u_1} {G : Type u_1} [Group G] [Finite G] (q : Q2Presentation.Marking G) : PropA marking is **admissible** when it generates, satisfies the tame and wild
    relators, and sends `x₀, x₁` into the 2-core.  qQ2Presentation.Marking G Iff (a b : Prop) : PropIf and only if, or logical bi-implication. `a ↔ b` means that `a` implies `b` and vice versa.
    By `propext`, this implies that `a` and `b` are equal and hence any expression involving `a`
    is equivalent to the corresponding expression with `b` instead.
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `↔` in identifiers is `iff`.
    
     * The recommended spelling of `<->` in identifiers is `iff` (prefer `↔` over `<->`).
        qQ2Presentation.Marking G Q2Presentation.Gen.tauQ2Presentation.Gen.tau : Q2Presentation.Gen =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. 1 And (a b : Prop) : Prop`And a b`, or `a ∧ b`, is the conjunction of propositions. It can be
    constructed and destructed like a pair: if `ha : a` and `hb : b` then
    `⟨ha, hb⟩ : a ∧ b`, and if `h : a ∧ b` then `h.left : a` and `h.right : b`.
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∧` in identifiers is `and`.
    
     * The recommended spelling of `/\` in identifiers is `and` (prefer `∧` over `/\`).
          Subgroup.closureSubgroup.closure.{u_1} {G : Type u_1} [Group G] (k : Set G) : Subgroup GThe `Subgroup` generated by a set. 
                {Insert.insert.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Insert α γ] : α → γ → γ`insert x xs` inserts the element `x` into the collection `xs`. qQ2Presentation.Marking G Q2Presentation.Gen.sigmaQ2Presentation.Gen.sigma : Q2Presentation.Gen,Insert.insert.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Insert α γ] : α → γ → γ`insert x xs` inserts the element `x` into the collection `xs`.  qQ2Presentation.Marking G Q2Presentation.Gen.x0Q2Presentation.Gen.x0 : Q2Presentation.Gen,Insert.insert.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Insert α γ] : α → γ → γ`insert x xs` inserts the element `x` into the collection `xs`. 
                  qQ2Presentation.Marking G Q2Presentation.Gen.x1Q2Presentation.Gen.x1 : Q2Presentation.Gen}Insert.insert.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Insert α γ] : α → γ → γ`insert x xs` inserts the element `x` into the collection `xs`.  =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
              Top.top.{u_1} {α : Type u_1} [self : Top α] : αThe top (`⊤`, `\top`) element 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `⊤` in identifiers is `top`. And (a b : Prop) : Prop`And a b`, or `a ∧ b`, is the conjunction of propositions. It can be
    constructed and destructed like a pair: if `ha : a` and `hb : b` then
    `⟨ha, hb⟩ : a ∧ b`, and if `h : a ∧ b` then `h.left : a` and `h.right : b`.
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∧` in identifiers is `and`.
    
     * The recommended spelling of `/\` in identifiers is `and` (prefer `∧` over `/\`).
            Q2Presentation.rconjQ2Presentation.rconj.{u_1} {G : Type u_1} [Group G] (x g : G) : GRight conjugation `x^g = g⁻¹ * x * g` (manuscript convention).  (qQ2Presentation.Marking G Q2Presentation.Gen.x0Q2Presentation.Gen.x0 : Q2Presentation.Gen)
                    (HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`.qQ2Presentation.Marking G Q2Presentation.Gen.sigmaQ2Presentation.Gen.sigma : Q2Presentation.Gen ^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`. 2)HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`. *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.
                  qQ2Presentation.Marking G Q2Presentation.Gen.x0Q2Presentation.Gen.x0 : Q2Presentation.Gen *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.
                Q2Presentation.commutatorWQ2Presentation.commutatorW.{u_1} {G : Type u_1} [Group G] (x y : G) : GCommutator `(x, y) = x⁻¹ * y⁻¹ * x * y` (manuscript convention).  (qQ2Presentation.Marking G Q2Presentation.Gen.x1Q2Presentation.Gen.x1 : Q2Presentation.Gen)
                  (qQ2Presentation.Marking G Q2Presentation.Gen.sigmaQ2Presentation.Gen.sigma : Q2Presentation.Gen) =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
              1
    theorem Q2Presentation.admissible_twoGroup_iff_piMarked.{u_1}
      {GType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [GroupGroup.{u} (G : Type u) : Type uA `Group` is a `Monoid` with an operation `⁻¹` satisfying `a⁻¹ * a = 1`.
    
    There is also a division operation `/` such that `a / b = a * b⁻¹`,
    with a default so that `a / b = a * b⁻¹` holds by definition.
    
    Use `Group.ofLeftAxioms` or `Group.ofRightAxioms` to define a group structure
    on a type with the minimum proof obligations.
     GType u_1] [FiniteFinite.{u_3} (α : Sort u_3) : PropA type is `Finite` if it is in bijective correspondence to some `Fin n`.
    
    This is similar to `Fintype`, but `Finite` is a proposition rather than data.
    A particular benefit to this is that `Finite` instances are definitionally equal to one another
    (due to proof irrelevance) rather than being merely propositionally equal,
    and, furthermore, `Finite` instances generally avoid the need for `Decidable` instances.
    One other notable difference is that `Finite` allows there to be `Finite p` instances
    for all `p : Prop`, which is not allowed by `Fintype` due to universe constraints.
    An application of this is that `Finite (x ∈ s → β x)` follows from the general instance for pi
    types, assuming `[∀ x, Finite (β x)]`.
    Implementation note: this is a reason `Finite α` is not defined as `Nonempty (Fintype α)`.
    
    Every `Fintype` instance provides a `Finite` instance via `Finite.of_fintype`.
    Conversely, one can noncomputably create a `Fintype` instance from a `Finite` instance
    via `Fintype.ofFinite`. In a proof one might write
    ```lean
      have := Fintype.ofFinite α
    ```
    to obtain such an instance.
    
    Do not write noncomputable `Fintype` instances; instead write `Finite` instances
    and use this `Fintype.ofFinite` interface.
    The `Fintype` instances should be relied upon to be computable for evaluation purposes.
    
    Theorems should use `Finite` instead of `Fintype`, unless definitions in the theorem statement
    require `Fintype`.
    Definitions should prefer `Finite` as well, unless it is important that the definitions
    are meant to be computable in the reduction or `#eval` sense.
     GType u_1]
      (hG2IsPGroup 2 G : IsPGroupIsPGroup.{u_1} (p : ℕ) (G : Type u_1) [Group G] : PropA p-group is a group in which the order of every element is a power of `p`.  2 GType u_1)
      (qQ2Presentation.Marking G : Q2Presentation.MarkingQ2Presentation.Marking.{u_1} (G : Type u_1) [Group G] : Type u_1A marking assigns a group element to each of the four generators.  GType u_1) :
      Q2Presentation.AdmissibleQ2Presentation.Admissible.{u_1} {G : Type u_1} [Group G] [Finite G] (q : Q2Presentation.Marking G) : PropA marking is **admissible** when it generates, satisfies the tame and wild
    relators, and sends `x₀, x₁` into the 2-core.  qQ2Presentation.Marking G Iff (a b : Prop) : PropIf and only if, or logical bi-implication. `a ↔ b` means that `a` implies `b` and vice versa.
    By `propext`, this implies that `a` and `b` are equal and hence any expression involving `a`
    is equivalent to the corresponding expression with `b` instead.
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `↔` in identifiers is `iff`.
    
     * The recommended spelling of `<->` in identifiers is `iff` (prefer `↔` over `<->`).
        qQ2Presentation.Marking G Q2Presentation.Gen.tauQ2Presentation.Gen.tau : Q2Presentation.Gen =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. 1 And (a b : Prop) : Prop`And a b`, or `a ∧ b`, is the conjunction of propositions. It can be
    constructed and destructed like a pair: if `ha : a` and `hb : b` then
    `⟨ha, hb⟩ : a ∧ b`, and if `h : a ∧ b` then `h.left : a` and `h.right : b`.
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∧` in identifiers is `and`.
    
     * The recommended spelling of `/\` in identifiers is `and` (prefer `∧` over `/\`).
          Subgroup.closureSubgroup.closure.{u_1} {G : Type u_1} [Group G] (k : Set G) : Subgroup GThe `Subgroup` generated by a set. 
                {Insert.insert.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Insert α γ] : α → γ → γ`insert x xs` inserts the element `x` into the collection `xs`. qQ2Presentation.Marking G Q2Presentation.Gen.sigmaQ2Presentation.Gen.sigma : Q2Presentation.Gen,Insert.insert.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Insert α γ] : α → γ → γ`insert x xs` inserts the element `x` into the collection `xs`. 
                  qQ2Presentation.Marking G Q2Presentation.Gen.x0Q2Presentation.Gen.x0 : Q2Presentation.Gen,Insert.insert.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Insert α γ] : α → γ → γ`insert x xs` inserts the element `x` into the collection `xs`. 
                  qQ2Presentation.Marking G Q2Presentation.Gen.x1Q2Presentation.Gen.x1 : Q2Presentation.Gen}Insert.insert.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Insert α γ] : α → γ → γ`insert x xs` inserts the element `x` into the collection `xs`.  =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
              Top.top.{u_1} {α : Type u_1} [self : Top α] : αThe top (`⊤`, `\top`) element 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `⊤` in identifiers is `top`. And (a b : Prop) : Prop`And a b`, or `a ∧ b`, is the conjunction of propositions. It can be
    constructed and destructed like a pair: if `ha : a` and `hb : b` then
    `⟨ha, hb⟩ : a ∧ b`, and if `h : a ∧ b` then `h.left : a` and `h.right : b`.
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∧` in identifiers is `and`.
    
     * The recommended spelling of `/\` in identifiers is `and` (prefer `∧` over `/\`).
            Q2Presentation.rconjQ2Presentation.rconj.{u_1} {G : Type u_1} [Group G] (x g : G) : GRight conjugation `x^g = g⁻¹ * x * g` (manuscript convention). 
                    (qQ2Presentation.Marking G Q2Presentation.Gen.x0Q2Presentation.Gen.x0 : Q2Presentation.Gen)
                    (HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`.qQ2Presentation.Marking G
                        Q2Presentation.Gen.sigmaQ2Presentation.Gen.sigma : Q2Presentation.Gen ^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`.
                      2)HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`. *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.
                  qQ2Presentation.Marking G Q2Presentation.Gen.x0Q2Presentation.Gen.x0 : Q2Presentation.Gen *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.
                Q2Presentation.commutatorWQ2Presentation.commutatorW.{u_1} {G : Type u_1} [Group G] (x y : G) : GCommutator `(x, y) = x⁻¹ * y⁻¹ * x * y` (manuscript convention). 
                  (qQ2Presentation.Marking G Q2Presentation.Gen.x1Q2Presentation.Gen.x1 : Q2Presentation.Gen)
                  (qQ2Presentation.Marking G
                    Q2Presentation.Gen.sigmaQ2Presentation.Gen.sigma : Q2Presentation.Gen) =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
              1
    **Proposition 3.10 (finite-`2`-group form).**  For a finite `2`-group `G`, a
    marking `q` is admissible iff `τ = 1`, the remaining three images `σ, x₀, x₁`
    generate `G`, and the collapsed wild relator `x₀^{σ²} x₀ [x₁, σ] = 1` holds.
    
    The two `2`-core side conditions of `Admissible` are automatic here (`O₂(G) = ⊤`),
    the tame relator is equivalent to `τ = 1` (via `finite_tame_tau_odd` together with
    the `2`-power order of every element), and `powOmega2 = id` collapses the wild
    word to the displayed relator. 
Proof

Proved in §3 of the paper. Ingredients: Corollary 3.6 Lemma 3.1.

Theorem3.5
Group: The tame and maximal pro-2 quotients (6)
Hover another entry in this group to preview it.
L∃∀Nused by 1

Proposition 3.11 of the paper (Nielsen transform to the pro-2 boundary).

For any pro-2 group with topological generators a,s,y and unique defining relation

a^2s^4[s,y]=1,

the Nielsen change

\sigma=s,\qquad x_1=y,\qquad x_0=s^{-2}a^{-1}

changes the closed normal closure of the relator to that of

x_0^{\sigma^2}x_0[x_1,\sigma].

Consequently Proposition 1.1 identifies D=G_{\Qtwo}(2) abstractly with \Pi.

Lean code for Theorem3.52 declarations
  • theoremdefined in Q2Presentation/Boundary/Nielsen.lean
    complete
    theorem Q2Presentation.nielsen_rel_equiv.{u_1} {GType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [GroupGroup.{u} (G : Type u) : Type uA `Group` is a `Monoid` with an operation `⁻¹` satisfying `a⁻¹ * a = 1`.
    
    There is also a division operation `/` such that `a / b = a * b⁻¹`,
    with a default so that `a / b = a * b⁻¹` holds by definition.
    
    Use `Group.ofLeftAxioms` or `Group.ofRightAxioms` to define a group structure
    on a type with the minimum proof obligations.
     GType u_1]
      (aG sG yG : GType u_1) :
      aG ^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`. 2 *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. sG ^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`. 4 *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. Q2Presentation.commutatorWQ2Presentation.commutatorW.{u_1} {G : Type u_1} [Group G] (x y : G) : GCommutator `(x, y) = x⁻¹ * y⁻¹ * x * y` (manuscript convention).  sG yG =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. 1 Iff (a b : Prop) : PropIf and only if, or logical bi-implication. `a ↔ b` means that `a` implies `b` and vice versa.
    By `propext`, this implies that `a` and `b` are equal and hence any expression involving `a`
    is equivalent to the corresponding expression with `b` instead.
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `↔` in identifiers is `iff`.
    
     * The recommended spelling of `<->` in identifiers is `iff` (prefer `↔` over `<->`).
        Q2Presentation.rconjQ2Presentation.rconj.{u_1} {G : Type u_1} [Group G] (x g : G) : GRight conjugation `x^g = g⁻¹ * x * g` (manuscript convention).  (HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.(HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`.sG ^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`. 2)HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`.⁻¹Inv.inv.{u} {α : Type u} [self : Inv α] : α → α`a⁻¹` computes the inverse of `a`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `⁻¹` in identifiers is `inv`. *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. aG⁻¹Inv.inv.{u} {α : Type u} [self : Inv α] : α → α`a⁻¹` computes the inverse of `a`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `⁻¹` in identifiers is `inv`.)HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. (HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`.sG ^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`. 2)HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`. *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. (HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.(HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`.sG ^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`. 2)HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`.⁻¹Inv.inv.{u} {α : Type u} [self : Inv α] : α → α`a⁻¹` computes the inverse of `a`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `⁻¹` in identifiers is `inv`. *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. aG⁻¹Inv.inv.{u} {α : Type u} [self : Inv α] : α → α`a⁻¹` computes the inverse of `a`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `⁻¹` in identifiers is `inv`.)HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.
            Q2Presentation.commutatorWQ2Presentation.commutatorW.{u_1} {G : Type u_1} [Group G] (x y : G) : GCommutator `(x, y) = x⁻¹ * y⁻¹ * x * y` (manuscript convention).  yG sG =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
          1
    theorem Q2Presentation.nielsen_rel_equiv.{u_1}
      {GType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [GroupGroup.{u} (G : Type u) : Type uA `Group` is a `Monoid` with an operation `⁻¹` satisfying `a⁻¹ * a = 1`.
    
    There is also a division operation `/` such that `a / b = a * b⁻¹`,
    with a default so that `a / b = a * b⁻¹` holds by definition.
    
    Use `Group.ofLeftAxioms` or `Group.ofRightAxioms` to define a group structure
    on a type with the minimum proof obligations.
     GType u_1] (aG sG yG : GType u_1) :
      aG ^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`. 2 *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. sG ^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`. 4 *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.
            Q2Presentation.commutatorWQ2Presentation.commutatorW.{u_1} {G : Type u_1} [Group G] (x y : G) : GCommutator `(x, y) = x⁻¹ * y⁻¹ * x * y` (manuscript convention).  sG yG =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
          1 Iff (a b : Prop) : PropIf and only if, or logical bi-implication. `a ↔ b` means that `a` implies `b` and vice versa.
    By `propext`, this implies that `a` and `b` are equal and hence any expression involving `a`
    is equivalent to the corresponding expression with `b` instead.
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `↔` in identifiers is `iff`.
    
     * The recommended spelling of `<->` in identifiers is `iff` (prefer `↔` over `<->`).
        Q2Presentation.rconjQ2Presentation.rconj.{u_1} {G : Type u_1} [Group G] (x g : G) : GRight conjugation `x^g = g⁻¹ * x * g` (manuscript convention).  (HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.(HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`.sG ^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`. 2)HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`.⁻¹Inv.inv.{u} {α : Type u} [self : Inv α] : α → α`a⁻¹` computes the inverse of `a`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `⁻¹` in identifiers is `inv`. *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. aG⁻¹Inv.inv.{u} {α : Type u} [self : Inv α] : α → α`a⁻¹` computes the inverse of `a`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `⁻¹` in identifiers is `inv`.)HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.
                (HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`.sG ^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`. 2)HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`. *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.
              (HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.(HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`.sG ^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`. 2)HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`.⁻¹Inv.inv.{u} {α : Type u} [self : Inv α] : α → α`a⁻¹` computes the inverse of `a`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `⁻¹` in identifiers is `inv`. *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. aG⁻¹Inv.inv.{u} {α : Type u} [self : Inv α] : α → α`a⁻¹` computes the inverse of `a`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `⁻¹` in identifiers is `inv`.)HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.
            Q2Presentation.commutatorWQ2Presentation.commutatorW.{u_1} {G : Type u_1} [Group G] (x y : G) : GCommutator `(x, y) = x⁻¹ * y⁻¹ * x * y` (manuscript convention).  yG sG =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
          1
    **Proposition 3.11 (pure group form).**  Under the Nielsen substitution
    `σ = s, x₀ = s⁻² a⁻¹, x₁ = y`, the standard Demushkin relator `a² s⁴ [s,y]`
    vanishes iff the pro-`2` boundary relator `x₀^{σ²} x₀ [x₁,σ]` (the EXACT relation
    form of `PiFinite.admissible_twoGroup_iff_piMarked`) vanishes.
    
    This is *not* an equality of the two relator words: as in the manuscript
    (l.1022–1024) they are cyclic conjugates.  The proof rewrites each direction
    along the conjugation identity `W = c · R⁻¹ · c⁻¹` with `c = s⁻⁴ a⁻²`, which
    `group` verifies. 
  • defdefined in Q2Presentation/Boundary/Nielsen.lean
    complete
    def Q2Presentation.D0_Pi_index_equiv :
      Q2Presentation.D0MarkedFiniteQ2Presentation.D0MarkedFinite : TypeA finite `2`-group with a generating Demushkin marking `a, s, y` satisfying
    `a² s⁴ [s,y] = 1`.  Carrier pinned to the skeleton `Fin n` (cf.
    `AdmissibleIndex`).  CategoryTheory.Equivalence.{v₁, v₂, u₁, u₂} (C : Type u₁) (D : Type u₂) [CategoryTheory.Category.{v₁, u₁} C]
      [CategoryTheory.Category.{v₂, u₂} D] : Type (max (max (max u₁ u₂) v₁) v₂)An equivalence of categories.
    
    We define an equivalence between `C` and `D`, with notation `C ≌ D`, as a half-adjoint equivalence:
    a pair of functors `F : C ⥤ D` and `G : D ⥤ C` with a unit `η : 𝟭 C ≅ F ⋙ G` and counit
    `ε : G ⋙ F ≅ 𝟭 D`, such that the natural isomorphisms `η` and `ε` satisfy the triangle law for
    `F`: namely, `Fη ≫ εF = 𝟙 F`. Or, in other words, the composite `F` ⟶ `F ⋙ G ⋙ F` ⟶ `F` is the
    identity.
    
    In `unit_inverse_comp`, we show that this is sufficient to establish a full adjoint
    equivalence. I.e., the composite `G` ⟶ `G ⋙ F ⋙ G` ⟶ `G` is also the identity.
    
    The triangle equation `functor_unitIso_comp` is written as a family of equalities between
    morphisms. It is more complicated if we write it as an equality of natural transformations, because
    then we would either have to insert natural transformations like `F ⟶ F𝟭` or abuse defeq.  Q2Presentation.PiMarkedFiniteQ2Presentation.PiMarkedFinite : TypeA finite `2`-group with a generating pro-`2` boundary marking `σ, x₀, x₁`
    satisfying the boundary relation `x₀^{σ²} x₀ [x₁,σ] = 1` (the relation form of
    `PiFinite.admissible_twoGroup_iff_piMarked`). 
    def Q2Presentation.D0_Pi_index_equiv :
      Q2Presentation.D0MarkedFiniteQ2Presentation.D0MarkedFinite : TypeA finite `2`-group with a generating Demushkin marking `a, s, y` satisfying
    `a² s⁴ [s,y] = 1`.  Carrier pinned to the skeleton `Fin n` (cf.
    `AdmissibleIndex`).  CategoryTheory.Equivalence.{v₁, v₂, u₁, u₂} (C : Type u₁) (D : Type u₂) [CategoryTheory.Category.{v₁, u₁} C]
      [CategoryTheory.Category.{v₂, u₂} D] : Type (max (max (max u₁ u₂) v₁) v₂)An equivalence of categories.
    
    We define an equivalence between `C` and `D`, with notation `C ≌ D`, as a half-adjoint equivalence:
    a pair of functors `F : C ⥤ D` and `G : D ⥤ C` with a unit `η : 𝟭 C ≅ F ⋙ G` and counit
    `ε : G ⋙ F ≅ 𝟭 D`, such that the natural isomorphisms `η` and `ε` satisfy the triangle law for
    `F`: namely, `Fη ≫ εF = 𝟙 F`. Or, in other words, the composite `F` ⟶ `F ⋙ G ⋙ F` ⟶ `F` is the
    identity.
    
    In `unit_inverse_comp`, we show that this is sufficient to establish a full adjoint
    equivalence. I.e., the composite `G` ⟶ `G ⋙ F ⋙ G` ⟶ `G` is also the identity.
    
    The triangle equation `functor_unitIso_comp` is written as a family of equalities between
    morphisms. It is more complicated if we write it as an equality of natural transformations, because
    then we would either have to insert natural transformations like `F ⟶ F𝟭` or abuse defeq. 
        Q2Presentation.PiMarkedFiniteQ2Presentation.PiMarkedFinite : TypeA finite `2`-group with a generating pro-`2` boundary marking `σ, x₀, x₁`
    satisfying the boundary relation `x₀^{σ²} x₀ [x₁,σ] = 1` (the relation form of
    `PiFinite.admissible_twoGroup_iff_piMarked`). 
    **The Nielsen transform induces an equivalence of the two finite
    marked-quotient categories** `D0MarkedFinite ≌ PiMarkedFinite` (manuscript
    Proposition 3.11).  Objects correspond via the markings `D0_to_Pi_marking` /
    `Pi_to_D0_marking`; `nielsen_rel_equiv` makes the defining relation transfer; the
    triangle identity is automatic since every hom-set is a subsingleton. 
Corollary3.6
Group: The tame and maximal pro-2 quotients (6)
Hover another entry in this group to preview it.
L∃∀N
Used by 2
Hover a use site to preview it.
Preview
Theorem 3.4
Loading preview
Hover a use site to preview it.

Corollary 3.12 of the paper (Fully marked form).

The generators furnished by Proposition 1.1 and transformed by (23) satisfy

\nu_{\mathrm{ur}}(\sigma)=1, \qquad \nu_{\mathrm{ur}}(x_0)=\nu_{\mathrm{ur}}(x_1)=0,

and (24) is the unique defining relation. Hence (D,\nu_{\mathrm{ur}})\cong(\Pi,\nu_2).

Lean code for Corollary3.62 definitions
  • defdefined in Q2Presentation/Boundary/BoundaryGQ2.lean
    complete
    def Q2Presentation.pro2Map_loc :
      Q2Presentation.GQ2ProfiniteQ2Presentation.GQ2Profinite : ProfiniteGrp.{0}The absolute Galois group `G_{ℚ₂} = Gal(Q̄₂/ℚ₂)` of the `2`-adic field
    `ℚ₂ = ℚ_[2]`, as a profinite group.
    
    Concretely it is `Gal(SeparableClosure ℚ_[2] / ℚ_[2])`, packaged as an object of
    `ProfiniteGrp` by `InfiniteGalois.profiniteGalGrp`.  Since `ℚ_[2]` has
    characteristic `0` its separable closure is an algebraic closure, so this is the
    absolute Galois group in the usual sense, matching the manuscript's `G_{ℚ₂}`.  Quiver.Hom.{v, u} {V : Type u} [self : Quiver V] : V → V → Type vThe type of edges/arrows/morphisms between a given source and target.  Q2Presentation.PiGrpQ2Presentation.PiGrp : ProfiniteGrp.{0}The profinite pro-`2` group `Π`, the cofiltered inverse limit (in `ProfiniteGrp`) of all
    finite marked pro-`2` boundary quotients (manuscript `Π`, `eq:Pi`).  Named `PiGrp` to avoid
    clashing with Lean's `Pi` dependent-function type. 
    def Q2Presentation.pro2Map_loc :
      Q2Presentation.GQ2ProfiniteQ2Presentation.GQ2Profinite : ProfiniteGrp.{0}The absolute Galois group `G_{ℚ₂} = Gal(Q̄₂/ℚ₂)` of the `2`-adic field
    `ℚ₂ = ℚ_[2]`, as a profinite group.
    
    Concretely it is `Gal(SeparableClosure ℚ_[2] / ℚ_[2])`, packaged as an object of
    `ProfiniteGrp` by `InfiniteGalois.profiniteGalGrp`.  Since `ℚ_[2]` has
    characteristic `0` its separable closure is an algebraic closure, so this is the
    absolute Galois group in the usual sense, matching the manuscript's `G_{ℚ₂}`.  Quiver.Hom.{v, u} {V : Type u} [self : Quiver V] : V → V → Type vThe type of edges/arrows/morphisms between a given source and target. 
        Q2Presentation.PiGrpQ2Presentation.PiGrp : ProfiniteGrp.{0}The profinite pro-`2` group `Π`, the cofiltered inverse limit (in `ProfiniteGrp`) of all
    finite marked pro-`2` boundary quotients (manuscript `Π`, `eq:Pi`).  Named `PiGrp` to avoid
    clashing with Lean's `Pi` dependent-function type. 
    **The local maximal pro-`2` quotient map** `pro2Map_loc : G_{ℚ₂} ↠ Π`
    (manuscript Prop 3.10 / `cor:relativeDemushkin`).  It factors `G_{ℚ₂}` through its
    maximal pro-`2` quotient `G_{ℚ₂}(2)` (`maxPro2Proj`), then across Labute's
    classification `G_{ℚ₂}(2) ≅ D₀` (`labute_GQ2_maxPro2_marked.iso`) and the profinite
    Nielsen comparison `D₀ ≅ Π` (`D0_iso_PiGrp`). 
  • defdefined in Q2Presentation/Boundary/D0PiIso.lean
    complete
    def Q2Presentation.D0_iso_PiGrp : Q2Presentation.D0Q2Presentation.D0 : ProfiniteGrp.{0}The profinite **Demushkin group** `D₀`, the cofiltered inverse limit (in
    `ProfiniteGrp`) of all finite marked Demushkin `2`-group quotients (manuscript
    `D₀`, l.208 `eq:markedstandardhyp`).  CategoryTheory.Iso.{v, u} {C : Type u} [CategoryTheory.Category.{v, u} C] (X Y : C) : Type vAn isomorphism (a.k.a. an invertible morphism) between two objects of a category.
    The inverse morphism is bundled.
    
    See also `CategoryTheory.Core` for the category with the same objects and isomorphisms playing
    the role of morphisms.  Q2Presentation.PiGrpQ2Presentation.PiGrp : ProfiniteGrp.{0}The profinite pro-`2` group `Π`, the cofiltered inverse limit (in `ProfiniteGrp`) of all
    finite marked pro-`2` boundary quotients (manuscript `Π`, `eq:Pi`).  Named `PiGrp` to avoid
    clashing with Lean's `Pi` dependent-function type. 
    def Q2Presentation.D0_iso_PiGrp :
      Q2Presentation.D0Q2Presentation.D0 : ProfiniteGrp.{0}The profinite **Demushkin group** `D₀`, the cofiltered inverse limit (in
    `ProfiniteGrp`) of all finite marked Demushkin `2`-group quotients (manuscript
    `D₀`, l.208 `eq:markedstandardhyp`).  CategoryTheory.Iso.{v, u} {C : Type u} [CategoryTheory.Category.{v, u} C] (X Y : C) : Type vAn isomorphism (a.k.a. an invertible morphism) between two objects of a category.
    The inverse morphism is bundled.
    
    See also `CategoryTheory.Core` for the category with the same objects and isomorphisms playing
    the role of morphisms.  Q2Presentation.PiGrpQ2Presentation.PiGrp : ProfiniteGrp.{0}The profinite pro-`2` group `Π`, the cofiltered inverse limit (in `ProfiniteGrp`) of all
    finite marked pro-`2` boundary quotients (manuscript `Π`, `eq:Pi`).  Named `PiGrp` to avoid
    clashing with Lean's `Pi` dependent-function type. 
    **The profinite Nielsen comparison `D₀ ≅ Π`** (manuscript Corollary 3.12,
    `cor:relativeDemushkin`).
    
    The Nielsen transform's category equivalence
    `D0_Pi_index_equiv : D0MarkedFinite ≌ PiMarkedFinite` carries the Demushkin
    inverse system `d0Diagram` to the pro-`2` boundary system `piDiagram` (via the
    natural iso `d0CompIso`); limit-invariance under that equivalence of cofiltered
    index categories (`HasLimit.isoOfEquivalence`) yields the profinite isomorphism
    `D₀ = limit d0Diagram ≅ limit piDiagram = Π`. 
Proof

Proved in §3 of the paper. Ingredients: Theorem 3.5.

Theorem3.7
Group: The tame and maximal pro-2 quotients (6)
Hover another entry in this group to preview it.
L∃∀Nused by 0

Proposition 3.14 of the paper (Fully marked tame and pro-2 quotients).

Let

\nu_{\mathrm t}:\TA\twoheadrightarrow\mathbb{Z}_2, \qquad \nu_{\mathrm t}(\sigma)=1, \quad \nu_{\mathrm t}(\tau)=0,

and equip \Pi with (21). For each \Gamma\in\{\GA,\GQ\}, the tame quotient map and the maximal pro-2 quotient map may be chosen so that their composites with \nu_{\mathrm t} and \nu_2 are the same natural unramified character

\nu_{\Gamma}:\Gamma\twoheadrightarrow\mathbb{Z}_2.

The compatibility therefore holds after passage to every finite quotient C_{2^m}, not only modulo 2.

Lean code for Theorem3.73 declarations
  • defdefined in Q2Presentation/Boundary/BoundaryGQ2.lean
    complete
    def Q2Presentation.boundaryPackage_GQ2 :
      Q2Presentation.BoundaryPackageQ2Presentation.BoundaryPackage (Γ : ProfiniteGrp.{0}) : TypeA **boundary package** on a profinite group `Γ`: the uniform Stage-C data of a tame
    quotient, a maximal pro-`2` quotient, and a common unramified character `ℤ₂` through which
    both factor (manuscript Prop 3.14, `prop:compatiblemarking`; plan Turn 4 §6).  The
    compatibility `tameMap ≫ ν_t = ν = pro2Map ≫ ν_2` records that the two markings agree on
    the full unramified coordinate, not merely modulo `2`.  Q2Presentation.GQ2ProfiniteQ2Presentation.GQ2Profinite : ProfiniteGrp.{0}The absolute Galois group `G_{ℚ₂} = Gal(Q̄₂/ℚ₂)` of the `2`-adic field
    `ℚ₂ = ℚ_[2]`, as a profinite group.
    
    Concretely it is `Gal(SeparableClosure ℚ_[2] / ℚ_[2])`, packaged as an object of
    `ProfiniteGrp` by `InfiniteGalois.profiniteGalGrp`.  Since `ℚ_[2]` has
    characteristic `0` its separable closure is an algebraic closure, so this is the
    absolute Galois group in the usual sense, matching the manuscript's `G_{ℚ₂}`. 
    def Q2Presentation.boundaryPackage_GQ2 :
      Q2Presentation.BoundaryPackageQ2Presentation.BoundaryPackage (Γ : ProfiniteGrp.{0}) : TypeA **boundary package** on a profinite group `Γ`: the uniform Stage-C data of a tame
    quotient, a maximal pro-`2` quotient, and a common unramified character `ℤ₂` through which
    both factor (manuscript Prop 3.14, `prop:compatiblemarking`; plan Turn 4 §6).  The
    compatibility `tameMap ≫ ν_t = ν = pro2Map ≫ ν_2` records that the two markings agree on
    the full unramified coordinate, not merely modulo `2`. 
        Q2Presentation.GQ2ProfiniteQ2Presentation.GQ2Profinite : ProfiniteGrp.{0}The absolute Galois group `G_{ℚ₂} = Gal(Q̄₂/ℚ₂)` of the `2`-adic field
    `ℚ₂ = ℚ_[2]`, as a profinite group.
    
    Concretely it is `Gal(SeparableClosure ℚ_[2] / ℚ_[2])`, packaged as an object of
    `ProfiniteGrp` by `InfiniteGalois.profiniteGalGrp`.  Since `ℚ_[2]` has
    characteristic `0` its separable closure is an algebraic closure, so this is the
    absolute Galois group in the usual sense, matching the manuscript's `G_{ℚ₂}`. 
    **The local boundary package** `boundaryPackage_GQ2 : BoundaryPackage G_{ℚ₂}`
    (manuscript Prop 3.14 `prop:compatiblemarking` for `Γ = G_{ℚ₂}`; plan Turn 4 §6),
    the `G_{ℚ₂}`-side instance of the uniform Stage-C boundary datum.
    
    * `tameMap`/`tame_surj`/`tame_nu` — the local tame quotient `G_{ℚ₂} ↠ T_A` with
      unramified marking `ν_loc`, from the axiom `gq2_tame_quotient` (Prop 3.2 + the
      local half of Prop `compatiblemarking`);
    * `pro2Map`/`pro2_surj`/`pro2_nu` — the local maximal pro-`2` quotient
      `G_{ℚ₂} ↠ Π` with the *same* unramified marking `ν_loc`, proved from the fully
      marked Labute comparison `labute_GQ2_maxPro2_marked` (`pro2Map_loc`,
      `pro2Map_loc_surjective`, `pro2Map_loc_nu`);
    * `nu := ν_loc` — the common unramified character through which both factor. 
  • theoremdefined in Q2Presentation/Boundary/BoundaryGammaA.lean
    complete
    theorem Q2Presentation.gammaA_pro2_nu :
      CategoryTheory.CategoryStruct.compCategoryTheory.CategoryStruct.comp.{v, u} {obj : Type u} [self : CategoryTheory.CategoryStruct.{v, u} obj]
      {X Y Z : obj} : (X ⟶ Y) → (Y ⟶ Z) → (X ⟶ Z)Composition of morphisms in a category, written `f ≫ g`.  Q2Presentation.pQ2Presentation.p : Q2Presentation.GammaA ⟶ Q2Presentation.PiGrp**The canonical surjection** `p : Γ_A ⟶ Π`. 
          Q2Presentation.nu_2Q2Presentation.nu_2 : Q2Presentation.PiGrp ⟶ Q2Presentation.ProfiniteZ2**The unramified character** `ν₂ : PiGrp ⟶ ℤ₂`, `σ ↦ 1`, `x₀ ↦ 0`, `x₁ ↦ 0`.  Built as
    the map into `ℤ₂ = lim_n ZMod(2ⁿ)` whose `n`-th coordinate is `piLayerHom n`.  =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
        CategoryTheory.CategoryStruct.compCategoryTheory.CategoryStruct.comp.{v, u} {obj : Type u} [self : CategoryTheory.CategoryStruct.{v, u} obj]
      {X Y Z : obj} : (X ⟶ Y) → (Y ⟶ Z) → (X ⟶ Z)Composition of morphisms in a category, written `f ≫ g`.  Q2Presentation.gammaTameMapQ2Presentation.gammaTameMap : Q2Presentation.GammaA ⟶ Q2Presentation.Ttame**The common tame quotient map** `gammaTameMap : Γ_A ⟶ T_A` (Proposition 3.2). 
          Q2Presentation.nu_tQ2Presentation.nu_t : Q2Presentation.Ttame ⟶ Q2Presentation.ProfiniteZ2**The unramified character** `ν_t : Ttame ⟶ ℤ₂`, `σ ↦ 1`, `τ ↦ 0`.  Built as the
    map into `ℤ₂ = lim_n ZMod(2ⁿ)` whose `n`-th coordinate is `tameLayerHom n`. 
    theorem Q2Presentation.gammaA_pro2_nu :
      CategoryTheory.CategoryStruct.compCategoryTheory.CategoryStruct.comp.{v, u} {obj : Type u} [self : CategoryTheory.CategoryStruct.{v, u} obj]
      {X Y Z : obj} : (X ⟶ Y) → (Y ⟶ Z) → (X ⟶ Z)Composition of morphisms in a category, written `f ≫ g`. 
          Q2Presentation.pQ2Presentation.p : Q2Presentation.GammaA ⟶ Q2Presentation.PiGrp**The canonical surjection** `p : Γ_A ⟶ Π`. 
          Q2Presentation.nu_2Q2Presentation.nu_2 : Q2Presentation.PiGrp ⟶ Q2Presentation.ProfiniteZ2**The unramified character** `ν₂ : PiGrp ⟶ ℤ₂`, `σ ↦ 1`, `x₀ ↦ 0`, `x₁ ↦ 0`.  Built as
    the map into `ℤ₂ = lim_n ZMod(2ⁿ)` whose `n`-th coordinate is `piLayerHom n`.  =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
        CategoryTheory.CategoryStruct.compCategoryTheory.CategoryStruct.comp.{v, u} {obj : Type u} [self : CategoryTheory.CategoryStruct.{v, u} obj]
      {X Y Z : obj} : (X ⟶ Y) → (Y ⟶ Z) → (X ⟶ Z)Composition of morphisms in a category, written `f ≫ g`. 
          Q2Presentation.gammaTameMapQ2Presentation.gammaTameMap : Q2Presentation.GammaA ⟶ Q2Presentation.Ttame**The common tame quotient map** `gammaTameMap : Γ_A ⟶ T_A` (Proposition 3.2). 
          Q2Presentation.nu_tQ2Presentation.nu_t : Q2Presentation.Ttame ⟶ Q2Presentation.ProfiniteZ2**The unramified character** `ν_t : Ttame ⟶ ℤ₂`, `σ ↦ 1`, `τ ↦ 0`.  Built as the
    map into `ℤ₂ = lim_n ZMod(2ⁿ)` whose `n`-th coordinate is `tameLayerHom n`. 
    **Compatibility of the two markings of `Γ_A`** (manuscript Prop 3.14,
    `prop:compatiblemarking`): the pro-`2` quotient `p : Γ_A ⟶ Π` and the tame quotient
    `gammaTameMap : Γ_A ⟶ T_A` induce the *same* unramified character `Γ_A ⟶ ℤ₂`,
    i.e. `p ≫ ν₂ = gammaTameMap ≫ ν_t`.
    
    Both composites are continuous homs `Γ_A ⟶ ℤ₂`, so it suffices to check equality on
    the four topological generators `gammaGen` (`gammaGen_hom_ext`).  There the manuscript
    marking σ↦1, τ,x₀,x₁↦0 is exactly the recorded generator images: σ ↦ `z2One` on both
    sides, while τ, x₀, x₁ ↦ `z2Zero = 1`. 
  • defdefined in Q2Presentation/Boundary/BoundaryGammaA.lean
    complete
    def Q2Presentation.boundaryPackage_GammaA :
      Q2Presentation.BoundaryPackageQ2Presentation.BoundaryPackage (Γ : ProfiniteGrp.{0}) : TypeA **boundary package** on a profinite group `Γ`: the uniform Stage-C data of a tame
    quotient, a maximal pro-`2` quotient, and a common unramified character `ℤ₂` through which
    both factor (manuscript Prop 3.14, `prop:compatiblemarking`; plan Turn 4 §6).  The
    compatibility `tameMap ≫ ν_t = ν = pro2Map ≫ ν_2` records that the two markings agree on
    the full unramified coordinate, not merely modulo `2`.  Q2Presentation.GammaAQ2Presentation.GammaA : ProfiniteGrp.{0}The candidate profinite group `Γ_A`, the cofiltered inverse limit (in
    `ProfiniteGrp`) of all admissible finite marked quotients (manuscript
    eq. `candidateinverse`). 
    def Q2Presentation.boundaryPackage_GammaA :
      Q2Presentation.BoundaryPackageQ2Presentation.BoundaryPackage (Γ : ProfiniteGrp.{0}) : TypeA **boundary package** on a profinite group `Γ`: the uniform Stage-C data of a tame
    quotient, a maximal pro-`2` quotient, and a common unramified character `ℤ₂` through which
    both factor (manuscript Prop 3.14, `prop:compatiblemarking`; plan Turn 4 §6).  The
    compatibility `tameMap ≫ ν_t = ν = pro2Map ≫ ν_2` records that the two markings agree on
    the full unramified coordinate, not merely modulo `2`. 
        Q2Presentation.GammaAQ2Presentation.GammaA : ProfiniteGrp.{0}The candidate profinite group `Γ_A`, the cofiltered inverse limit (in
    `ProfiniteGrp`) of all admissible finite marked quotients (manuscript
    eq. `candidateinverse`). 
    **The candidate boundary package** (manuscript Prop 3.14, `prop:compatiblemarking`;
    plan Turn 4 §6).  The Stage-C data of `Γ_A`: the common tame quotient `gammaTameMap`,
    the maximal pro-`2` quotient `p : Γ_A ⟶ Π`, and the common unramified character
    `ν = gammaTameMap ≫ ν_t`, through which both factor. 
Proof

Proved in §3 of the paper. Ingredients: Corollary 3.6.