l3lab/ntp-mathlib huggingface dataset:
/-- To show a property is true on the even or odd part, it suffices to show it is true on the
scalars or vectors (respectively), closed under addition, and under left-multiplication by a pair
of vectors. -/
@[elab_as_elim]
theorem evenOdd_induction (n : ZMod 2) {P : ∀ x, x ∈ evenOdd Q n → Prop}
    (hr :
      ∀ (v) (h : v ∈ LinearMap.range (ι Q) ^ n.val),
        P v (Submodule.mem_iSup_of_mem ⟨n.val, n.nat_cast_zmod_val⟩ h))
    (hadd : ∀ {x y hx hy}, P x hx → P y hy → P (x + y) (Submodule.add_mem _ hx hy))
    (hιι_mul :
      ∀ (m₁ m₂) {x hx},
        P x hx →
          P (ι Q m₁ * ι Q m₂ * x)
            (zero_add n ▸ SetLike.mul_mem_graded (ι_mul_ι_mem_evenOdd_zero Q m₁ m₂) hx))
    (x : CliffordAlgebra Q) (hx : x ∈ evenOdd Q n) : P x hx := by
  apply Submodule.iSup_induction' (C := P) _ (hr 0 (Submodule.zero_mem _)) @hadd
  refine' Subtype.rec _
  simp_rw [ZMod.nat_coe_zmod_eq_iff, add_comm n.val]
  rintro n' ⟨k, rfl⟩ xv
  simp_rw [pow_add, pow_mul]
  intro hxv
  induction hxv using Submodule.mul_induction_on' with
  | hm a ha b hb =>
    induction ha using Submodule.pow_induction_on_left' with
    | hr r =>
      simp_rw [← Algebra.smul_def]
      exact hr _ (Submodule.smul_mem _ _ hb)
    | hadd x y n hx hy ihx ihy =>
      simp_rw [add_mul]
      apply hadd ihx ihy
    | hmul x hx n'' y hy ihy =>
      revert hx
      simp_rw [pow_two]
      intro hx2
      

Proof state:
case intro.hm.hmul
R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
Q : QuadraticForm R M
n : ZMod 2
P : (x : CliffordAlgebra Q) → x ∈ evenOdd Q n → Prop
hr :
  ∀ (v : CliffordAlgebra Q) (h : v ∈ LinearMap.range (ι Q) ^ ZMod.val n), P v (_ : v ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)
hadd :
  ∀ {x y : CliffordAlgebra Q} {hx : x ∈ evenOdd Q n} {hy : y ∈ evenOdd Q n},
    P x hx → P y hy → P (x + y) (_ : x + y ∈ evenOdd Q n)
hιι_mul :
  ∀ (m₁ m₂ : M) {x : CliffordAlgebra Q} {hx : x ∈ evenOdd Q n},
    P x hx → P ((ι Q) m₁ * (ι Q) m₂ * x) (_ : (ι Q) m₁ * (ι Q) m₂ * x ∈ evenOdd Q n)
x✝ : CliffordAlgebra Q
hx : x✝ ∈ evenOdd Q n
k : ℕ
xv a b : CliffordAlgebra Q
hb : b ∈ LinearMap.range (ι Q) ^ ZMod.val n
x : CliffordAlgebra Q
n'' : ℕ
y : CliffordAlgebra Q
hy : y ∈ (LinearMap.range (ι Q) ^ 2) ^ n''
ihy : P (y * b) (_ : y * b ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)
hx2 : x ∈ LinearMap.range (ι Q) * LinearMap.range (ι Q)
⊢ P (x * y * b) (_ : x * y * b ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)

Next tactic:
induction hx2 using Submodule.mul_induction_on' with
      | hm m hm n hn =>
        simp_rw [LinearMap.mem_range] at hm hn
        obtain ⟨m₁, rfl⟩ := hm; obtain ⟨m₂, rfl⟩ := hn
        simp_rw [mul_assoc _ y b]
        refine' hιι_mul _ _ ihy
      | ha x hx y hy ihx ihy =>
        simp_rw [add_mul]
        apply hadd ihx ihy
