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
      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 =>
        

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:
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]
      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
      | ha x hx y hy ihx ihy =>
        simp_rw [add_mul]
        

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✝ * b + y * y✝ * b) (_ : x * y✝ * b + y * 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
    | 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
  

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

Next tactic:
| ha x y hx hy ihx ihy =>
    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
      | 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
  | ha x y hx hy ihx ihy =>
    

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

Next tactic:
apply hadd ihx ihy
/-- To show a property is true on the even parts, it suffices to show it is true on the
scalars, closed under addition, and under left-multiplication by a pair of vectors. -/
@[elab_as_elim]
theorem even_induction {P : ∀ x, x ∈ evenOdd Q 0 → Prop}
    (hr : ∀ r : R, P (algebraMap _ _ r) (SetLike.algebraMap_mem_graded _ _))
    (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 (0 : ZMod 2) ▸ SetLike.mul_mem_graded (ι_mul_ι_mem_evenOdd_zero Q m₁ m₂) hx))
    (x : CliffordAlgebra Q) (hx : x ∈ evenOdd Q 0) : P x hx := by
  

Proof state:
R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
Q : QuadraticForm R M
P : (x : CliffordAlgebra Q) → x ∈ evenOdd Q 0 → Prop
hr : ∀ (r : R), P ((algebraMap R (CliffordAlgebra Q)) r) (_ : (algebraMap R (CliffordAlgebra Q)) r ∈ evenOdd Q 0)
hadd :
  ∀ {x y : CliffordAlgebra Q} {hx : x ∈ evenOdd Q 0} {hy : y ∈ evenOdd Q 0},
    P x hx → P y hy → P (x + y) (_ : x + y ∈ evenOdd Q 0)
hιι_mul :
  ∀ (m₁ m₂ : M) {x : CliffordAlgebra Q} {hx : x ∈ evenOdd Q 0},
    P x hx → P ((ι Q) m₁ * (ι Q) m₂ * x) (_ : (ι Q) m₁ * (ι Q) m₂ * x ∈ evenOdd Q 0)
x : CliffordAlgebra Q
hx : x ∈ evenOdd Q 0
⊢ P x hx

Next tactic:
refine' evenOdd_induction Q 0 (fun rx => _) (@hadd) hιι_mul x hx
/-- To show a property is true on the even parts, it suffices to show it is true on the
scalars, closed under addition, and under left-multiplication by a pair of vectors. -/
@[elab_as_elim]
theorem even_induction {P : ∀ x, x ∈ evenOdd Q 0 → Prop}
    (hr : ∀ r : R, P (algebraMap _ _ r) (SetLike.algebraMap_mem_graded _ _))
    (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 (0 : ZMod 2) ▸ SetLike.mul_mem_graded (ι_mul_ι_mem_evenOdd_zero Q m₁ m₂) hx))
    (x : CliffordAlgebra Q) (hx : x ∈ evenOdd Q 0) : P x hx := by
  refine' evenOdd_induction Q 0 (fun rx => _) (@hadd) hιι_mul x hx
  

Proof state:
R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
Q : QuadraticForm R M
P : (x : CliffordAlgebra Q) → x ∈ evenOdd Q 0 → Prop
hr : ∀ (r : R), P ((algebraMap R (CliffordAlgebra Q)) r) (_ : (algebraMap R (CliffordAlgebra Q)) r ∈ evenOdd Q 0)
hadd :
  ∀ {x y : CliffordAlgebra Q} {hx : x ∈ evenOdd Q 0} {hy : y ∈ evenOdd Q 0},
    P x hx → P y hy → P (x + y) (_ : x + y ∈ evenOdd Q 0)
hιι_mul :
  ∀ (m₁ m₂ : M) {x : CliffordAlgebra Q} {hx : x ∈ evenOdd Q 0},
    P x hx → P ((ι Q) m₁ * (ι Q) m₂ * x) (_ : (ι Q) m₁ * (ι Q) m₂ * x ∈ evenOdd Q 0)
x : CliffordAlgebra Q
hx : x ∈ evenOdd Q 0
rx : CliffordAlgebra Q
⊢ ∀ (h : rx ∈ LinearMap.range (ι Q) ^ ZMod.val 0), P rx (_ : rx ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)

