[GOAL]
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
l : List M
f : M →ₗ[R] N →ₗ[R] N
hf : ∀ (m : M) (x : N), ↑(↑f m) (↑(↑f m) x) = ↑Q m • x
n : N
⊢ ↑(↑(foldr Q f hf) n) (List.prod (List.map (↑(ι Q)) l)) = List.foldr (fun m n => ↑(↑f m) n) n l
[PROOFSTEP]
induction' l with hd tl ih
[GOAL]
case nil
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
f : M →ₗ[R] N →ₗ[R] N
hf : ∀ (m : M) (x : N), ↑(↑f m) (↑(↑f m) x) = ↑Q m • x
n : N
⊢ ↑(↑(foldr Q f hf) n) (List.prod (List.map ↑(ι Q) [])) = List.foldr (fun m n => ↑(↑f m) n) n []
[PROOFSTEP]
rw [List.map_nil, List.prod_nil, List.foldr_nil, foldr_one]
[GOAL]
case cons
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
f : M →ₗ[R] N →ₗ[R] N
hf : ∀ (m : M) (x : N), ↑(↑f m) (↑(↑f m) x) = ↑Q m • x
n : N
hd : M
tl : List M
ih : ↑(↑(foldr Q f hf) n) (List.prod (List.map (↑(ι Q)) tl)) = List.foldr (fun m n => ↑(↑f m) n) n tl
⊢ ↑(↑(foldr Q f hf) n) (List.prod (List.map (↑(ι Q)) (hd :: tl))) = List.foldr (fun m n => ↑(↑f m) n) n (hd :: tl)
[PROOFSTEP]
rw [List.map_cons, List.prod_cons, List.foldr_cons, foldr_mul, foldr_ι, ih]
[GOAL]
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
f : M →ₗ[R] N →ₗ[R] N
hf : ∀ (m : M) (x : N), ↑(↑f m) (↑(↑f m) x) = ↑Q m • x
n : N
m : M
⊢ ↑(↑(foldl Q f hf) n) (↑(ι Q) m) = ↑(↑f m) n
[PROOFSTEP]
rw [← foldr_reverse, reverse_ι, foldr_ι]
[GOAL]
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
f : M →ₗ[R] N →ₗ[R] N
hf : ∀ (m : M) (x : N), ↑(↑f m) (↑(↑f m) x) = ↑Q m • x
n : N
r : R
⊢ ↑(↑(foldl Q f hf) n) (↑(algebraMap R (CliffordAlgebra Q)) r) = r • n
[PROOFSTEP]
rw [← foldr_reverse, reverse.commutes, foldr_algebraMap]
[GOAL]
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
f : M →ₗ[R] N →ₗ[R] N
hf : ∀ (m : M) (x : N), ↑(↑f m) (↑(↑f m) x) = ↑Q m • x
n : N
⊢ ↑(↑(foldl Q f hf) n) 1 = n
[PROOFSTEP]
rw [← foldr_reverse, reverse.map_one, foldr_one]
[GOAL]
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
f : M →ₗ[R] N →ₗ[R] N
hf : ∀ (m : M) (x : N), ↑(↑f m) (↑(↑f m) x) = ↑Q m • x
n : N
a b : CliffordAlgebra Q
⊢ ↑(↑(foldl Q f hf) n) (a * b) = ↑(↑(foldl Q f hf) (↑(↑(foldl Q f hf) n) a)) b
[PROOFSTEP]
rw [← foldr_reverse, ← foldr_reverse, ← foldr_reverse, reverse.map_mul, foldr_mul]
[GOAL]
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
l : List M
f : M →ₗ[R] N →ₗ[R] N
hf : ∀ (m : M) (x : N), ↑(↑f m) (↑(↑f m) x) = ↑Q m • x
n : N
⊢ ↑(↑(foldl Q f hf) n) (List.prod (List.map (↑(ι Q)) l)) = List.foldl (fun m n => ↑(↑f n) m) n l
[PROOFSTEP]
rw [← foldr_reverse, reverse_prod_map_ι, ← List.map_reverse, foldr_prod_map_ι, List.foldr_reverse]
[GOAL]
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
P : CliffordAlgebra Q → Prop
hr : ∀ (r : R), P (↑(algebraMap R (CliffordAlgebra Q)) r)
h_add : ∀ (x y : CliffordAlgebra Q), P x → P y → P (x + y)
h_ι_mul : ∀ (m : M) (x : CliffordAlgebra Q), P x → P (x * ↑(ι Q) m)
⊢ ∀ (x : CliffordAlgebra Q), P x
[PROOFSTEP]
intro x
[GOAL]
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
P : CliffordAlgebra Q → Prop
hr : ∀ (r : R), P (↑(algebraMap R (CliffordAlgebra Q)) r)
h_add : ∀ (x y : CliffordAlgebra Q), P x → P y → P (x + y)
h_ι_mul : ∀ (m : M) (x : CliffordAlgebra Q), P x → P (x * ↑(ι Q) m)
x : CliffordAlgebra Q
⊢ P x
[PROOFSTEP]
have : x ∈ ⊤ := Submodule.mem_top (R := R)
[GOAL]
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
P : CliffordAlgebra Q → Prop
hr : ∀ (r : R), P (↑(algebraMap R (CliffordAlgebra Q)) r)
h_add : ∀ (x y : CliffordAlgebra Q), P x → P y → P (x + y)
h_ι_mul : ∀ (m : M) (x : CliffordAlgebra Q), P x → P (x * ↑(ι Q) m)
x : CliffordAlgebra Q
this : x ∈ ⊤
⊢ P x
[PROOFSTEP]
rw [← iSup_ι_range_eq_top] at this 
[GOAL]
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
P : CliffordAlgebra Q → Prop
hr : ∀ (r : R), P (↑(algebraMap R (CliffordAlgebra Q)) r)
h_add : ∀ (x y : CliffordAlgebra Q), P x → P y → P (x + y)
h_ι_mul : ∀ (m : M) (x : CliffordAlgebra Q), P x → P (x * ↑(ι Q) m)
x : CliffordAlgebra Q
this : x ∈ ⨆ (i : ℕ), LinearMap.range (ι Q) ^ i
⊢ P x
[PROOFSTEP]
induction this using Submodule.iSup_induction' with
  -- _ this (fun i x hx => ?_) _ h_add