/-- To show a property is true on the even or odd part, it suffices to show it is true on the
scalars or vectors (respectively), closed under addition, and under left-multiplication by a pair
of vectors. -/
@[elab_as_elim]
theorem evenOdd_induction (n : ZMod 2) {P : ∀ x, x ∈ evenOdd Q n → Prop}
    (hr :
      ∀ (v) (h : v ∈ LinearMap.range (ι Q) ^ n.val),
        P v (Submodule.mem_iSup_of_mem ⟨n.val, n.nat_cast_zmod_val⟩ h))
    (hadd : ∀ {x y hx hy}, P x hx → P y hy → P (x + y) (Submodule.add_mem _ hx hy))
    (hιι_mul :
      ∀ (m₁ m₂) {x hx},
        P x hx →
          P (ι Q m₁ * ι Q m₂ * x)
            (zero_add n ▸ SetLike.mul_mem_graded (ι_mul_ι_mem_evenOdd_zero Q m₁ m₂) hx))
    (x : CliffordAlgebra Q) (hx : x ∈ evenOdd Q n) : P x hx := by
  apply Submodule.iSup_induction' (C := P) _ (hr 0 (Submodule.zero_mem _)) @hadd
  refine' Subtype.rec _
  simp_rw [ZMod.nat_coe_zmod_eq_iff, add_comm n.val]
  rintro n' ⟨k, rfl⟩ xv
  simp_rw [pow_add, pow_mul]
  intro hxv
  induction hxv using Submodule.mul_induction_on' with
  | hm a ha b hb =>
    induction ha using Submodule.pow_induction_on_left' with
    | hr r =>
      simp_rw [← Algebra.smul_def]
      exact hr _ (Submodule.smul_mem _ _ hb)
    | hadd x y n hx hy ihx ihy =>
      simp_rw [add_mul]
      apply hadd ihx ihy
    | hmul x hx n'' y hy ihy =>
      revert hx
      simp_rw [pow_two]
      intro hx2
      induction hx2 using Submodule.mul_induction_on' with
      

Proof state:
case intro.hm.hmul.hm
R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
Q : QuadraticForm R M
n✝ : ZMod 2
P : (x : CliffordAlgebra Q) → x ∈ evenOdd Q n✝ → Prop
hr :
  ∀ (v : CliffordAlgebra Q) (h : v ∈ LinearMap.range (ι Q) ^ ZMod.val n✝), P v (_ : v ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)
hadd :
  ∀ {x y : CliffordAlgebra Q} {hx : x ∈ evenOdd Q n✝} {hy : y ∈ evenOdd Q n✝},
    P x hx → P y hy → P (x + y) (_ : x + y ∈ evenOdd Q n✝)
hιι_mul :
  ∀ (m₁ m₂ : M) {x : CliffordAlgebra Q} {hx : x ∈ evenOdd Q n✝},
    P x hx → P ((ι Q) m₁ * (ι Q) m₂ * x) (_ : (ι Q) m₁ * (ι Q) m₂ * x ∈ evenOdd Q n✝)
x✝ : CliffordAlgebra Q
hx : x✝ ∈ evenOdd Q n✝
k : ℕ
xv a b : CliffordAlgebra Q
hb : b ∈ LinearMap.range (ι Q) ^ ZMod.val n✝
x : CliffordAlgebra Q
n'' : ℕ
y : CliffordAlgebra Q
hy : y ∈ (LinearMap.range (ι Q) ^ 2) ^ n''
ihy : P (y * b) (_ : y * b ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)
m : CliffordAlgebra Q
hm : m ∈ LinearMap.range (ι Q)
n : CliffordAlgebra Q
hn : n ∈ LinearMap.range (ι Q)
⊢ P (m * n * y * b) (_ : m * n * y * b ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)

Next tactic:
| hm m hm n hn =>
        simp_rw [LinearMap.mem_range] at hm hn
        obtain ⟨m₁, rfl⟩ := hm; obtain ⟨m₂, rfl⟩ := hn
        simp_rw [mul_assoc _ y b]
        refine' hιι_mul _ _ ihy