Next tactic:
rintro ⟨r, rfl⟩
/-- To show a property is true on the even parts, it suffices to show it is true on the
scalars, closed under addition, and under left-multiplication by a pair of vectors. -/
@[elab_as_elim]
theorem even_induction {P : ∀ x, x ∈ evenOdd Q 0 → Prop}
    (hr : ∀ r : R, P (algebraMap _ _ r) (SetLike.algebraMap_mem_graded _ _))
    (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 (0 : ZMod 2) ▸ SetLike.mul_mem_graded (ι_mul_ι_mem_evenOdd_zero Q m₁ m₂) hx))
    (x : CliffordAlgebra Q) (hx : x ∈ evenOdd Q 0) : P x hx := by
  refine' evenOdd_induction Q 0 (fun rx => _) (@hadd) hιι_mul x hx
  rintro ⟨r, rfl⟩
  

Proof state:
case intro
R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
Q : QuadraticForm R M
P : (x : CliffordAlgebra Q) → x ∈ evenOdd Q 0 → Prop
hr : ∀ (r : R), P ((algebraMap R (CliffordAlgebra Q)) r) (_ : (algebraMap R (CliffordAlgebra Q)) r ∈ evenOdd Q 0)
hadd :
  ∀ {x y : CliffordAlgebra Q} {hx : x ∈ evenOdd Q 0} {hy : y ∈ evenOdd Q 0},
    P x hx → P y hy → P (x + y) (_ : x + y ∈ evenOdd Q 0)
hιι_mul :
  ∀ (m₁ m₂ : M) {x : CliffordAlgebra Q} {hx : x ∈ evenOdd Q 0},
    P x hx → P ((ι Q) m₁ * (ι Q) m₂ * x) (_ : (ι Q) m₁ * (ι Q) m₂ * x ∈ evenOdd Q 0)
x : CliffordAlgebra Q
hx : x ∈ evenOdd Q 0
r : R
⊢ P ((Algebra.linearMap R (CliffordAlgebra Q)) r)
    (_ : (Algebra.linearMap R (CliffordAlgebra Q)) r ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)

Next tactic:
exact hr r
/-- To show a property is true on the odd parts, it suffices to show it is true on the
vectors, closed under addition, and under left-multiplication by a pair of vectors. -/
@[elab_as_elim]
theorem odd_induction {P : ∀ x, x ∈ evenOdd Q 1 → Prop}
    (hι : ∀ v, P (ι Q v) (ι_mem_evenOdd_one _ _))
    (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 (1 : ZMod 2) ▸ SetLike.mul_mem_graded (ι_mul_ι_mem_evenOdd_zero Q m₁ m₂) hx))
    (x : CliffordAlgebra Q) (hx : x ∈ evenOdd Q 1) : P x hx := by
  

Proof state:
R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
Q : QuadraticForm R M
P : (x : CliffordAlgebra Q) → x ∈ evenOdd Q 1 → Prop
hι : ∀ (v : M), P ((ι Q) v) (_ : (ι Q) v ∈ evenOdd Q 1)
hadd :
  ∀ {x y : CliffordAlgebra Q} {hx : x ∈ evenOdd Q 1} {hy : y ∈ evenOdd Q 1},
    P x hx → P y hy → P (x + y) (_ : x + y ∈ evenOdd Q 1)
hιι_mul :
  ∀ (m₁ m₂ : M) {x : CliffordAlgebra Q} {hx : x ∈ evenOdd Q 1},
    P x hx → P ((ι Q) m₁ * (ι Q) m₂ * x) (_ : (ι Q) m₁ * (ι Q) m₂ * x ∈ evenOdd Q 1)
x : CliffordAlgebra Q
hx : x ∈ evenOdd Q 1
⊢ P x hx