| hp i x hx =>
  induction hx using Submodule.pow_induction_on_right' with
  | hr r => exact hr r
  | hadd _x _y _i _ _ ihx ihy => exact h_add _ _ ihx ihy
  | hmul _i x _hx px m hm =>
    obtain ⟨m, rfl⟩ := hm
    exact h_ι_mul _ _ px
| h0 => simpa only [map_zero] using hr 0
| hadd _x _y _ _ ihx ihy => exact h_add _ _ ihx ihy
[GOAL]
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
P : CliffordAlgebra Q → Prop
hr : ∀ (r : R), P (↑(algebraMap R (CliffordAlgebra Q)) r)
h_add : ∀ (x y : CliffordAlgebra Q), P x → P y → P (x + y)
h_ι_mul : ∀ (m : M) (x : CliffordAlgebra Q), P x → P (x * ↑(ι Q) m)
x : CliffordAlgebra Q
this : x ∈ ⨆ (i : ℕ), LinearMap.range (ι Q) ^ i
⊢ P x
[PROOFSTEP]
induction this using Submodule.iSup_induction' with
  -- _ this (fun i x hx => ?_) _ h_add
| hp i x hx =>
  induction hx using Submodule.pow_induction_on_right' with
  | hr r => exact hr r
  | hadd _x _y _i _ _ ihx ihy => exact h_add _ _ ihx ihy
  | hmul _i x _hx px m hm =>
    obtain ⟨m, rfl⟩ := hm
    exact h_ι_mul _ _ px
| h0 => simpa only [map_zero] using hr 0
| hadd _x _y _ _ ihx ihy => exact h_add _ _ ihx ihy
[GOAL]
case hp
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
P : CliffordAlgebra Q → Prop
hr : ∀ (r : R), P (↑(algebraMap R (CliffordAlgebra Q)) r)
h_add : ∀ (x y : CliffordAlgebra Q), P x → P y → P (x + y)
h_ι_mul : ∀ (m : M) (x : CliffordAlgebra Q), P x → P (x * ↑(ι Q) m)
x✝ : CliffordAlgebra Q
i : ℕ
x : CliffordAlgebra Q
hx : x ∈ LinearMap.range (ι Q) ^ i
⊢ P x
[PROOFSTEP]

| hp i x hx =>
  induction hx using Submodule.pow_induction_on_right' with
  | hr r => exact hr r
  | hadd _x _y _i _ _ ihx ihy => exact h_add _ _ ihx ihy
  | hmul _i x _hx px m hm =>
    obtain ⟨m, rfl⟩ := hm
    exact h_ι_mul _ _ px