/-- To show a property is true on the even or odd part, it suffices to show it is true on the
scalars or vectors (respectively), closed under addition, and under left-multiplication by a pair
of vectors. -/
@[elab_as_elim]
theorem evenOdd_induction (n : ZMod 2) {P : ∀ x, x ∈ evenOdd Q n → Prop}
    (hr :
      ∀ (v) (h : v ∈ LinearMap.range (ι Q) ^ n.val),
        P v (Submodule.mem_iSup_of_mem ⟨n.val, n.nat_cast_zmod_val⟩ h))
    (hadd : ∀ {x y hx hy}, P x hx → P y hy → P (x + y) (Submodule.add_mem _ hx hy))
    (hιι_mul :
      ∀ (m₁ m₂) {x hx},
        P x hx →
          P (ι Q m₁ * ι Q m₂ * x)
            (zero_add n ▸ SetLike.mul_mem_graded (ι_mul_ι_mem_evenOdd_zero Q m₁ m₂) hx))
    (x : CliffordAlgebra Q) (hx : x ∈ evenOdd Q n) : P x hx := by
  apply Submodule.iSup_induction' (C := P) _ (hr 0 (Submodule.zero_mem _)) @hadd
  refine' Subtype.rec _
  simp_rw [ZMod.nat_coe_zmod_eq_iff, add_comm n.val]
  rintro n' ⟨k, rfl⟩ xv
  simp_rw [pow_add, pow_mul]
  intro hxv
  induction hxv using Submodule.mul_induction_on' with
  | hm a ha b hb =>
    induction ha using Submodule.pow_induction_on_left' with
    | hr r =>
      simp_rw [← Algebra.smul_def]
      exact hr _ (Submodule.smul_mem _ _ hb)
    | hadd x y n hx hy ihx ihy =>
      simp_rw [add_mul]
      apply hadd ihx ihy
    | hmul x hx n'' y hy ihy =>
      revert hx
      simp_rw [pow_two]
      intro hx2
      induction hx2 using Submodule.mul_induction_on' with
      | hm m hm n hn =>
        

Proof state:
case intro.hm.hmul.hm
R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
Q : QuadraticForm R M
n✝ : ZMod 2
P : (x : CliffordAlgebra Q) → x ∈ evenOdd Q n✝ → Prop
hr :
  ∀ (v : CliffordAlgebra Q) (h : v ∈ LinearMap.range (ι Q) ^ ZMod.val n✝), P v (_ : v ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)
hadd :
  ∀ {x y : CliffordAlgebra Q} {hx : x ∈ evenOdd Q n✝} {hy : y ∈ evenOdd Q n✝},
    P x hx → P y hy → P (x + y) (_ : x + y ∈ evenOdd Q n✝)
hιι_mul :
  ∀ (m₁ m₂ : M) {x : CliffordAlgebra Q} {hx : x ∈ evenOdd Q n✝},
    P x hx → P ((ι Q) m₁ * (ι Q) m₂ * x) (_ : (ι Q) m₁ * (ι Q) m₂ * x ∈ evenOdd Q n✝)
x✝ : CliffordAlgebra Q
hx : x✝ ∈ evenOdd Q n✝
k : ℕ
xv a b : CliffordAlgebra Q
hb : b ∈ LinearMap.range (ι Q) ^ ZMod.val n✝
x : CliffordAlgebra Q
n'' : ℕ
y : CliffordAlgebra Q
hy : y ∈ (LinearMap.range (ι Q) ^ 2) ^ n''
ihy : P (y * b) (_ : y * b ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)
m : CliffordAlgebra Q
hm : m ∈ LinearMap.range (ι Q)
n : CliffordAlgebra Q
hn : n ∈ LinearMap.range (ι Q)
⊢ P (m * n * y * b) (_ : m * n * y * b ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)