Next tactic:
refine' evenOdd_induction Q 1 (fun ιv => _) (@hadd) hιι_mul x hx
/-- To show a property is true on the odd parts, it suffices to show it is true on the
vectors, closed under addition, and under left-multiplication by a pair of vectors. -/
@[elab_as_elim]
theorem odd_induction {P : ∀ x, x ∈ evenOdd Q 1 → Prop}
    (hι : ∀ v, P (ι Q v) (ι_mem_evenOdd_one _ _))
    (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 (1 : ZMod 2) ▸ SetLike.mul_mem_graded (ι_mul_ι_mem_evenOdd_zero Q m₁ m₂) hx))
    (x : CliffordAlgebra Q) (hx : x ∈ evenOdd Q 1) : P x hx := by
  refine' evenOdd_induction Q 1 (fun ιv => _) (@hadd) hιι_mul x hx
  -- porting note: was `simp_rw [ZMod.val_one, pow_one]`, lean4#1926
  

Proof state:
R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
Q : QuadraticForm R M
P : (x : CliffordAlgebra Q) → x ∈ evenOdd Q 1 → Prop
hι : ∀ (v : M), P ((ι Q) v) (_ : (ι Q) v ∈ evenOdd Q 1)
hadd :
  ∀ {x y : CliffordAlgebra Q} {hx : x ∈ evenOdd Q 1} {hy : y ∈ evenOdd Q 1},
    P x hx → P y hy → P (x + y) (_ : x + y ∈ evenOdd Q 1)
hιι_mul :
  ∀ (m₁ m₂ : M) {x : CliffordAlgebra Q} {hx : x ∈ evenOdd Q 1},
    P x hx → P ((ι Q) m₁ * (ι Q) m₂ * x) (_ : (ι Q) m₁ * (ι Q) m₂ * x ∈ evenOdd Q 1)
x : CliffordAlgebra Q
hx : x ∈ evenOdd Q 1
ιv : CliffordAlgebra Q
⊢ ∀ (h : ιv ∈ LinearMap.range (ι Q) ^ ZMod.val 1), P ιv (_ : ιv ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)

Next tactic:
intro h
/-- To show a property is true on the odd parts, it suffices to show it is true on the
vectors, closed under addition, and under left-multiplication by a pair of vectors. -/
@[elab_as_elim]
theorem odd_induction {P : ∀ x, x ∈ evenOdd Q 1 → Prop}
    (hι : ∀ v, P (ι Q v) (ι_mem_evenOdd_one _ _))
    (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 (1 : ZMod 2) ▸ SetLike.mul_mem_graded (ι_mul_ι_mem_evenOdd_zero Q m₁ m₂) hx))
    (x : CliffordAlgebra Q) (hx : x ∈ evenOdd Q 1) : P x hx := by
  refine' evenOdd_induction Q 1 (fun ιv => _) (@hadd) hιι_mul x hx
  -- porting note: was `simp_rw [ZMod.val_one, pow_one]`, lean4#1926
  intro h; 

Proof state:
R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
Q : QuadraticForm R M
P : (x : CliffordAlgebra Q) → x ∈ evenOdd Q 1 → Prop
hι : ∀ (v : M), P ((ι Q) v) (_ : (ι Q) v ∈ evenOdd Q 1)
hadd :
  ∀ {x y : CliffordAlgebra Q} {hx : x ∈ evenOdd Q 1} {hy : y ∈ evenOdd Q 1},
    P x hx → P y hy → P (x + y) (_ : x + y ∈ evenOdd Q 1)
hιι_mul :
  ∀ (m₁ m₂ : M) {x : CliffordAlgebra Q} {hx : x ∈ evenOdd Q 1},
    P x hx → P ((ι Q) m₁ * (ι Q) m₂ * x) (_ : (ι Q) m₁ * (ι Q) m₂ * x ∈ evenOdd Q 1)
x : CliffordAlgebra Q
hx : x ∈ evenOdd Q 1
ιv : CliffordAlgebra Q
h : ιv ∈ LinearMap.range (ι Q) ^ ZMod.val 1
⊢ P ιv (_ : ιv ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)