[GOAL]
case hp
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
P : CliffordAlgebra Q → Prop
hr : ∀ (r : R), P (↑(algebraMap R (CliffordAlgebra Q)) r)
h_add : ∀ (x y : CliffordAlgebra Q), P x → P y → P (x + y)
h_ι_mul : ∀ (m : M) (x : CliffordAlgebra Q), P x → P (x * ↑(ι Q) m)
x✝ : CliffordAlgebra Q
i : ℕ
x : CliffordAlgebra Q
hx : x ∈ LinearMap.range (ι Q) ^ i
⊢ P x
[PROOFSTEP]
induction hx using Submodule.pow_induction_on_right' with
| hr r => exact hr r
| hadd _x _y _i _ _ ihx ihy => exact h_add _ _ ihx ihy
| hmul _i x _hx px m hm =>
  obtain ⟨m, rfl⟩ := hm
  exact h_ι_mul _ _ px
[GOAL]
case hp
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
P : CliffordAlgebra Q → Prop
hr : ∀ (r : R), P (↑(algebraMap R (CliffordAlgebra Q)) r)
h_add : ∀ (x y : CliffordAlgebra Q), P x → P y → P (x + y)
h_ι_mul : ∀ (m : M) (x : CliffordAlgebra Q), P x → P (x * ↑(ι Q) m)
x✝ : CliffordAlgebra Q
i : ℕ
x : CliffordAlgebra Q
hx : x ∈ LinearMap.range (ι Q) ^ i
⊢ P x
[PROOFSTEP]
induction hx using Submodule.pow_induction_on_right' with
| hr r => exact hr r
| hadd _x _y _i _ _ ihx ihy => exact h_add _ _ ihx ihy
| hmul _i x _hx px m hm =>
  obtain ⟨m, rfl⟩ := hm
  exact h_ι_mul _ _ px
[GOAL]
case hp.hr
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
P : CliffordAlgebra Q → Prop
hr : ∀ (r : R), P (↑(algebraMap R (CliffordAlgebra Q)) r)
h_add : ∀ (x y : CliffordAlgebra Q), P x → P y → P (x + y)
h_ι_mul : ∀ (m : M) (x : CliffordAlgebra Q), P x → P (x * ↑(ι Q) m)
x✝ : CliffordAlgebra Q
i : ℕ
x : CliffordAlgebra Q
r : R
⊢ P (↑(algebraMap R (CliffordAlgebra Q)) r)
[PROOFSTEP]

| hr r => exact hr r
[GOAL]
case hp.hr
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
P : CliffordAlgebra Q → Prop
hr : ∀ (r : R), P (↑(algebraMap R (CliffordAlgebra Q)) r)
h_add : ∀ (x y : CliffordAlgebra Q), P x → P y → P (x + y)
h_ι_mul : ∀ (m : M) (x : CliffordAlgebra Q), P x → P (x * ↑(ι Q) m)
x✝ : CliffordAlgebra Q
i : ℕ
x : CliffordAlgebra Q
r : R
⊢ P (↑(algebraMap R (CliffordAlgebra Q)) r)
[PROOFSTEP]
exact hr r
[GOAL]
case hp.hadd
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
P : CliffordAlgebra Q → Prop
hr : ∀ (r : R), P (↑(algebraMap R (CliffordAlgebra Q)) r)
h_add : ∀ (x y : CliffordAlgebra Q), P x → P y → P (x + y)
h_ι_mul : ∀ (m : M) (x : CliffordAlgebra Q), P x → P (x * ↑(ι Q) m)
x✝ : CliffordAlgebra Q
i : ℕ
x _x _y : CliffordAlgebra Q
_i : ℕ
hx✝ : _x ∈ LinearMap.range (ι Q) ^ _i
hy✝ : _y ∈ LinearMap.range (ι Q) ^ _i
ihx : P _x
ihy : P _y
⊢ P (_x + _y)
[PROOFSTEP]