Next tactic:
simp_rw [LinearMap.mem_range] at hm hn
/-- To show a property is true on the even or odd part, it suffices to show it is true on the
scalars or vectors (respectively), closed under addition, and under left-multiplication by a pair
of vectors. -/
@[elab_as_elim]
theorem evenOdd_induction (n : ZMod 2) {P : ∀ x, x ∈ evenOdd Q n → Prop}
    (hr :
      ∀ (v) (h : v ∈ LinearMap.range (ι Q) ^ n.val),
        P v (Submodule.mem_iSup_of_mem ⟨n.val, n.nat_cast_zmod_val⟩ h))
    (hadd : ∀ {x y hx hy}, P x hx → P y hy → P (x + y) (Submodule.add_mem _ hx hy))
    (hιι_mul :
      ∀ (m₁ m₂) {x hx},
        P x hx →
          P (ι Q m₁ * ι Q m₂ * x)
            (zero_add n ▸ SetLike.mul_mem_graded (ι_mul_ι_mem_evenOdd_zero Q m₁ m₂) hx))
    (x : CliffordAlgebra Q) (hx : x ∈ evenOdd Q n) : P x hx := by
  apply Submodule.iSup_induction' (C := P) _ (hr 0 (Submodule.zero_mem _)) @hadd
  refine' Subtype.rec _
  simp_rw [ZMod.nat_coe_zmod_eq_iff, add_comm n.val]
  rintro n' ⟨k, rfl⟩ xv
  simp_rw [pow_add, pow_mul]
  intro hxv
  induction hxv using Submodule.mul_induction_on' with
  | hm a ha b hb =>
    induction ha using Submodule.pow_induction_on_left' with
    | hr r =>
      simp_rw [← Algebra.smul_def]
      exact hr _ (Submodule.smul_mem _ _ hb)
    | hadd x y n hx hy ihx ihy =>
      simp_rw [add_mul]
      apply hadd ihx ihy
    | hmul x hx n'' y hy ihy =>
      revert hx
      simp_rw [pow_two]
      intro hx2
      induction hx2 using Submodule.mul_induction_on' with
      | hm m hm n hn =>
        simp_rw [LinearMap.mem_range] at hm hn
        

Proof state:
case intro.hm.hmul.hm
R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
Q : QuadraticForm R M
n✝ : ZMod 2
P : (x : CliffordAlgebra Q) → x ∈ evenOdd Q n✝ → Prop
hr :
  ∀ (v : CliffordAlgebra Q) (h : v ∈ LinearMap.range (ι Q) ^ ZMod.val n✝), P v (_ : v ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)
hadd :
  ∀ {x y : CliffordAlgebra Q} {hx : x ∈ evenOdd Q n✝} {hy : y ∈ evenOdd Q n✝},
    P x hx → P y hy → P (x + y) (_ : x + y ∈ evenOdd Q n✝)
hιι_mul :
  ∀ (m₁ m₂ : M) {x : CliffordAlgebra Q} {hx : x ∈ evenOdd Q n✝},
    P x hx → P ((ι Q) m₁ * (ι Q) m₂ * x) (_ : (ι Q) m₁ * (ι Q) m₂ * x ∈ evenOdd Q n✝)
x✝ : CliffordAlgebra Q
hx : x✝ ∈ evenOdd Q n✝
k : ℕ
xv a b : CliffordAlgebra Q
hb : b ∈ LinearMap.range (ι Q) ^ ZMod.val n✝
x : CliffordAlgebra Q
n'' : ℕ
y : CliffordAlgebra Q
hy : y ∈ (LinearMap.range (ι Q) ^ 2) ^ n''
ihy : P (y * b) (_ : y * b ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)
m : CliffordAlgebra Q
hm✝ : m ∈ LinearMap.range (ι Q)
n : CliffordAlgebra Q
hn✝ : n ∈ LinearMap.range (ι Q)
hm : ∃ y, (ι Q) y = m
hn : ∃ y, (ι Q) y = n
⊢ P (m * n * y * b) (_ : m * n * y * b ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)