Next tactic:
rw [ZMod.val_one, pow_one] at h
/-- To show a property is true on the odd parts, it suffices to show it is true on the
vectors, closed under addition, and under left-multiplication by a pair of vectors. -/
@[elab_as_elim]
theorem odd_induction {P : ∀ x, x ∈ evenOdd Q 1 → Prop}
    (hι : ∀ v, P (ι Q v) (ι_mem_evenOdd_one _ _))
    (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 (1 : ZMod 2) ▸ SetLike.mul_mem_graded (ι_mul_ι_mem_evenOdd_zero Q m₁ m₂) hx))
    (x : CliffordAlgebra Q) (hx : x ∈ evenOdd Q 1) : P x hx := by
  refine' evenOdd_induction Q 1 (fun ιv => _) (@hadd) hιι_mul x hx
  -- porting note: was `simp_rw [ZMod.val_one, pow_one]`, lean4#1926
  intro h; rw [ZMod.val_one, pow_one] at h; 

Proof state:
R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
Q : QuadraticForm R M
P : (x : CliffordAlgebra Q) → x ∈ evenOdd Q 1 → Prop
hι : ∀ (v : M), P ((ι Q) v) (_ : (ι Q) v ∈ evenOdd Q 1)
hadd :
  ∀ {x y : CliffordAlgebra Q} {hx : x ∈ evenOdd Q 1} {hy : y ∈ evenOdd Q 1},
    P x hx → P y hy → P (x + y) (_ : x + y ∈ evenOdd Q 1)
hιι_mul :
  ∀ (m₁ m₂ : M) {x : CliffordAlgebra Q} {hx : x ∈ evenOdd Q 1},
    P x hx → P ((ι Q) m₁ * (ι Q) m₂ * x) (_ : (ι Q) m₁ * (ι Q) m₂ * x ∈ evenOdd Q 1)
x : CliffordAlgebra Q
hx : x ∈ evenOdd Q 1
ιv : CliffordAlgebra Q
h✝ : ιv ∈ LinearMap.range (ι Q) ^ ZMod.val 1
h : ιv ∈ LinearMap.range (ι Q)
⊢ P ιv (_ : ιv ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)

Next tactic:
revert h
/-- To show a property is true on the odd parts, it suffices to show it is true on the
vectors, closed under addition, and under left-multiplication by a pair of vectors. -/
@[elab_as_elim]
theorem odd_induction {P : ∀ x, x ∈ evenOdd Q 1 → Prop}
    (hι : ∀ v, P (ι Q v) (ι_mem_evenOdd_one _ _))
    (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 (1 : ZMod 2) ▸ SetLike.mul_mem_graded (ι_mul_ι_mem_evenOdd_zero Q m₁ m₂) hx))
    (x : CliffordAlgebra Q) (hx : x ∈ evenOdd Q 1) : P x hx := by
  refine' evenOdd_induction Q 1 (fun ιv => _) (@hadd) hιι_mul x hx
  -- porting note: was `simp_rw [ZMod.val_one, pow_one]`, lean4#1926
  intro h; rw [ZMod.val_one, pow_one] at h; revert h
  

Proof state:
R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
Q : QuadraticForm R M
P : (x : CliffordAlgebra Q) → x ∈ evenOdd Q 1 → Prop
hι : ∀ (v : M), P ((ι Q) v) (_ : (ι Q) v ∈ evenOdd Q 1)
hadd :
  ∀ {x y : CliffordAlgebra Q} {hx : x ∈ evenOdd Q 1} {hy : y ∈ evenOdd Q 1},
    P x hx → P y hy → P (x + y) (_ : x + y ∈ evenOdd Q 1)
hιι_mul :
  ∀ (m₁ m₂ : M) {x : CliffordAlgebra Q} {hx : x ∈ evenOdd Q 1},
    P x hx → P ((ι Q) m₁ * (ι Q) m₂ * x) (_ : (ι Q) m₁ * (ι Q) m₂ * x ∈ evenOdd Q 1)
x : CliffordAlgebra Q
hx : x ∈ evenOdd Q 1
ιv : CliffordAlgebra Q
h : ιv ∈ LinearMap.range (ι Q) ^ ZMod.val 1
⊢ ιv ∈ LinearMap.range (ι Q) → P ιv (_ : ιv ∈ ⨆ i, LinearMap.range (ι Q) ^ ↑i)

Next tactic:
rintro ⟨v, rfl⟩