| hadd _x _y _i _ _ ihx ihy => exact h_add _ _ ihx ihy
[GOAL]
case hp.hadd
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
P : CliffordAlgebra Q → Prop
hr : ∀ (r : R), P (↑(algebraMap R (CliffordAlgebra Q)) r)
h_add : ∀ (x y : CliffordAlgebra Q), P x → P y → P (x + y)
h_ι_mul : ∀ (m : M) (x : CliffordAlgebra Q), P x → P (x * ↑(ι Q) m)
x✝ : CliffordAlgebra Q
i : ℕ
x _x _y : CliffordAlgebra Q
_i : ℕ
hx✝ : _x ∈ LinearMap.range (ι Q) ^ _i
hy✝ : _y ∈ LinearMap.range (ι Q) ^ _i
ihx : P _x
ihy : P _y
⊢ P (_x + _y)
[PROOFSTEP]
exact h_add _ _ ihx ihy
[GOAL]
case hp.hmul
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
P : CliffordAlgebra Q → Prop
hr : ∀ (r : R), P (↑(algebraMap R (CliffordAlgebra Q)) r)
h_add : ∀ (x y : CliffordAlgebra Q), P x → P y → P (x + y)
h_ι_mul : ∀ (m : M) (x : CliffordAlgebra Q), P x → P (x * ↑(ι Q) m)
x✝¹ : CliffordAlgebra Q
i : ℕ
x✝ : CliffordAlgebra Q
_i : ℕ
x : CliffordAlgebra Q
_hx : x ∈ LinearMap.range (ι Q) ^ _i
px : P x
m : CliffordAlgebra Q
hm : m ∈ LinearMap.range (ι Q)
⊢ P (x * m)
[PROOFSTEP]

| hmul _i x _hx px m hm =>
  obtain ⟨m, rfl⟩ := hm
  exact h_ι_mul _ _ px
[GOAL]
case hp.hmul
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
P : CliffordAlgebra Q → Prop
hr : ∀ (r : R), P (↑(algebraMap R (CliffordAlgebra Q)) r)
h_add : ∀ (x y : CliffordAlgebra Q), P x → P y → P (x + y)
h_ι_mul : ∀ (m : M) (x : CliffordAlgebra Q), P x → P (x * ↑(ι Q) m)
x✝¹ : CliffordAlgebra Q
i : ℕ
x✝ : CliffordAlgebra Q
_i : ℕ
x : CliffordAlgebra Q
_hx : x ∈ LinearMap.range (ι Q) ^ _i
px : P x
m : CliffordAlgebra Q
hm : m ∈ LinearMap.range (ι Q)
⊢ P (x * m)
[PROOFSTEP]
obtain ⟨m, rfl⟩ := hm
[GOAL]
case hp.hmul.intro
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
P : CliffordAlgebra Q → Prop
hr : ∀ (r : R), P (↑(algebraMap R (CliffordAlgebra Q)) r)
h_add : ∀ (x y : CliffordAlgebra Q), P x → P y → P (x + y)
h_ι_mul : ∀ (m : M) (x : CliffordAlgebra Q), P x → P (x * ↑(ι Q) m)
x✝¹ : CliffordAlgebra Q
i : ℕ
x✝ : CliffordAlgebra Q
_i : ℕ
x : CliffordAlgebra Q
_hx : x ∈ LinearMap.range (ι Q) ^ _i
px : P x
m : M
⊢ P (x * ↑(ι Q) m)
[PROOFSTEP]
exact h_ι_mul _ _ px
[GOAL]
case h0
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
P : CliffordAlgebra Q → Prop
hr : ∀ (r : R), P (↑(algebraMap R (CliffordAlgebra Q)) r)
h_add : ∀ (x y : CliffordAlgebra Q), P x → P y → P (x + y)
h_ι_mul : ∀ (m : M) (x : CliffordAlgebra Q), P x → P (x * ↑(ι Q) m)
x : CliffordAlgebra Q
⊢ P 0
[PROOFSTEP]

| h0 => simpa only [map_zero] using hr 0
[GOAL]
case h0
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
P : CliffordAlgebra Q → Prop
hr : ∀ (r : R), P (↑(algebraMap R (CliffordAlgebra Q)) r)
h_add : ∀ (x y : CliffordAlgebra Q), P x → P y → P (x + y)
h_ι_mul : ∀ (m : M) (x : CliffordAlgebra Q), P x → P (x * ↑(ι Q) m)
x : CliffordAlgebra Q
⊢ P 0
[PROOFSTEP]
simpa only [map_zero] using hr 0
[GOAL]
case hadd
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
P : CliffordAlgebra Q → Prop
hr : ∀ (r : R), P (↑(algebraMap R (CliffordAlgebra Q)) r)
h_add : ∀ (x y : CliffordAlgebra Q), P x → P y → P (x + y)
h_ι_mul : ∀ (m : M) (x : CliffordAlgebra Q), P x → P (x * ↑(ι Q) m)
x _x _y : CliffordAlgebra Q
hx✝ : _x ∈ ⨆ (i : ℕ), LinearMap.range (ι Q) ^ i
hy✝ : _y ∈ ⨆ (i : ℕ), LinearMap.range (ι Q) ^ i
ihx : P _x
ihy : P _y
⊢ P (_x + _y)
[PROOFSTEP]