Next tactic:
obtain ⟨m₁, rfl⟩ := hm
/-- To show a property is true on the even or odd part, it suffices to show it is true on the
scalars or vectors (respectively), closed under addition, and under left-multiplication by a pair
of vectors. -/
@[elab_as_elim]
theorem evenOdd_induction (n : ZMod 2) {P : ∀ x, x ∈ evenOdd Q n → Prop}
    (hr :
      ∀ (v) (h : v ∈ LinearMap.range (ι Q) ^ n.val),
        P v (Submodule.mem_iSup_of_mem ⟨n.val, n.nat_cast_zmod_val⟩ h))
    (hadd : ∀ {x y hx hy}, P x hx → P y hy → P (x + y) (Submodule.add_mem _ hx hy))
    (hιι_mul :
      ∀ (m₁ m₂) {x hx},
        P x hx →
          P (ι Q m₁ * ι Q m₂ * x)
            (zero_add n ▸ SetLike.mul_mem_graded (ι_mul_ι_mem_evenOdd_zero Q m₁ m₂) hx))
    (x : CliffordAlgebra Q) (hx : x ∈ evenOdd Q n) : P x hx := by
  apply Submodule.iSup_induction' (C := P) _ (hr 0 (Submodule.zero_mem _)) @hadd
  refine' Subtype.rec _
  simp_rw [ZMod.nat_coe_zmod_eq_iff, add_comm n.val]
  rintro n' ⟨k, rfl⟩ xv
  simp_rw [pow_add, pow_mul]
  intro hxv
  induction hxv using Submodule.mul_induction_on' with
  | hm a ha b hb =>
    induction ha using Submodule.pow_induction_on_left' with
    | hr r =>
      simp_rw [← Algebra.smul_def]
      exact hr _ (Submodule.smul_mem _ _ hb)
    | hadd x y n hx hy ihx ihy =>
      simp_rw [add_mul]
      apply hadd ihx ihy
    | hmul x hx n'' y hy ihy =>
      revert hx
      simp_rw [pow_two]
      intro hx2
      induction hx2 using Submodule.mul_induction_on' with
      | hm m hm n hn =>
        simp_rw [LinearMap.mem_range] at hm hn
        obtain ⟨m₁, rfl⟩ := hm; 

Proof state:
case intro.hm.hmul.hm.intro
R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
Q : QuadraticForm R M
n✝ : ZMod 2
P : (x : CliffordAlgebra Q) → x ∈ evenOdd Q n✝ → Prop
hr :
  ∀ (v : CliffordAlgebra Q) (h : v ∈ LinearMap.range (ι Q) ^ ZMod.val n✝), P v (_ : v ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)
hadd :
  ∀ {x y : CliffordAlgebra Q} {hx : x ∈ evenOdd Q n✝} {hy : y ∈ evenOdd Q n✝},
    P x hx → P y hy → P (x + y) (_ : x + y ∈ evenOdd Q n✝)
hιι_mul :
  ∀ (m₁ m₂ : M) {x : CliffordAlgebra Q} {hx : x ∈ evenOdd Q n✝},
    P x hx → P ((ι Q) m₁ * (ι Q) m₂ * x) (_ : (ι Q) m₁ * (ι Q) m₂ * x ∈ evenOdd Q n✝)
x✝ : CliffordAlgebra Q
hx : x✝ ∈ evenOdd Q n✝
k : ℕ
xv a b : CliffordAlgebra Q
hb : b ∈ LinearMap.range (ι Q) ^ ZMod.val n✝
x : CliffordAlgebra Q
n'' : ℕ
y : CliffordAlgebra Q
hy : y ∈ (LinearMap.range (ι Q) ^ 2) ^ n''
ihy : P (y * b) (_ : y * b ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)
n : CliffordAlgebra Q
hn✝ : n ∈ LinearMap.range (ι Q)
hn : ∃ y, (ι Q) y = n
m₁ : M
hm : (ι Q) m₁ ∈ LinearMap.range (ι Q)
⊢ P ((ι Q) m₁ * n * y * b) (_ : (ι Q) m₁ * n * y * b ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)

