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
    

Proof state:
case intro.hm.hr
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
r : R
⊢ P ((algebraMap R (CliffordAlgebra Q)) r * b)
    (_ : (algebraMap R (CliffordAlgebra Q)) r * b ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)

Next tactic:
| hr r =>
      simp_rw [← Algebra.smul_def]
      exact hr _ (Submodule.smul_mem _ _ hb)
/-- 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 =>
      

Proof state:
case intro.hm.hr
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
r : R
⊢ P ((algebraMap R (CliffordAlgebra Q)) r * b)
    (_ : (algebraMap R (CliffordAlgebra Q)) r * b ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)

Next tactic:
simp_rw [← Algebra.smul_def]
/-- 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]
      

Proof state:
case intro.hm.hr
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
r : R
⊢ P (r • b) (_ : r • b ∈ evenOdd Q n)

Next tactic:
exact hr _ (Submodule.smul_mem _ _ hb)
/-- 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)
    

Proof state:
case intro.hm.hadd
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 y : CliffordAlgebra Q
n : ℕ
hx : x ∈ (LinearMap.range (ι Q) ^ 2) ^ n
hy : y ∈ (LinearMap.range (ι Q) ^ 2) ^ n
ihx : P (x * b) (_ : x * b ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)
ihy : P (y * b) (_ : y * b ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)
⊢ P ((x + y) * b) (_ : (x + y) * b ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)

Next tactic:
| hadd x y n hx 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 =>
      

Proof state:
case intro.hm.hadd
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 y : CliffordAlgebra Q
n : ℕ
hx : x ∈ (LinearMap.range (ι Q) ^ 2) ^ n
hy : y ∈ (LinearMap.range (ι Q) ^ 2) ^ n
ihx : P (x * b) (_ : x * b ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)
ihy : P (y * b) (_ : y * b ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)
⊢ P ((x + y) * b) (_ : (x + y) * b ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)

Next tactic:
simp_rw [add_mul]
/-- 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]
      

Proof state:
case intro.hm.hadd
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 y : CliffordAlgebra Q
n : ℕ
hx : x ∈ (LinearMap.range (ι Q) ^ 2) ^ n
hy : y ∈ (LinearMap.range (ι Q) ^ 2) ^ n
ihx : P (x * b) (_ : x * b ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)
ihy : P (y * b) (_ : y * b ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)
⊢ P (x * b + y * b) (_ : x * b + y * b ∈ evenOdd Q n✝)

Next tactic:
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
    

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
hx : x ∈ LinearMap.range (ι Q) ^ 2
n'' : ℕ
y : CliffordAlgebra Q
hy : y ∈ (LinearMap.range (ι Q) ^ 2) ^ n''
ihy : P (y * b) (_ : y * b ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)
⊢ P (x * y * b) (_ : x * y * b ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)

Next tactic:
| 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
      | 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 =>
      

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
hx : x ∈ LinearMap.range (ι Q) ^ 2
n'' : ℕ
y : CliffordAlgebra Q
hy : y ∈ (LinearMap.range (ι Q) ^ 2) ^ n''
ihy : P (y * b) (_ : y * b ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)
⊢ P (x * y * b) (_ : x * y * b ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)

Next tactic:
revert hx
/-- 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
      

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)
⊢ ∀ (hx : x ∈ LinearMap.range (ι Q) ^ 2), P (x * y * b) (_ : x * y * b ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)

Next tactic:
simp_rw [pow_two]
/-- 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]
      

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)
⊢ ∀ (hx : x ∈ LinearMap.range (ι Q) * LinearMap.range (ι Q)),
    P (x * y * b) (_ : x * y * b ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)

Next tactic:
intro hx2