| hadd _x _y _ _ ihx ihy => exact h_add _ _ ihx ihy
[GOAL]
case hadd
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
P : CliffordAlgebra Q → Prop
hr : ∀ (r : R), P (↑(algebraMap R (CliffordAlgebra Q)) r)
h_add : ∀ (x y : CliffordAlgebra Q), P x → P y → P (x + y)
h_ι_mul : ∀ (m : M) (x : CliffordAlgebra Q), P x → P (x * ↑(ι Q) m)
x _x _y : CliffordAlgebra Q
hx✝ : _x ∈ ⨆ (i : ℕ), LinearMap.range (ι Q) ^ i
hy✝ : _y ∈ ⨆ (i : ℕ), LinearMap.range (ι Q) ^ i
ihx : P _x
ihy : P _y
⊢ P (_x + _y)
[PROOFSTEP]
exact h_add _ _ ihx ihy
[GOAL]
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
P : CliffordAlgebra Q → Prop
hr : ∀ (r : R), P (↑(algebraMap R (CliffordAlgebra Q)) r)
h_add : ∀ (x y : CliffordAlgebra Q), P x → P y → P (x + y)
h_mul_ι : ∀ (x : CliffordAlgebra Q) (m : M), P x → P (↑(ι Q) m * x)
⊢ ∀ (x : CliffordAlgebra Q), P x
[PROOFSTEP]
refine' reverse_involutive.surjective.forall.2 _
[GOAL]
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
P : CliffordAlgebra Q → Prop
hr : ∀ (r : R), P (↑(algebraMap R (CliffordAlgebra Q)) r)
h_add : ∀ (x y : CliffordAlgebra Q), P x → P y → P (x + y)
h_mul_ι : ∀ (x : CliffordAlgebra Q) (m : M), P x → P (↑(ι Q) m * x)
⊢ ∀ (x : CliffordAlgebra Q), P (↑reverse x)
[PROOFSTEP]
intro x
[GOAL]
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
P : CliffordAlgebra Q → Prop
hr : ∀ (r : R), P (↑(algebraMap R (CliffordAlgebra Q)) r)
h_add : ∀ (x y : CliffordAlgebra Q), P x → P y → P (x + y)
h_mul_ι : ∀ (x : CliffordAlgebra Q) (m : M), P x → P (↑(ι Q) m * x)
x : CliffordAlgebra Q
⊢ P (↑reverse x)
[PROOFSTEP]
induction' x using CliffordAlgebra.right_induction with r x y hx hy m x hx
[GOAL]
case hr
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
P : CliffordAlgebra Q → Prop
hr : ∀ (r : R), P (↑(algebraMap R (CliffordAlgebra Q)) r)
h_add : ∀ (x y : CliffordAlgebra Q), P x → P y → P (x + y)
h_mul_ι : ∀ (x : CliffordAlgebra Q) (m : M), P x → P (↑(ι Q) m * x)
r : R
⊢ P (↑reverse (↑(algebraMap R (CliffordAlgebra Q)) r))
[PROOFSTEP]
simpa only [reverse.commutes] using hr r
[GOAL]
case h_add
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
P : CliffordAlgebra Q → Prop
hr : ∀ (r : R), P (↑(algebraMap R (CliffordAlgebra Q)) r)
h_add : ∀ (x y : CliffordAlgebra Q), P x → P y → P (x + y)
h_mul_ι : ∀ (x : CliffordAlgebra Q) (m : M), P x → P (↑(ι Q) m * x)
x y : CliffordAlgebra Q
hx : P (↑reverse x)
hy : P (↑reverse y)
⊢ P (↑reverse (x + y))
[PROOFSTEP]
simpa only [map_add] using h_add _ _ hx hy
[GOAL]
case h_ι_mul
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
P : CliffordAlgebra Q → Prop
hr : ∀ (r : R), P (↑(algebraMap R (CliffordAlgebra Q)) r)
h_add : ∀ (x y : CliffordAlgebra Q), P x → P y → P (x + y)
h_mul_ι : ∀ (x : CliffordAlgebra Q) (m : M), P x → P (↑(ι Q) m * x)
m : M
x : CliffordAlgebra Q
hx : P (↑reverse x)
⊢ P (↑reverse (x * ↑(ι Q) m))
[PROOFSTEP]
simpa only [reverse.map_mul, reverse_ι] using h_mul_ι _ _ hx
[GOAL]
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
f : M →ₗ[R] CliffordAlgebra Q × N →ₗ[R] N
⊢ M →ₗ[R] Module.End R (CliffordAlgebra Q × N)
[PROOFSTEP]
have v_mul := (Algebra.lmul R (CliffordAlgebra Q)).toLinearMap ∘ₗ ι Q
[GOAL]
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
f : M →ₗ[R] CliffordAlgebra Q × N →ₗ[R] N
v_mul : M →ₗ[R] Module.End R (CliffordAlgebra Q)
⊢ M →ₗ[R] Module.End R (CliffordAlgebra Q × N)
[PROOFSTEP]
have l := v_mul.compl₂ (LinearMap.fst _ _ N)
[GOAL]
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
f : M →ₗ[R] CliffordAlgebra Q × N →ₗ[R] N
v_mul : M →ₗ[R] Module.End R (CliffordAlgebra Q)
l : M →ₗ[R] CliffordAlgebra Q × N →ₗ[R] CliffordAlgebra Q
⊢ M →ₗ[R] Module.End R (CliffordAlgebra Q × N)
[PROOFSTEP]
exact
  { toFun := fun m => (l m).prod (f m)
    map_add' := fun v₂ v₂ =>
      LinearMap.ext fun x => Prod.ext (LinearMap.congr_fun (l.map_add _ _) x) (LinearMap.congr_fun (f.map_add _ _) x)
    map_smul' := fun c v =>
      LinearMap.ext fun x =>
        Prod.ext (LinearMap.congr_fun (l.map_smul _ _) x) (LinearMap.congr_fun (f.map_smul _ _) x) }