Next tactic:
obtain ⟨m₂, rfl⟩ := hn
/-- To show a property is true on the even or odd part, it suffices to show it is true on the
scalars or vectors (respectively), closed under addition, and under left-multiplication by a pair
of vectors. -/
@[elab_as_elim]
theorem evenOdd_induction (n : ZMod 2) {P : ∀ x, x ∈ evenOdd Q n → Prop}
    (hr :
      ∀ (v) (h : v ∈ LinearMap.range (ι Q) ^ n.val),
        P v (Submodule.mem_iSup_of_mem ⟨n.val, n.nat_cast_zmod_val⟩ h))
    (hadd : ∀ {x y hx hy}, P x hx → P y hy → P (x + y) (Submodule.add_mem _ hx hy))
    (hιι_mul :
      ∀ (m₁ m₂) {x hx},
        P x hx →
          P (ι Q m₁ * ι Q m₂ * x)
            (zero_add n ▸ SetLike.mul_mem_graded (ι_mul_ι_mem_evenOdd_zero Q m₁ m₂) hx))
    (x : CliffordAlgebra Q) (hx : x ∈ evenOdd Q n) : P x hx := by
  apply Submodule.iSup_induction' (C := P) _ (hr 0 (Submodule.zero_mem _)) @hadd
  refine' Subtype.rec _
  simp_rw [ZMod.nat_coe_zmod_eq_iff, add_comm n.val]
  rintro n' ⟨k, rfl⟩ xv
  simp_rw [pow_add, pow_mul]
  intro hxv
  induction hxv using Submodule.mul_induction_on' with
  | hm a ha b hb =>
    induction ha using Submodule.pow_induction_on_left' with
    | hr r =>
      simp_rw [← Algebra.smul_def]
      exact hr _ (Submodule.smul_mem _ _ hb)
    | hadd x y n hx hy ihx ihy =>
      simp_rw [add_mul]
      apply hadd ihx ihy
    | hmul x hx n'' y hy ihy =>
      revert hx
      simp_rw [pow_two]
      intro hx2
      induction hx2 using Submodule.mul_induction_on' with
      | hm m hm n hn =>
        simp_rw [LinearMap.mem_range] at hm hn
        obtain ⟨m₁, rfl⟩ := hm; obtain ⟨m₂, rfl⟩ := hn
        

Proof state:
case intro.hm.hmul.hm.intro.intro
R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
Q : QuadraticForm R M
n : ZMod 2
P : (x : CliffordAlgebra Q) → x ∈ evenOdd Q n → Prop
hr :
  ∀ (v : CliffordAlgebra Q) (h : v ∈ LinearMap.range (ι Q) ^ ZMod.val n), P v (_ : v ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)
hadd :
  ∀ {x y : CliffordAlgebra Q} {hx : x ∈ evenOdd Q n} {hy : y ∈ evenOdd Q n},
    P x hx → P y hy → P (x + y) (_ : x + y ∈ evenOdd Q n)
hιι_mul :
  ∀ (m₁ m₂ : M) {x : CliffordAlgebra Q} {hx : x ∈ evenOdd Q n},
    P x hx → P ((ι Q) m₁ * (ι Q) m₂ * x) (_ : (ι Q) m₁ * (ι Q) m₂ * x ∈ evenOdd Q n)
x✝ : CliffordAlgebra Q
hx : x✝ ∈ evenOdd Q n
k : ℕ
xv a b : CliffordAlgebra Q
hb : b ∈ LinearMap.range (ι Q) ^ ZMod.val n
x : CliffordAlgebra Q
n'' : ℕ
y : CliffordAlgebra Q
hy : y ∈ (LinearMap.range (ι Q) ^ 2) ^ n''
ihy : P (y * b) (_ : y * b ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)
m₁ : M
hm : (ι Q) m₁ ∈ LinearMap.range (ι Q)
m₂ : M
hn : (ι Q) m₂ ∈ LinearMap.range (ι Q)
⊢ P ((ι Q) m₁ * (ι Q) m₂ * y * b) (_ : (ι Q) m₁ * (ι Q) m₂ * y * b ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)

Next tactic:
simp_rw [mul_assoc _ y b]
/-- To show a property is true on the even or odd part, it suffices to show it is true on the
scalars or vectors (respectively), closed under addition, and under left-multiplication by a pair
of vectors. -/
@[elab_as_elim]
theorem evenOdd_induction (n : ZMod 2) {P : ∀ x, x ∈ evenOdd Q n → Prop}
    (hr :
      ∀ (v) (h : v ∈ LinearMap.range (ι Q) ^ n.val),
        P v (Submodule.mem_iSup_of_mem ⟨n.val, n.nat_cast_zmod_val⟩ h))
    (hadd : ∀ {x y hx hy}, P x hx → P y hy → P (x + y) (Submodule.add_mem _ hx hy))
    (hιι_mul :
      ∀ (m₁ m₂) {x hx},
        P x hx →
          P (ι Q m₁ * ι Q m₂ * x)
            (zero_add n ▸ SetLike.mul_mem_graded (ι_mul_ι_mem_evenOdd_zero Q m₁ m₂) hx))
    (x : CliffordAlgebra Q) (hx : x ∈ evenOdd Q n) : P x hx := by
  apply Submodule.iSup_induction' (C := P) _ (hr 0 (Submodule.zero_mem _)) @hadd
  refine' Subtype.rec _
  simp_rw [ZMod.nat_coe_zmod_eq_iff, add_comm n.val]
  rintro n' ⟨k, rfl⟩ xv
  simp_rw [pow_add, pow_mul]
  intro hxv
  induction hxv using Submodule.mul_induction_on' with
  | hm a ha b hb =>
    induction ha using Submodule.pow_induction_on_left' with
    | hr r =>
      simp_rw [← Algebra.smul_def]
      exact hr _ (Submodule.smul_mem _ _ hb)
    | hadd x y n hx hy ihx ihy =>
      simp_rw [add_mul]
      apply hadd ihx ihy
    | hmul x hx n'' y hy ihy =>
      revert hx
      simp_rw [pow_two]
      intro hx2
      induction hx2 using Submodule.mul_induction_on' with
      | hm m hm n hn =>
        simp_rw [LinearMap.mem_range] at hm hn
        obtain ⟨m₁, rfl⟩ := hm; obtain ⟨m₂, rfl⟩ := hn
        simp_rw [mul_assoc _ y b]
        

Proof state:
case intro.hm.hmul.hm.intro.intro
R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
Q : QuadraticForm R M
n : ZMod 2
P : (x : CliffordAlgebra Q) → x ∈ evenOdd Q n → Prop
hr :
  ∀ (v : CliffordAlgebra Q) (h : v ∈ LinearMap.range (ι Q) ^ ZMod.val n), P v (_ : v ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)
hadd :
  ∀ {x y : CliffordAlgebra Q} {hx : x ∈ evenOdd Q n} {hy : y ∈ evenOdd Q n},
    P x hx → P y hy → P (x + y) (_ : x + y ∈ evenOdd Q n)
hιι_mul :
  ∀ (m₁ m₂ : M) {x : CliffordAlgebra Q} {hx : x ∈ evenOdd Q n},
    P x hx → P ((ι Q) m₁ * (ι Q) m₂ * x) (_ : (ι Q) m₁ * (ι Q) m₂ * x ∈ evenOdd Q n)
x✝ : CliffordAlgebra Q
hx : x✝ ∈ evenOdd Q n
k : ℕ
xv a b : CliffordAlgebra Q
hb : b ∈ LinearMap.range (ι Q) ^ ZMod.val n
x : CliffordAlgebra Q
n'' : ℕ
y : CliffordAlgebra Q
hy : y ∈ (LinearMap.range (ι Q) ^ 2) ^ n''
ihy : P (y * b) (_ : y * b ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)
m₁ : M
hm : (ι Q) m₁ ∈ LinearMap.range (ι Q)
m₂ : M
hn : (ι Q) m₂ ∈ LinearMap.range (ι Q)
⊢ P ((ι Q) m₁ * (ι Q) m₂ * (y * b)) (_ : (ι Q) m₁ * (ι Q) m₂ * (y * b) ∈ evenOdd Q n)