[GOAL]
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
f : M →ₗ[R] CliffordAlgebra Q × N →ₗ[R] N
hf : ∀ (m : M) (x : CliffordAlgebra Q) (fx : N), ↑(↑f m) (↑(ι Q) m * x, ↑(↑f m) (x, fx)) = ↑Q m • fx
v : M
x_fx : CliffordAlgebra Q × N
⊢ ↑(↑(foldr'Aux Q f) v) (↑(↑(foldr'Aux Q f) v) x_fx) = ↑Q v • x_fx
[PROOFSTEP]
cases' x_fx with x fx
[GOAL]
case mk
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
f : M →ₗ[R] CliffordAlgebra Q × N →ₗ[R] N
hf : ∀ (m : M) (x : CliffordAlgebra Q) (fx : N), ↑(↑f m) (↑(ι Q) m * x, ↑(↑f m) (x, fx)) = ↑Q m • fx
v : M
x : CliffordAlgebra Q
fx : N
⊢ ↑(↑(foldr'Aux Q f) v) (↑(↑(foldr'Aux Q f) v) (x, fx)) = ↑Q v • (x, fx)
[PROOFSTEP]
simp only [foldr'Aux_apply_apply]
[GOAL]
case mk
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
f : M →ₗ[R] CliffordAlgebra Q × N →ₗ[R] N
hf : ∀ (m : M) (x : CliffordAlgebra Q) (fx : N), ↑(↑f m) (↑(ι Q) m * x, ↑(↑f m) (x, fx)) = ↑Q m • fx
v : M
x : CliffordAlgebra Q
fx : N
⊢ (↑(ι Q) v * (↑(ι Q) v * x), ↑(↑f v) (↑(ι Q) v * x, ↑(↑f v) (x, fx))) = ↑Q v • (x, fx)
[PROOFSTEP]
rw [← mul_assoc, ι_sq_scalar, ← Algebra.smul_def, hf, Prod.smul_mk]
[GOAL]
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
f : M →ₗ[R] CliffordAlgebra Q × N →ₗ[R] N
hf : ∀ (m : M) (x : CliffordAlgebra Q) (fx : N), ↑(↑f m) (↑(ι Q) m * x, ↑(↑f m) (x, fx)) = ↑Q m • fx
n : N
m : M
x : CliffordAlgebra Q
⊢ ↑(foldr' Q f hf n) (↑(ι Q) m * x) = ↑(↑f m) (x, ↑(foldr' Q f hf n) x)
[PROOFSTEP]
dsimp [foldr']
[GOAL]
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
f : M →ₗ[R] CliffordAlgebra Q × N →ₗ[R] N
hf : ∀ (m : M) (x : CliffordAlgebra Q) (fx : N), ↑(↑f m) (↑(ι Q) m * x, ↑(↑f m) (x, fx)) = ↑Q m • fx
n : N
m : M
x : CliffordAlgebra Q
⊢ (↑(↑(foldr Q (foldr'Aux Q f)
                (_ :
                  ∀ (v : M) (x_fx : CliffordAlgebra Q × N),
                    ↑(↑(foldr'Aux Q f) v) (↑(↑(foldr'Aux Q f) v) x_fx) = ↑Q v • x_fx))
            (1, n))
        (↑(ι Q) m * x)).snd =
    ↑(↑f m)
      (x,
        (↑(↑(foldr Q (foldr'Aux Q f)
                    (_ :
                      ∀ (v : M) (x_fx : CliffordAlgebra Q × N),
                        ↑(↑(foldr'Aux Q f) v) (↑(↑(foldr'Aux Q f) v) x_fx) = ↑Q v • x_fx))
                (1, n))
            x).snd)
[PROOFSTEP]
rw [foldr_mul, foldr_ι, foldr'Aux_apply_apply]
[GOAL]
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
f : M →ₗ[R] CliffordAlgebra Q × N →ₗ[R] N
hf : ∀ (m : M) (x : CliffordAlgebra Q) (fx : N), ↑(↑f m) (↑(ι Q) m * x, ↑(↑f m) (x, fx)) = ↑Q m • fx
n : N
m : M
x : CliffordAlgebra Q
⊢ (↑(ι Q) m *
          (↑(↑(foldr Q (foldr'Aux Q f)
                      (_ :
                        ∀ (v : M) (x_fx : CliffordAlgebra Q × N),
                          ↑(↑(foldr'Aux Q f) v) (↑(↑(foldr'Aux Q f) v) x_fx) = ↑Q v • x_fx))
                  (1, n))
              x).fst,
        ↑(↑f m)
          (↑(↑(foldr Q (foldr'Aux Q f)
                    (_ :
                      ∀ (v : M) (x_fx : CliffordAlgebra Q × N),
                        ↑(↑(foldr'Aux Q f) v) (↑(↑(foldr'Aux Q f) v) x_fx) = ↑Q v • x_fx))
                (1, n))
            x)).snd =
    ↑(↑f m)
      (x,
        (↑(↑(foldr Q (foldr'Aux Q f)
                    (_ :
                      ∀ (v : M) (x_fx : CliffordAlgebra Q × N),
                        ↑(↑(foldr'Aux Q f) v) (↑(↑(foldr'Aux Q f) v) x_fx) = ↑Q v • x_fx))
                (1, n))
            x).snd)
[PROOFSTEP]
refine' congr_arg (f m) (Prod.mk.eta.symm.trans _)
[GOAL]
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
f : M →ₗ[R] CliffordAlgebra Q × N →ₗ[R] N
hf : ∀ (m : M) (x : CliffordAlgebra Q) (fx : N), ↑(↑f m) (↑(ι Q) m * x, ↑(↑f m) (x, fx)) = ↑Q m • fx
n : N
m : M
x : CliffordAlgebra Q
⊢ ((↑(↑(foldr Q (foldr'Aux Q f)
                  (_ :
                    ∀ (v : M) (x_fx : CliffordAlgebra Q × N),
                      ↑(↑(foldr'Aux Q f) v) (↑(↑(foldr'Aux Q f) v) x_fx) = ↑Q v • x_fx))
              (1, n))
          x).fst,
      (↑(↑(foldr Q (foldr'Aux Q f)
                  (_ :
                    ∀ (v : M) (x_fx : CliffordAlgebra Q × N),
                      ↑(↑(foldr'Aux Q f) v) (↑(↑(foldr'Aux Q f) v) x_fx) = ↑Q v • x_fx))
              (1, n))
          x).snd) =
    (x,
      (↑(↑(foldr Q (foldr'Aux Q f)
                  (_ :
                    ∀ (v : M) (x_fx : CliffordAlgebra Q × N),
                      ↑(↑(foldr'Aux Q f) v) (↑(↑(foldr'Aux Q f) v) x_fx) = ↑Q v • x_fx))
              (1, n))
          x).snd)
[PROOFSTEP]
congr 1
[GOAL]
case e_fst
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
f : M →ₗ[R] CliffordAlgebra Q × N →ₗ[R] N
hf : ∀ (m : M) (x : CliffordAlgebra Q) (fx : N), ↑(↑f m) (↑(ι Q) m * x, ↑(↑f m) (x, fx)) = ↑Q m • fx
n : N
m : M
x : CliffordAlgebra Q
⊢ (↑(↑(foldr Q (foldr'Aux Q f)
                (_ :
                  ∀ (v : M) (x_fx : CliffordAlgebra Q × N),
                    ↑(↑(foldr'Aux Q f) v) (↑(↑(foldr'Aux Q f) v) x_fx) = ↑Q v • x_fx))
            (1, n))
        x).fst =
    x
[PROOFSTEP]
induction' x using CliffordAlgebra.left_induction with r x y hx hy m x hx
[GOAL]
case e_fst.hr
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
f : M →ₗ[R] CliffordAlgebra Q × N →ₗ[R] N
hf : ∀ (m : M) (x : CliffordAlgebra Q) (fx : N), ↑(↑f m) (↑(ι Q) m * x, ↑(↑f m) (x, fx)) = ↑Q m • fx
n : N
m : M
r : R
⊢ (↑(↑(foldr Q (foldr'Aux Q f)
                (_ :
                  ∀ (v : M) (x_fx : CliffordAlgebra Q × N),
                    ↑(↑(foldr'Aux Q f) v) (↑(↑(foldr'Aux Q f) v) x_fx) = ↑Q v • x_fx))
            (1, n))
        (↑(algebraMap R (CliffordAlgebra Q)) r)).fst =
    ↑(algebraMap R (CliffordAlgebra Q)) r
[PROOFSTEP]
simp_rw [foldr_algebraMap, Prod.smul_mk, Algebra.algebraMap_eq_smul_one]
[GOAL]
case e_fst.h_add
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
f : M →ₗ[R] CliffordAlgebra Q × N →ₗ[R] N
hf : ∀ (m : M) (x : CliffordAlgebra Q) (fx : N), ↑(↑f m) (↑(ι Q) m * x, ↑(↑f m) (x, fx)) = ↑Q m • fx
n : N
m : M
x y : CliffordAlgebra Q
hx :
  (↑(↑(foldr Q (foldr'Aux Q f)
                (_ :
                  ∀ (v : M) (x_fx : CliffordAlgebra Q × N),
                    ↑(↑(foldr'Aux Q f) v) (↑(↑(foldr'Aux Q f) v) x_fx) = ↑Q v • x_fx))
            (1, n))
        x).fst =
    x
hy :
  (↑(↑(foldr Q (foldr'Aux Q f)
                (_ :
                  ∀ (v : M) (x_fx : CliffordAlgebra Q × N),
                    ↑(↑(foldr'Aux Q f) v) (↑(↑(foldr'Aux Q f) v) x_fx) = ↑Q v • x_fx))
            (1, n))
        y).fst =
    y
⊢ (↑(↑(foldr Q (foldr'Aux Q f)
                (_ :
                  ∀ (v : M) (x_fx : CliffordAlgebra Q × N),
                    ↑(↑(foldr'Aux Q f) v) (↑(↑(foldr'Aux Q f) v) x_fx) = ↑Q v • x_fx))
            (1, n))
        (x + y)).fst =
    x + y
[PROOFSTEP]
rw [map_add, Prod.fst_add, hx, hy]
[GOAL]
case e_fst.h_mul_ι
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M
inst✝² : AddCommGroup N
inst✝¹ : Module R M
inst✝ : Module R N
Q : QuadraticForm R M
f : M →ₗ[R] CliffordAlgebra Q × N →ₗ[R] N
hf : ∀ (m : M) (x : CliffordAlgebra Q) (fx : N), ↑(↑f m) (↑(ι Q) m * x, ↑(↑f m) (x, fx)) = ↑Q m • fx
n : N
m✝ : M
m : CliffordAlgebra Q
x : M
hx :
  (↑(↑(foldr Q (foldr'Aux Q f)
                (_ :
                  ∀ (v : M) (x_fx : CliffordAlgebra Q × N),
                    ↑(↑(foldr'Aux Q f) v) (↑(↑(foldr'Aux Q f) v) x_fx) = ↑Q v • x_fx))
            (1, n))
        m).fst =
    m
⊢ (↑(↑(foldr Q (foldr'Aux Q f)
                (_ :
                  ∀ (v : M) (x_fx : CliffordAlgebra Q × N),
                    ↑(↑(foldr'Aux Q f) v) (↑(↑(foldr'Aux Q f) v) x_fx) = ↑Q v • x_fx))
            (1, n))
        (↑(ι Q) x * m)).fst =
    ↑(ι Q) x * m
[PROOFSTEP]
rw [foldr_mul, foldr_ι, foldr'Aux_apply_apply, hx]