Next tactic:
refine' hιι_mul _ _ ihy
/-- To show a property is true on the even or odd part, it suffices to show it is true on the
scalars or vectors (respectively), closed under addition, and under left-multiplication by a pair
of vectors. -/
@[elab_as_elim]
theorem evenOdd_induction (n : ZMod 2) {P : ∀ x, x ∈ evenOdd Q n → Prop}
    (hr :
      ∀ (v) (h : v ∈ LinearMap.range (ι Q) ^ n.val),
        P v (Submodule.mem_iSup_of_mem ⟨n.val, n.nat_cast_zmod_val⟩ h))
    (hadd : ∀ {x y hx hy}, P x hx → P y hy → P (x + y) (Submodule.add_mem _ hx hy))
    (hιι_mul :
      ∀ (m₁ m₂) {x hx},
        P x hx →
          P (ι Q m₁ * ι Q m₂ * x)
            (zero_add n ▸ SetLike.mul_mem_graded (ι_mul_ι_mem_evenOdd_zero Q m₁ m₂) hx))
    (x : CliffordAlgebra Q) (hx : x ∈ evenOdd Q n) : P x hx := by
  apply Submodule.iSup_induction' (C := P) _ (hr 0 (Submodule.zero_mem _)) @hadd
  refine' Subtype.rec _
  simp_rw [ZMod.nat_coe_zmod_eq_iff, add_comm n.val]
  rintro n' ⟨k, rfl⟩ xv
  simp_rw [pow_add, pow_mul]
  intro hxv
  induction hxv using Submodule.mul_induction_on' with
  | hm a ha b hb =>
    induction ha using Submodule.pow_induction_on_left' with
    | hr r =>
      simp_rw [← Algebra.smul_def]
      exact hr _ (Submodule.smul_mem _ _ hb)
    | hadd x y n hx hy ihx ihy =>
      simp_rw [add_mul]
      apply hadd ihx ihy
    | hmul x hx n'' y hy ihy =>
      revert hx
      simp_rw [pow_two]
      intro hx2
      induction hx2 using Submodule.mul_induction_on' with
      | hm m hm n hn =>
        simp_rw [LinearMap.mem_range] at hm hn
        obtain ⟨m₁, rfl⟩ := hm; obtain ⟨m₂, rfl⟩ := hn
        simp_rw [mul_assoc _ y b]
        refine' hιι_mul _ _ ihy
      

Proof state:
case intro.hm.hmul.ha
R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
Q : QuadraticForm R M
n : ZMod 2
P : (x : CliffordAlgebra Q) → x ∈ evenOdd Q n → Prop
hr :
  ∀ (v : CliffordAlgebra Q) (h : v ∈ LinearMap.range (ι Q) ^ ZMod.val n), P v (_ : v ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)
hadd :
  ∀ {x y : CliffordAlgebra Q} {hx : x ∈ evenOdd Q n} {hy : y ∈ evenOdd Q n},
    P x hx → P y hy → P (x + y) (_ : x + y ∈ evenOdd Q n)
hιι_mul :
  ∀ (m₁ m₂ : M) {x : CliffordAlgebra Q} {hx : x ∈ evenOdd Q n},
    P x hx → P ((ι Q) m₁ * (ι Q) m₂ * x) (_ : (ι Q) m₁ * (ι Q) m₂ * x ∈ evenOdd Q n)
x✝¹ : CliffordAlgebra Q
hx✝ : x✝¹ ∈ evenOdd Q n
k : ℕ
xv a b : CliffordAlgebra Q
hb : b ∈ LinearMap.range (ι Q) ^ ZMod.val n
x✝ : CliffordAlgebra Q
n'' : ℕ
y✝ : CliffordAlgebra Q
hy✝ : y✝ ∈ (LinearMap.range (ι Q) ^ 2) ^ n''
ihy✝ : P (y✝ * b) (_ : y✝ * b ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)
x : CliffordAlgebra Q
hx : x ∈ LinearMap.range (ι Q) * LinearMap.range (ι Q)
y : CliffordAlgebra Q
hy : y ∈ LinearMap.range (ι Q) * LinearMap.range (ι Q)
ihx : P (x * y✝ * b) (_ : x * y✝ * b ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)
ihy : P (y * y✝ * b) (_ : y * y✝ * b ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)
⊢ P ((x + y) * y✝ * b) (_ : (x + y) * y✝ * b ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)

Next tactic:
| ha x hx y hy ihx ihy =>
        simp_rw [add_mul]
        apply hadd ihx ihy