[GOAL]
C : Type u_1
inst✝ : Category.{?u.598, u_1} C
A B B' X Y Y' : C
i : A ⟶ B
i' : B ⟶ B'
p : X ⟶ Y
p' : Y ⟶ Y'
f : A ⟶ X
g : B ⟶ Y
sq : CommSq f i p g
hip : HasLiftingProperty i p
⊢ CommSq.HasLift sq
[PROOFSTEP]
apply hip.sq_hasLift
[GOAL]
C : Type u_1
inst✝ : Category.{u_2, u_1} C
A B B' X Y Y' : C
i : A ⟶ B
i' : B ⟶ B'
p : X ⟶ Y
p' : Y ⟶ Y'
h : HasLiftingProperty i p
f : Opposite.op Y ⟶ Opposite.op B
g : Opposite.op X ⟶ Opposite.op A
sq : CommSq f p.op i.op g
⊢ CommSq.HasLift sq
[PROOFSTEP]
simp only [CommSq.HasLift.iff_unop, Quiver.Hom.unop_op]
[GOAL]
C : Type u_1
inst✝ : Category.{u_2, u_1} C
A B B' X Y Y' : C
i : A ⟶ B
i' : B ⟶ B'
p : X ⟶ Y
p' : Y ⟶ Y'
h : HasLiftingProperty i p
f : Opposite.op Y ⟶ Opposite.op B
g : Opposite.op X ⟶ Opposite.op A
sq : CommSq f p.op i.op g
⊢ CommSq.HasLift (_ : CommSq g.unop i p f.unop)
[PROOFSTEP]
infer_instance
[GOAL]
C : Type u_1
inst✝ : Category.{u_2, u_1} C
A✝ B✝ B' X✝ Y✝ Y' : C
i✝ : A✝ ⟶ B✝
i' : B✝ ⟶ B'
p✝ : X✝ ⟶ Y✝
p' : Y✝ ⟶ Y'
A B X Y : Cᵒᵖ
i : A ⟶ B
p : X ⟶ Y
h : HasLiftingProperty i p
f : Y.unop ⟶ B.unop
g : X.unop ⟶ A.unop
sq : CommSq f p.unop i.unop g
⊢ CommSq.HasLift sq
[PROOFSTEP]
rw [CommSq.HasLift.iff_op]
[GOAL]
C : Type u_1
inst✝ : Category.{u_2, u_1} C
A✝ B✝ B' X✝ Y✝ Y' : C
i✝ : A✝ ⟶ B✝
i' : B✝ ⟶ B'
p✝ : X✝ ⟶ Y✝
p' : Y✝ ⟶ Y'
A B X Y : Cᵒᵖ
i : A ⟶ B
p : X ⟶ Y
h : HasLiftingProperty i p
f : Y.unop ⟶ B.unop
g : X.unop ⟶ A.unop
sq : CommSq f p.unop i.unop g
⊢ CommSq.HasLift (_ : CommSq g.op i.unop.op p.unop.op f.op)
[PROOFSTEP]
simp only [Quiver.Hom.op_unop]
[GOAL]
C : Type u_1
inst✝ : Category.{u_2, u_1} C
A✝ B✝ B' X✝ Y✝ Y' : C
i✝ : A✝ ⟶ B✝
i' : B✝ ⟶ B'
p✝ : X✝ ⟶ Y✝
p' : Y✝ ⟶ Y'
A B X Y : Cᵒᵖ
i : A ⟶ B
p : X ⟶ Y
h : HasLiftingProperty i p
f : Y.unop ⟶ B.unop
g : X.unop ⟶ A.unop
sq : CommSq f p.unop i.unop g
⊢ CommSq.HasLift (_ : CommSq g.op i p f.op)
[PROOFSTEP]
infer_instance
[GOAL]
C : Type u_1
inst✝¹ : Category.{?u.3772, u_1} C
A B B' X Y Y' : C
i : A ⟶ B
i' : B ⟶ B'
p : X ⟶ Y
p' : Y ⟶ Y'
inst✝ : IsIso i
f : A ⟶ X
g : B ⟶ Y
sq : CommSq f i p g
⊢ i ≫ inv i ≫ f = f
[PROOFSTEP]
simp only [IsIso.hom_inv_id_assoc]
[GOAL]
C : Type u_1
inst✝¹ : Category.{?u.3772, u_1} C
A B B' X Y Y' : C
i : A ⟶ B
i' : B ⟶ B'
p : X ⟶ Y
p' : Y ⟶ Y'
inst✝ : IsIso i
f : A ⟶ X
g : B ⟶ Y
sq : CommSq f i p g
⊢ (inv i ≫ f) ≫ p = g
[PROOFSTEP]
simp only [sq.w, assoc, IsIso.inv_hom_id_assoc]
[GOAL]
C : Type u_1
inst✝¹ : Category.{?u.4638, u_1} C
A B B' X Y Y' : C
i : A ⟶ B
i' : B ⟶ B'
p : X ⟶ Y
p' : Y ⟶ Y'
inst✝ : IsIso p
f : A ⟶ X
g : B ⟶ Y
sq : CommSq f i p g
⊢ i ≫ g ≫ inv p = f
[PROOFSTEP]
simp only [← sq.w_assoc, IsIso.hom_inv_id, comp_id]
[GOAL]
C : Type u_1
inst✝¹ : Category.{?u.4638, u_1} C
A B B' X Y Y' : C
i : A ⟶ B
i' : B ⟶ B'
p : X ⟶ Y
p' : Y ⟶ Y'
inst✝ : IsIso p
f : A ⟶ X
g : B ⟶ Y
sq : CommSq f i p g
⊢ (g ≫ inv p) ≫ p = g
[PROOFSTEP]
simp only [assoc, IsIso.inv_hom_id, comp_id]
[GOAL]
C : Type u_1
inst✝² : Category.{?u.5681, u_1} C
A B B' X Y Y' : C
i : A ⟶ B
i' : B ⟶ B'
p : X ⟶ Y
p' : Y ⟶ Y'
inst✝¹ : HasLiftingProperty i p
inst✝ : HasLiftingProperty i' p
f : A ⟶ X
g : B' ⟶ Y
sq : CommSq f (i ≫ i') p g
⊢ CommSq.HasLift sq
[PROOFSTEP]
have fac := sq.w
[GOAL]
C : Type u_1
inst✝² : Category.{?u.5681, u_1} C
A B B' X Y Y' : C
i : A ⟶ B
i' : B ⟶ B'
p : X ⟶ Y
p' : Y ⟶ Y'
inst✝¹ : HasLiftingProperty i p
inst✝ : HasLiftingProperty i' p
f : A ⟶ X
g : B' ⟶ Y
sq : CommSq f (i ≫ i') p g
fac : f ≫ p = (i ≫ i') ≫ g
⊢ CommSq.HasLift sq
[PROOFSTEP]
rw [assoc] at fac
[GOAL]
C : Type u_1
inst✝² : Category.{?u.5681, u_1} C
A B B' X Y Y' : C
i : A ⟶ B
i' : B ⟶ B'
p : X ⟶ Y
p' : Y ⟶ Y'
inst✝¹ : HasLiftingProperty i p
inst✝ : HasLiftingProperty i' p
f : A ⟶ X
g : B' ⟶ Y
sq : CommSq f (i ≫ i') p g
fac : f ≫ p = i ≫ i' ≫ g
⊢ CommSq.HasLift sq
[PROOFSTEP]
exact
  CommSq.HasLift.mk'
    { l := (CommSq.mk (CommSq.mk fac).fac_right).lift
      fac_left := by simp only [assoc, CommSq.fac_left]
      fac_right := by simp only [CommSq.fac_right] }
[GOAL]
C : Type u_1
inst✝² : Category.{?u.5681, u_1} C
A B B' X Y Y' : C
i : A ⟶ B
i' : B ⟶ B'
p : X ⟶ Y
p' : Y ⟶ Y'
inst✝¹ : HasLiftingProperty i p
inst✝ : HasLiftingProperty i' p
f : A ⟶ X
g : B' ⟶ Y
sq : CommSq f (i ≫ i') p g
fac : f ≫ p = i ≫ i' ≫ g
⊢ (i ≫ i') ≫ CommSq.lift (_ : CommSq (CommSq.lift (_ : CommSq f i p (i' ≫ g))) i' p g) = f
[PROOFSTEP]
simp only [assoc, CommSq.fac_left]
[GOAL]
C : Type u_1
inst✝² : Category.{?u.5681, u_1} C
A B B' X Y Y' : C
i : A ⟶ B
i' : B ⟶ B'
p : X ⟶ Y
p' : Y ⟶ Y'
inst✝¹ : HasLiftingProperty i p
inst✝ : HasLiftingProperty i' p
f : A ⟶ X
g : B' ⟶ Y
sq : CommSq f (i ≫ i') p g
fac : f ≫ p = i ≫ i' ≫ g
⊢ CommSq.lift (_ : CommSq (CommSq.lift (_ : CommSq f i p (i' ≫ g))) i' p g) ≫ p = g
[PROOFSTEP]
simp only [CommSq.fac_right]
[GOAL]
C : Type u_1
inst✝² : Category.{?u.7264, u_1} C
A B B' X Y Y' : C
i : A ⟶ B
i' : B ⟶ B'
p : X ⟶ Y
p' : Y ⟶ Y'
inst✝¹ : HasLiftingProperty i p
inst✝ : HasLiftingProperty i p'
f : A ⟶ X
g : B ⟶ Y'
sq : CommSq f i (p ≫ p') g
⊢ CommSq.HasLift sq
[PROOFSTEP]
have fac := sq.w
[GOAL]
C : Type u_1
inst✝² : Category.{?u.7264, u_1} C
A B B' X Y Y' : C
i : A ⟶ B
i' : B ⟶ B'
p : X ⟶ Y
p' : Y ⟶ Y'
inst✝¹ : HasLiftingProperty i p
inst✝ : HasLiftingProperty i p'
f : A ⟶ X
g : B ⟶ Y'
sq : CommSq f i (p ≫ p') g
fac : f ≫ p ≫ p' = i ≫ g
⊢ CommSq.HasLift sq
[PROOFSTEP]
rw [← assoc] at fac
[GOAL]
C : Type u_1
inst✝² : Category.{?u.7264, u_1} C
A B B' X Y Y' : C
i : A ⟶ B
i' : B ⟶ B'
p : X ⟶ Y
p' : Y ⟶ Y'
inst✝¹ : HasLiftingProperty i p
inst✝ : HasLiftingProperty i p'
f : A ⟶ X
g : B ⟶ Y'
sq : CommSq f i (p ≫ p') g
fac : (f ≫ p) ≫ p' = i ≫ g
⊢ CommSq.HasLift sq
[PROOFSTEP]
let _ := (CommSq.mk (CommSq.mk fac).fac_left.symm).lift
[GOAL]
C : Type u_1
inst✝² : Category.{?u.7264, u_1} C
A B B' X Y Y' : C
i : A ⟶ B
i' : B ⟶ B'
p : X ⟶ Y
p' : Y ⟶ Y'
inst✝¹ : HasLiftingProperty i p
inst✝ : HasLiftingProperty i p'
f : A ⟶ X
g : B ⟶ Y'
sq : CommSq f i (p ≫ p') g
fac : (f ≫ p) ≫ p' = i ≫ g
x✝ : B ⟶ X := CommSq.lift (_ : CommSq f i p (CommSq.lift (_ : CommSq (f ≫ p) i p' g)))
⊢ CommSq.HasLift sq
[PROOFSTEP]
exact
  CommSq.HasLift.mk'
    { l := (CommSq.mk (CommSq.mk fac).fac_left.symm).lift
      fac_left := by simp only [CommSq.fac_left]
      fac_right := by simp only [CommSq.fac_right_assoc, CommSq.fac_right] }
[GOAL]
C : Type u_1
inst✝² : Category.{?u.7264, u_1} C
A B B' X Y Y' : C
i : A ⟶ B
i' : B ⟶ B'
p : X ⟶ Y
p' : Y ⟶ Y'
inst✝¹ : HasLiftingProperty i p
inst✝ : HasLiftingProperty i p'
f : A ⟶ X
g : B ⟶ Y'
sq : CommSq f i (p ≫ p') g
fac : (f ≫ p) ≫ p' = i ≫ g
x✝ : B ⟶ X := CommSq.lift (_ : CommSq f i p (CommSq.lift (_ : CommSq (f ≫ p) i p' g)))
⊢ i ≫ CommSq.lift (_ : CommSq f i p (CommSq.lift (_ : CommSq (f ≫ p) i p' g))) = f
[PROOFSTEP]
simp only [CommSq.fac_left]
[GOAL]
C : Type u_1
inst✝² : Category.{?u.7264, u_1} C
A B B' X Y Y' : C
i : A ⟶ B
i' : B ⟶ B'
p : X ⟶ Y
p' : Y ⟶ Y'
inst✝¹ : HasLiftingProperty i p
inst✝ : HasLiftingProperty i p'
f : A ⟶ X
g : B ⟶ Y'
sq : CommSq f i (p ≫ p') g
fac : (f ≫ p) ≫ p' = i ≫ g
x✝ : B ⟶ X := CommSq.lift (_ : CommSq f i p (CommSq.lift (_ : CommSq (f ≫ p) i p' g)))
⊢ CommSq.lift (_ : CommSq f i p (CommSq.lift (_ : CommSq (f ≫ p) i p' g))) ≫ p ≫ p' = g
[PROOFSTEP]
simp only [CommSq.fac_right_assoc, CommSq.fac_right]
[GOAL]
C : Type u_1
inst✝ : Category.{u_2, u_1} C
A✝ B✝ B'✝ X✝ Y✝ Y' : C
i✝ : A✝ ⟶ B✝
i'✝ : B✝ ⟶ B'✝
p✝ : X✝ ⟶ Y✝
p' : Y✝ ⟶ Y'
A B A' B' X Y : C
i : A ⟶ B
i' : A' ⟶ B'
e : Arrow.mk i ≅ Arrow.mk i'
p : X ⟶ Y
hip : HasLiftingProperty i p
⊢ HasLiftingProperty i' p
[PROOFSTEP]
rw [Arrow.iso_w' e]
[GOAL]
C : Type u_1
inst✝ : Category.{u_2, u_1} C
A✝ B✝ B'✝ X✝ Y✝ Y' : C
i✝ : A✝ ⟶ B✝
i'✝ : B✝ ⟶ B'✝
p✝ : X✝ ⟶ Y✝
p' : Y✝ ⟶ Y'
A B A' B' X Y : C
i : A ⟶ B
i' : A' ⟶ B'
e : Arrow.mk i ≅ Arrow.mk i'
p : X ⟶ Y
hip : HasLiftingProperty i p
⊢ HasLiftingProperty (e.inv.left ≫ i ≫ e.hom.right) p
[PROOFSTEP]
infer_instance
[GOAL]
C : Type u_1
inst✝ : Category.{u_2, u_1} C
A✝ B✝ B' X✝ Y✝ Y'✝ : C
i✝ : A✝ ⟶ B✝
i' : B✝ ⟶ B'
p✝ : X✝ ⟶ Y✝
p'✝ : Y✝ ⟶ Y'✝
A B X Y X' Y' : C
i : A ⟶ B
p : X ⟶ Y
p' : X' ⟶ Y'
e : Arrow.mk p ≅ Arrow.mk p'
hip : HasLiftingProperty i p
⊢ HasLiftingProperty i p'
[PROOFSTEP]
rw [Arrow.iso_w' e]
[GOAL]
C : Type u_1
inst✝ : Category.{u_2, u_1} C
A✝ B✝ B' X✝ Y✝ Y'✝ : C
i✝ : A✝ ⟶ B✝
i' : B✝ ⟶ B'
p✝ : X✝ ⟶ Y✝
p'✝ : Y✝ ⟶ Y'✝
A B X Y X' Y' : C
i : A ⟶ B
p : X ⟶ Y
p' : X' ⟶ Y'
e : Arrow.mk p ≅ Arrow.mk p'
hip : HasLiftingProperty i p
⊢ HasLiftingProperty i (e.inv.left ≫ p ≫ e.hom.right)
[PROOFSTEP]
infer_instance
[GOAL]
C : Type u_1
inst✝ : Category.{u_2, u_1} C
A✝ B✝ B'✝ X✝ Y✝ Y' : C
i✝ : A✝ ⟶ B✝
i'✝ : B✝ ⟶ B'✝
p✝ : X✝ ⟶ Y✝
p' : Y✝ ⟶ Y'
A B A' B' X Y : C
i : A ⟶ B
i' : A' ⟶ B'
e : Arrow.mk i ≅ Arrow.mk i'
p : X ⟶ Y
⊢ HasLiftingProperty i p ↔ HasLiftingProperty i' p
[PROOFSTEP]
constructor
[GOAL]
case mp
C : Type u_1
inst✝ : Category.{u_2, u_1} C
A✝ B✝ B'✝ X✝ Y✝ Y' : C
i✝ : A✝ ⟶ B✝
i'✝ : B✝ ⟶ B'✝
p✝ : X✝ ⟶ Y✝
p' : Y✝ ⟶ Y'
A B A' B' X Y : C
i : A ⟶ B
i' : A' ⟶ B'
e : Arrow.mk i ≅ Arrow.mk i'
p : X ⟶ Y
⊢ HasLiftingProperty i p → HasLiftingProperty i' p
[PROOFSTEP]
intro
[GOAL]
case mpr
C : Type u_1
inst✝ : Category.{u_2, u_1} C
A✝ B✝ B'✝ X✝ Y✝ Y' : C
i✝ : A✝ ⟶ B✝
i'✝ : B✝ ⟶ B'✝
p✝ : X✝ ⟶ Y✝
p' : Y✝ ⟶ Y'
A B A' B' X Y : C
i : A ⟶ B
i' : A' ⟶ B'
e : Arrow.mk i ≅ Arrow.mk i'
p : X ⟶ Y
⊢ HasLiftingProperty i' p → HasLiftingProperty i p
[PROOFSTEP]
intro
[GOAL]
case mp
C : Type u_1
inst✝ : Category.{u_2, u_1} C
A✝ B✝ B'✝ X✝ Y✝ Y' : C
i✝ : A✝ ⟶ B✝
i'✝ : B✝ ⟶ B'✝
p✝ : X✝ ⟶ Y✝
p' : Y✝ ⟶ Y'
A B A' B' X Y : C
i : A ⟶ B
i' : A' ⟶ B'
e : Arrow.mk i ≅ Arrow.mk i'
p : X ⟶ Y
a✝ : HasLiftingProperty i p
⊢ HasLiftingProperty i' p
case mpr
C : Type u_1
inst✝ : Category.{u_2, u_1} C
A✝ B✝ B'✝ X✝ Y✝ Y' : C
i✝ : A✝ ⟶ B✝
i'✝ : B✝ ⟶ B'✝
p✝ : X✝ ⟶ Y✝
p' : Y✝ ⟶ Y'
A B A' B' X Y : C
i : A ⟶ B
i' : A' ⟶ B'
e : Arrow.mk i ≅ Arrow.mk i'
p : X ⟶ Y
a✝ : HasLiftingProperty i' p
⊢ HasLiftingProperty i p
[PROOFSTEP]
exacts [of_arrow_iso_left e p, of_arrow_iso_left e.symm p]
[GOAL]
C : Type u_1
inst✝ : Category.{u_2, u_1} C
A✝ B✝ B' X✝ Y✝ Y'✝ : C
i✝ : A✝ ⟶ B✝
i' : B✝ ⟶ B'
p✝ : X✝ ⟶ Y✝
p'✝ : Y✝ ⟶ Y'✝
A B X Y X' Y' : C
i : A ⟶ B
p : X ⟶ Y
p' : X' ⟶ Y'
e : Arrow.mk p ≅ Arrow.mk p'
⊢ HasLiftingProperty i p ↔ HasLiftingProperty i p'
[PROOFSTEP]
constructor
[GOAL]
case mp
C : Type u_1
inst✝ : Category.{u_2, u_1} C
A✝ B✝ B' X✝ Y✝ Y'✝ : C
i✝ : A✝ ⟶ B✝
i' : B✝ ⟶ B'
p✝ : X✝ ⟶ Y✝
p'✝ : Y✝ ⟶ Y'✝
A B X Y X' Y' : C
i : A ⟶ B
p : X ⟶ Y
p' : X' ⟶ Y'
e : Arrow.mk p ≅ Arrow.mk p'
⊢ HasLiftingProperty i p → HasLiftingProperty i p'
[PROOFSTEP]
intro
[GOAL]
case mpr
C : Type u_1
inst✝ : Category.{u_2, u_1} C
A✝ B✝ B' X✝ Y✝ Y'✝ : C
i✝ : A✝ ⟶ B✝
i' : B✝ ⟶ B'
p✝ : X✝ ⟶ Y✝
p'✝ : Y✝ ⟶ Y'✝
A B X Y X' Y' : C
i : A ⟶ B
p : X ⟶ Y
p' : X' ⟶ Y'
e : Arrow.mk p ≅ Arrow.mk p'
⊢ HasLiftingProperty i p' → HasLiftingProperty i p
[PROOFSTEP]
intro
[GOAL]
case mp
C : Type u_1
inst✝ : Category.{u_2, u_1} C
A✝ B✝ B' X✝ Y✝ Y'✝ : C
i✝ : A✝ ⟶ B✝
i' : B✝ ⟶ B'
p✝ : X✝ ⟶ Y✝
p'✝ : Y✝ ⟶ Y'✝
A B X Y X' Y' : C
i : A ⟶ B
p : X ⟶ Y
p' : X' ⟶ Y'
e : Arrow.mk p ≅ Arrow.mk p'
a✝ : HasLiftingProperty i p
⊢ HasLiftingProperty i p'
case mpr
C : Type u_1
inst✝ : Category.{u_2, u_1} C
A✝ B✝ B' X✝ Y✝ Y'✝ : C
i✝ : A✝ ⟶ B✝
i' : B✝ ⟶ B'
p✝ : X✝ ⟶ Y✝
p'✝ : Y✝ ⟶ Y'✝
A B X Y X' Y' : C
i : A ⟶ B
p : X ⟶ Y
p' : X' ⟶ Y'
e : Arrow.mk p ≅ Arrow.mk p'
a✝ : HasLiftingProperty i p'
⊢ HasLiftingProperty i p
[PROOFSTEP]
exacts [of_arrow_iso_right i e, of_arrow_iso_right i e.symm]


[GOAL]
α : Type u_1
β : Type u_2
m : Type u_3
n : Type u_4
A✝ : Matrix n n α
inst✝¹ : Star α
inst✝ : Star β
A : Matrix n n α
⊢ (∀ (i j : n), star (A j i) = A i j) → IsHermitian A
[PROOFSTEP]
intro h
[GOAL]
α : Type u_1
β : Type u_2
m : Type u_3
n : Type u_4
A✝ : Matrix n n α
inst✝¹ : Star α
inst✝ : Star β
A : Matrix n n α
h : ∀ (i j : n), star (A j i) = A i j
⊢ IsHermitian A
[PROOFSTEP]
ext i j
[GOAL]
case a.h
α : Type u_1
β : Type u_2
m : Type u_3
n : Type u_4
A✝ : Matrix n n α
inst✝¹ : Star α
inst✝ : Star β
A : Matrix n n α
h : ∀ (i j : n), star (A j i) = A i j
i j : n
⊢ Aᴴ i j = A i j
[PROOFSTEP]
exact h i j
[GOAL]
α : Type u_1
β : Type u_2
m : Type u_3
n : Type u_4
A✝ : Matrix n n α
inst✝¹ : Star α
inst✝ : Star β
A : Matrix n n α
h : IsHermitian A
⊢ IsHermitian Aᵀ
[PROOFSTEP]
rw [IsHermitian, conjTranspose, transpose_map]
[GOAL]
α : Type u_1
β : Type u_2
m : Type u_3
n : Type u_4
A✝ : Matrix n n α
inst✝¹ : Star α
inst✝ : Star β
A : Matrix n n α
h : IsHermitian A
⊢ (Matrix.map Aᵀ star)ᵀ = Aᵀ
[PROOFSTEP]
exact congr_arg Matrix.transpose h
[GOAL]
α : Type u_1
β : Type u_2
m : Type u_3
n : Type u_4
A✝ : Matrix n n α
inst✝¹ : Star α
inst✝ : Star β
A : Matrix n n α
⊢ IsHermitian Aᵀ → IsHermitian A
[PROOFSTEP]
intro h
[GOAL]
α : Type u_1
β : Type u_2
m : Type u_3
n : Type u_4
A✝ : Matrix n n α
inst✝¹ : Star α
inst✝ : Star β
A : Matrix n n α
h : IsHermitian Aᵀ
⊢ IsHermitian A
[PROOFSTEP]
rw [← transpose_transpose A]
[GOAL]
α : Type u_1
β : Type u_2
m : Type u_3
n : Type u_4
A✝ : Matrix n n α
inst✝¹ : Star α
inst✝ : Star β
A : Matrix n n α
h : IsHermitian Aᵀ
⊢ IsHermitian Aᵀᵀ
[PROOFSTEP]
exact IsHermitian.transpose h
[GOAL]
α : Type u_1
β : Type u_2
m : Type u_3
n : Type u_4
A✝ : Matrix n n α
inst✝¹ : Star α
inst✝ : Star β
A : Matrix n n α
e : m ≃ n
h : IsHermitian (submatrix A ↑e ↑e)
⊢ IsHermitian A
[PROOFSTEP]
simpa using h.submatrix e.symm
[GOAL]
α : Type u_1
β : Type u_2
m : Type u_3
n : Type u_4
A✝ : Matrix n n α
inst✝ : InvolutiveStar α
A : Matrix m m α
B : Matrix m n α
C : Matrix n m α
D : Matrix n n α
hA : IsHermitian A
hBC : Bᴴ = C
hD : IsHermitian D
⊢ IsHermitian (Matrix.fromBlocks A B C D)
[PROOFSTEP]
have hCB : Cᴴ = B := by rw [← hBC, conjTranspose_conjTranspose]
[GOAL]
α : Type u_1
β : Type u_2
m : Type u_3
n : Type u_4
A✝ : Matrix n n α
inst✝ : InvolutiveStar α
A : Matrix m m α
B : Matrix m n α
C : Matrix n m α
D : Matrix n n α
hA : IsHermitian A
hBC : Bᴴ = C
hD : IsHermitian D
⊢ Cᴴ = B
[PROOFSTEP]
rw [← hBC, conjTranspose_conjTranspose]
[GOAL]
α : Type u_1
β : Type u_2
m : Type u_3
n : Type u_4
A✝ : Matrix n n α
inst✝ : InvolutiveStar α
A : Matrix m m α
B : Matrix m n α
C : Matrix n m α
D : Matrix n n α
hA : IsHermitian A
hBC : Bᴴ = C
hD : IsHermitian D
hCB : Cᴴ = B
⊢ IsHermitian (Matrix.fromBlocks A B C D)
[PROOFSTEP]
unfold Matrix.IsHermitian
[GOAL]
α : Type u_1
β : Type u_2
m : Type u_3
n : Type u_4
A✝ : Matrix n n α
inst✝ : InvolutiveStar α
A : Matrix m m α
B : Matrix m n α
C : Matrix n m α
D : Matrix n n α
hA : IsHermitian A
hBC : Bᴴ = C
hD : IsHermitian D
hCB : Cᴴ = B
⊢ (Matrix.fromBlocks A B C D)ᴴ = Matrix.fromBlocks A B C D
[PROOFSTEP]
rw [fromBlocks_conjTranspose, hBC, hCB, hA, hD]
[GOAL]
α : Type u_1
β : Type u_2
m : Type u_3
n : Type u_4
A✝ : Matrix n n α
inst✝⁴ : NonUnitalSemiring α
inst✝³ : StarRing α
inst✝² : NonUnitalSemiring β
inst✝¹ : StarRing β
inst✝ : Fintype n
A : Matrix m n α
⊢ IsHermitian (A * Aᴴ)
[PROOFSTEP]
rw [IsHermitian, conjTranspose_mul, conjTranspose_conjTranspose]
[GOAL]
α : Type u_1
β : Type u_2
m : Type u_3
n : Type u_4
A✝ : Matrix n n α
inst✝⁴ : NonUnitalSemiring α
inst✝³ : StarRing α
inst✝² : NonUnitalSemiring β
inst✝¹ : StarRing β
inst✝ : Fintype m
A : Matrix m n α
⊢ IsHermitian (Aᴴ * A)
[PROOFSTEP]
rw [IsHermitian, conjTranspose_mul, conjTranspose_conjTranspose]
[GOAL]
α : Type u_1
β : Type u_2
m : Type u_3
n : Type u_4
A✝ : Matrix n n α
inst✝⁴ : NonUnitalSemiring α
inst✝³ : StarRing α
inst✝² : NonUnitalSemiring β
inst✝¹ : StarRing β
inst✝ : Fintype m
A : Matrix m m α
B : Matrix m n α
hA : IsHermitian A
⊢ IsHermitian (Bᴴ * A * B)
[PROOFSTEP]
simp only [IsHermitian, conjTranspose_mul, conjTranspose_conjTranspose, hA.eq, Matrix.mul_assoc]
[GOAL]
α : Type u_1
β : Type u_2
m : Type u_3
n : Type u_4
A✝ : Matrix n n α
inst✝⁴ : NonUnitalSemiring α
inst✝³ : StarRing α
inst✝² : NonUnitalSemiring β
inst✝¹ : StarRing β
inst✝ : Fintype m
A : Matrix m m α
B : Matrix n m α
hA : IsHermitian A
⊢ IsHermitian (B * A * Bᴴ)
[PROOFSTEP]
simp only [IsHermitian, conjTranspose_mul, conjTranspose_conjTranspose, hA.eq, Matrix.mul_assoc]
[GOAL]
α : Type u_1
β : Type u_2
m : Type u_3
n : Type u_4
A✝ : Matrix n n α
inst✝³ : CommRing α
inst✝² : StarRing α
inst✝¹ : Fintype m
inst✝ : DecidableEq m
A : Matrix m m α
hA : IsHermitian A
⊢ IsHermitian A⁻¹
[PROOFSTEP]
simp [IsHermitian, conjTranspose_nonsing_inv, hA.eq]
[GOAL]
α : Type u_1
β : Type u_2
m : Type u_3
n : Type u_4
A✝ : Matrix n n α
inst✝⁴ : CommRing α
inst✝³ : StarRing α
inst✝² : Fintype m
inst✝¹ : DecidableEq m
A : Matrix m m α
inst✝ : Invertible A
h : IsHermitian A⁻¹
⊢ IsHermitian A
[PROOFSTEP]
rw [← inv_inv_of_invertible A]
[GOAL]
α : Type u_1
β : Type u_2
m : Type u_3
n : Type u_4
A✝ : Matrix n n α
inst✝⁴ : CommRing α
inst✝³ : StarRing α
inst✝² : Fintype m
inst✝¹ : DecidableEq m
A : Matrix m m α
inst✝ : Invertible A
h : IsHermitian A⁻¹
⊢ IsHermitian A⁻¹⁻¹
[PROOFSTEP]
exact IsHermitian.inv h
[GOAL]
α : Type u_1
β : Type u_2
m : Type u_3
n : Type u_4
A✝ : Matrix n n α
inst✝³ : CommRing α
inst✝² : StarRing α
inst✝¹ : Fintype m
inst✝ : DecidableEq m
A : Matrix m m α
hA : IsHermitian A
⊢ IsHermitian (Matrix.adjugate A)
[PROOFSTEP]
simp [IsHermitian, adjugate_conjTranspose, hA.eq]
[GOAL]
α : Type u_1
β : Type u_2
m : Type u_3
n : Type u_4
A✝ : Matrix n n α
inst✝¹ : IsROrC α
inst✝ : IsROrC β
A : Matrix n n α
h : IsHermitian A
i : n
⊢ ↑(↑re (A i i)) = A i i
[PROOFSTEP]
rw [← conj_eq_iff_re, ← star_def, ← conjTranspose_apply, h.eq]
[GOAL]
α : Type u_1
β : Type u_2
m : Type u_3
n : Type u_4
A✝ : Matrix n n α
inst✝³ : IsROrC α
inst✝² : IsROrC β
inst✝¹ : Fintype n
inst✝ : DecidableEq n
A : Matrix n n α
⊢ IsHermitian A ↔ LinearMap.IsSymmetric (↑toEuclideanLin A)
[PROOFSTEP]
rw [LinearMap.IsSymmetric, (PiLp.equiv 2 fun _ : n => α).symm.surjective.forall₂]
[GOAL]
α : Type u_1
β : Type u_2
m : Type u_3
n : Type u_4
A✝ : Matrix n n α
inst✝³ : IsROrC α
inst✝² : IsROrC β
inst✝¹ : Fintype n
inst✝ : DecidableEq n
A : Matrix n n α
⊢ IsHermitian A ↔
    ∀ (x₁ x₂ : n → α),
      inner (↑(↑toEuclideanLin A) (↑(PiLp.equiv 2 fun x => α).symm x₁)) (↑(PiLp.equiv 2 fun x => α).symm x₂) =
        inner (↑(PiLp.equiv 2 fun x => α).symm x₁) (↑(↑toEuclideanLin A) (↑(PiLp.equiv 2 fun x => α).symm x₂))
[PROOFSTEP]
simp only [toEuclideanLin_piLp_equiv_symm, EuclideanSpace.inner_piLp_equiv_symm, toLin'_apply, star_mulVec,
  dotProduct_mulVec]
[GOAL]
α : Type u_1
β : Type u_2
m : Type u_3
n : Type u_4
A✝ : Matrix n n α
inst✝³ : IsROrC α
inst✝² : IsROrC β
inst✝¹ : Fintype n
inst✝ : DecidableEq n
A : Matrix n n α
⊢ IsHermitian A ↔ ∀ (x₁ x₂ : n → α), vecMul (star x₁) Aᴴ ⬝ᵥ x₂ = vecMul (star x₁) A ⬝ᵥ x₂
[PROOFSTEP]
constructor
[GOAL]
case mp
α : Type u_1
β : Type u_2
m : Type u_3
n : Type u_4
A✝ : Matrix n n α
inst✝³ : IsROrC α
inst✝² : IsROrC β
inst✝¹ : Fintype n
inst✝ : DecidableEq n
A : Matrix n n α
⊢ IsHermitian A → ∀ (x₁ x₂ : n → α), vecMul (star x₁) Aᴴ ⬝ᵥ x₂ = vecMul (star x₁) A ⬝ᵥ x₂
[PROOFSTEP]
rintro (h : Aᴴ = A) x y
[GOAL]
case mp
α : Type u_1
β : Type u_2
m : Type u_3
n : Type u_4
A✝ : Matrix n n α
inst✝³ : IsROrC α
inst✝² : IsROrC β
inst✝¹ : Fintype n
inst✝ : DecidableEq n
A : Matrix n n α
h : Aᴴ = A
x y : n → α
⊢ vecMul (star x) Aᴴ ⬝ᵥ y = vecMul (star x) A ⬝ᵥ y
[PROOFSTEP]
rw [h]
[GOAL]
case mpr
α : Type u_1
β : Type u_2
m : Type u_3
n : Type u_4
A✝ : Matrix n n α
inst✝³ : IsROrC α
inst✝² : IsROrC β
inst✝¹ : Fintype n
inst✝ : DecidableEq n
A : Matrix n n α
⊢ (∀ (x₁ x₂ : n → α), vecMul (star x₁) Aᴴ ⬝ᵥ x₂ = vecMul (star x₁) A ⬝ᵥ x₂) → IsHermitian A
[PROOFSTEP]
intro h
[GOAL]
case mpr
α : Type u_1
β : Type u_2
m : Type u_3
n : Type u_4
A✝ : Matrix n n α
inst✝³ : IsROrC α
inst✝² : IsROrC β
inst✝¹ : Fintype n
inst✝ : DecidableEq n
A : Matrix n n α
h : ∀ (x₁ x₂ : n → α), vecMul (star x₁) Aᴴ ⬝ᵥ x₂ = vecMul (star x₁) A ⬝ᵥ x₂
⊢ IsHermitian A
[PROOFSTEP]
ext i j
[GOAL]
case mpr.a.h
α : Type u_1
β : Type u_2
m : Type u_3
n : Type u_4
A✝ : Matrix n n α
inst✝³ : IsROrC α
inst✝² : IsROrC β
inst✝¹ : Fintype n
inst✝ : DecidableEq n
A : Matrix n n α
h : ∀ (x₁ x₂ : n → α), vecMul (star x₁) Aᴴ ⬝ᵥ x₂ = vecMul (star x₁) A ⬝ᵥ x₂
i j : n
⊢ Aᴴ i j = A i j
[PROOFSTEP]
simpa only [(Pi.single_star i 1).symm, ← star_mulVec, mul_one, dotProduct_single, single_vecMul, star_one,
  one_mul] using h (Pi.single i 1) (Pi.single j 1)


[GOAL]
C D : Cat
F : C ⟶ D
⊢ 𝟙 C ≫ F = F
[PROOFSTEP]
cases F
[GOAL]
case mk
C D : Cat
toPrefunctor✝ : ↑C ⥤q ↑D
map_id✝ : ∀ (X : ↑C), toPrefunctor✝.map (𝟙 X) = 𝟙 (toPrefunctor✝.obj X)
map_comp✝ :
  ∀ {X Y Z : ↑C} (f : X ⟶ Y) (g : Y ⟶ Z), toPrefunctor✝.map (f ≫ g) = toPrefunctor✝.map f ≫ toPrefunctor✝.map g
⊢ 𝟙 C ≫ Functor.mk toPrefunctor✝ = Functor.mk toPrefunctor✝
[PROOFSTEP]
rfl
[GOAL]
C D : Cat
F : C ⟶ D
⊢ F ≫ 𝟙 D = F
[PROOFSTEP]
cases F
[GOAL]
case mk
C D : Cat
toPrefunctor✝ : ↑C ⥤q ↑D
map_id✝ : ∀ (X : ↑C), toPrefunctor✝.map (𝟙 X) = 𝟙 (toPrefunctor✝.obj X)
map_comp✝ :
  ∀ {X Y Z : ↑C} (f : X ⟶ Y) (g : Y ⟶ Z), toPrefunctor✝.map (f ≫ g) = toPrefunctor✝.map f ≫ toPrefunctor✝.map g
⊢ Functor.mk toPrefunctor✝ ≫ 𝟙 D = Functor.mk toPrefunctor✝
[PROOFSTEP]
rfl
[GOAL]
⊢ ∀ {a b c d : Cat} (f : a ⟶ b) (g : b ⟶ c) (h : c ⟶ d), (f ≫ g) ≫ h = f ≫ g ≫ h
[PROOFSTEP]
intros
[GOAL]
a✝ b✝ c✝ d✝ : Cat
f✝ : a✝ ⟶ b✝
g✝ : b✝ ⟶ c✝
h✝ : c✝ ⟶ d✝
⊢ (f✝ ≫ g✝) ≫ h✝ = f✝ ≫ g✝ ≫ h✝
[PROOFSTEP]
rfl
[GOAL]
X Y : Type u
f : X ⟶ Y
⊢ (fun X => Cat.of (Discrete X)) X ⟶ (fun X => Cat.of (Discrete X)) Y
[PROOFSTEP]
dsimp
[GOAL]
X Y : Type u
f : X ⟶ Y
⊢ Cat.of (Discrete X) ⟶ Cat.of (Discrete Y)
[PROOFSTEP]
exact Discrete.functor (Discrete.mk ∘ f)
[GOAL]
X : Type u
⊢ { obj := fun X => Cat.of (Discrete X), map := fun {X Y} f => id (Discrete.functor (Discrete.mk ∘ f)) }.map (𝟙 X) =
    𝟙 ({ obj := fun X => Cat.of (Discrete X), map := fun {X Y} f => id (Discrete.functor (Discrete.mk ∘ f)) }.obj X)
[PROOFSTEP]
apply Functor.ext
[GOAL]
case h_map
X : Type u
⊢ autoParam
    (∀
      (X_1 Y :
        ↑({ obj := fun X => Cat.of (Discrete X), map := fun {X Y} f => id (Discrete.functor (Discrete.mk ∘ f)) }.obj X))
      (f : X_1 ⟶ Y),
      ({ obj := fun X => Cat.of (Discrete X), map := fun {X Y} f => id (Discrete.functor (Discrete.mk ∘ f)) }.map
              (𝟙 X)).map
          f =
        eqToHom (_ : ?F.obj X_1 = ?G.obj X_1) ≫
          (𝟙
                  ({ obj := fun X => Cat.of (Discrete X),
                        map := fun {X Y} f => id (Discrete.functor (Discrete.mk ∘ f)) }.obj
                    X)).map
              f ≫
            eqToHom
              (_ :
                (𝟙
                        ({ obj := fun X => Cat.of (Discrete X),
                              map := fun {X Y} f => id (Discrete.functor (Discrete.mk ∘ f)) }.obj
                          X)).obj
                    Y =
                  ({ obj := fun X => Cat.of (Discrete X),
                            map := fun {X Y} f => id (Discrete.functor (Discrete.mk ∘ f)) }.map
                        (𝟙 X)).obj
                    Y))
    _auto✝
[PROOFSTEP]
intro X Y f
[GOAL]
case h_map
X✝ : Type u
X Y : ↑({ obj := fun X => Cat.of (Discrete X), map := fun {X Y} f => id (Discrete.functor (Discrete.mk ∘ f)) }.obj X✝)
f : X ⟶ Y
⊢ ({ obj := fun X => Cat.of (Discrete X), map := fun {X Y} f => id (Discrete.functor (Discrete.mk ∘ f)) }.map
          (𝟙 X✝)).map
      f =
    eqToHom (_ : ?F.obj X = ?G.obj X) ≫
      (𝟙
              ({ obj := fun X => Cat.of (Discrete X),
                    map := fun {X Y} f => id (Discrete.functor (Discrete.mk ∘ f)) }.obj
                X✝)).map
          f ≫
        eqToHom
          (_ :
            (𝟙
                    ({ obj := fun X => Cat.of (Discrete X),
                          map := fun {X Y} f => id (Discrete.functor (Discrete.mk ∘ f)) }.obj
                      X✝)).obj
                Y =
              ({ obj := fun X => Cat.of (Discrete X),
                        map := fun {X Y} f => id (Discrete.functor (Discrete.mk ∘ f)) }.map
                    (𝟙 X✝)).obj
                Y)
[PROOFSTEP]
cases f
[GOAL]
case h_map.up
X✝ : Type u
X Y : ↑({ obj := fun X => Cat.of (Discrete X), map := fun {X Y} f => id (Discrete.functor (Discrete.mk ∘ f)) }.obj X✝)
down✝ : PLift (X.as = Y.as)
⊢ ({ obj := fun X => Cat.of (Discrete X), map := fun {X Y} f => id (Discrete.functor (Discrete.mk ∘ f)) }.map
          (𝟙 X✝)).map
      { down := down✝ } =
    eqToHom (_ : ?F.obj X = ?G.obj X) ≫
      (𝟙
              ({ obj := fun X => Cat.of (Discrete X),
                    map := fun {X Y} f => id (Discrete.functor (Discrete.mk ∘ f)) }.obj
                X✝)).map
          { down := down✝ } ≫
        eqToHom
          (_ :
            (𝟙
                    ({ obj := fun X => Cat.of (Discrete X),
                          map := fun {X Y} f => id (Discrete.functor (Discrete.mk ∘ f)) }.obj
                      X✝)).obj
                Y =
              ({ obj := fun X => Cat.of (Discrete X),
                        map := fun {X Y} f => id (Discrete.functor (Discrete.mk ∘ f)) }.map
                    (𝟙 X✝)).obj
                Y)
[PROOFSTEP]
simp only [id_eq, eqToHom_refl, Cat.id_map, Category.comp_id, Category.id_comp]
[GOAL]
case h_map.up
X✝ : Type u
X Y : ↑({ obj := fun X => Cat.of (Discrete X), map := fun {X Y} f => id (Discrete.functor (Discrete.mk ∘ f)) }.obj X✝)
down✝ : PLift (X.as = Y.as)
⊢ (Discrete.functor (Discrete.mk ∘ 𝟙 X✝)).map { down := down✝ } = { down := down✝ }
[PROOFSTEP]
apply ULift.ext
[GOAL]
case h_map.up.h
X✝ : Type u
X Y : ↑({ obj := fun X => Cat.of (Discrete X), map := fun {X Y} f => id (Discrete.functor (Discrete.mk ∘ f)) }.obj X✝)
down✝ : PLift (X.as = Y.as)
⊢ ((Discrete.functor (Discrete.mk ∘ 𝟙 X✝)).map { down := down✝ }).down = { down := down✝ }.down
[PROOFSTEP]
aesop_cat
[GOAL]
case h_obj
X : Type u
⊢ ∀
    (X_1 :
      ↑({ obj := fun X => Cat.of (Discrete X), map := fun {X Y} f => id (Discrete.functor (Discrete.mk ∘ f)) }.obj X)),
    ({ obj := fun X => Cat.of (Discrete X), map := fun {X Y} f => id (Discrete.functor (Discrete.mk ∘ f)) }.map
            (𝟙 X)).obj
        X_1 =
      (𝟙
            ({ obj := fun X => Cat.of (Discrete X), map := fun {X Y} f => id (Discrete.functor (Discrete.mk ∘ f)) }.obj
              X)).obj
        X_1
[PROOFSTEP]
aesop_cat
[GOAL]
X✝ Y✝ Z✝ : Type u
f : X✝ ⟶ Y✝
g : Y✝ ⟶ Z✝
⊢ { obj := fun X => Cat.of (Discrete X), map := fun {X Y} f => id (Discrete.functor (Discrete.mk ∘ f)) }.map (f ≫ g) =
    { obj := fun X => Cat.of (Discrete X), map := fun {X Y} f => id (Discrete.functor (Discrete.mk ∘ f)) }.map f ≫
      { obj := fun X => Cat.of (Discrete X), map := fun {X Y} f => id (Discrete.functor (Discrete.mk ∘ f)) }.map g
[PROOFSTEP]
apply Functor.ext
[GOAL]
case h_map
X✝ Y✝ Z✝ : Type u
f : X✝ ⟶ Y✝
g : Y✝ ⟶ Z✝
⊢ autoParam
    (∀
      (X Y :
        ↑({ obj := fun X => Cat.of (Discrete X), map := fun {X Y} f => id (Discrete.functor (Discrete.mk ∘ f)) }.obj
            X✝))
      (f_1 : X ⟶ Y),
      ({ obj := fun X => Cat.of (Discrete X), map := fun {X Y} f => id (Discrete.functor (Discrete.mk ∘ f)) }.map
              (f ≫ g)).map
          f_1 =
        eqToHom (_ : ?F.obj X = ?G.obj X) ≫
          ({ obj := fun X => Cat.of (Discrete X), map := fun {X Y} f => id (Discrete.functor (Discrete.mk ∘ f)) }.map
                    f ≫
                  { obj := fun X => Cat.of (Discrete X),
                        map := fun {X Y} f => id (Discrete.functor (Discrete.mk ∘ f)) }.map
                    g).map
              f_1 ≫
            eqToHom
              (_ :
                ({ obj := fun X => Cat.of (Discrete X),
                              map := fun {X Y} f => id (Discrete.functor (Discrete.mk ∘ f)) }.map
                          f ≫
                        { obj := fun X => Cat.of (Discrete X),
                              map := fun {X Y} f => id (Discrete.functor (Discrete.mk ∘ f)) }.map
                          g).obj
                    Y =
                  ({ obj := fun X => Cat.of (Discrete X),
                            map := fun {X Y} f => id (Discrete.functor (Discrete.mk ∘ f)) }.map
                        (f ≫ g)).obj
                    Y))
    _auto✝
case h_obj
X✝ Y✝ Z✝ : Type u
f : X✝ ⟶ Y✝
g : Y✝ ⟶ Z✝
⊢ ∀
    (X :
      ↑({ obj := fun X => Cat.of (Discrete X), map := fun {X Y} f => id (Discrete.functor (Discrete.mk ∘ f)) }.obj X✝)),
    ({ obj := fun X => Cat.of (Discrete X), map := fun {X Y} f => id (Discrete.functor (Discrete.mk ∘ f)) }.map
            (f ≫ g)).obj
        X =
      ({ obj := fun X => Cat.of (Discrete X), map := fun {X Y} f => id (Discrete.functor (Discrete.mk ∘ f)) }.map f ≫
            { obj := fun X => Cat.of (Discrete X), map := fun {X Y} f => id (Discrete.functor (Discrete.mk ∘ f)) }.map
              g).obj
        X
[PROOFSTEP]
aesop_cat
[GOAL]
⊢ ∀ {X Y : Type u} (f : typeToCat.obj X ⟶ typeToCat.obj Y),
    typeToCat.map ((fun {X Y} F => Discrete.as ∘ F.obj ∘ Discrete.mk) f) = f
[PROOFSTEP]
intro X Y F
[GOAL]
X Y : Type u
F : typeToCat.obj X ⟶ typeToCat.obj Y
⊢ typeToCat.map ((fun {X Y} F => Discrete.as ∘ F.obj ∘ Discrete.mk) F) = F
[PROOFSTEP]
apply Functor.ext
[GOAL]
case h_map
X Y : Type u
F : typeToCat.obj X ⟶ typeToCat.obj Y
⊢ autoParam
    (∀ (X_1 Y_1 : ↑(typeToCat.obj X)) (f : X_1 ⟶ Y_1),
      (typeToCat.map ((fun {X Y} F => Discrete.as ∘ F.obj ∘ Discrete.mk) F)).map f =
        eqToHom (_ : ?F.obj X_1 = ?G.obj X_1) ≫
          F.map f ≫
            eqToHom (_ : F.obj Y_1 = (typeToCat.map ((fun {X Y} F => Discrete.as ∘ F.obj ∘ Discrete.mk) F)).obj Y_1))
    _auto✝
[PROOFSTEP]
intro x y f
[GOAL]
case h_map
X Y : Type u
F : typeToCat.obj X ⟶ typeToCat.obj Y
x y : ↑(typeToCat.obj X)
f : x ⟶ y
⊢ (typeToCat.map ((fun {X Y} F => Discrete.as ∘ F.obj ∘ Discrete.mk) F)).map f =
    eqToHom (_ : ?F.obj x = ?G.obj x) ≫
      F.map f ≫ eqToHom (_ : F.obj y = (typeToCat.map ((fun {X Y} F => Discrete.as ∘ F.obj ∘ Discrete.mk) F)).obj y)
[PROOFSTEP]
dsimp
[GOAL]
case h_map
X Y : Type u
F : typeToCat.obj X ⟶ typeToCat.obj Y
x y : ↑(typeToCat.obj X)
f : x ⟶ y
⊢ (Discrete.functor (Discrete.mk ∘ Discrete.as ∘ F.obj ∘ Discrete.mk)).map f =
    𝟙 ((Discrete.functor (Discrete.mk ∘ Discrete.as ∘ F.obj ∘ Discrete.mk)).obj x) ≫ F.map f ≫ 𝟙 (F.obj y)
[PROOFSTEP]
apply ULift.ext
[GOAL]
case h_map.h
X Y : Type u
F : typeToCat.obj X ⟶ typeToCat.obj Y
x y : ↑(typeToCat.obj X)
f : x ⟶ y
⊢ ((Discrete.functor (Discrete.mk ∘ Discrete.as ∘ F.obj ∘ Discrete.mk)).map f).down =
    (𝟙 ((Discrete.functor (Discrete.mk ∘ Discrete.as ∘ F.obj ∘ Discrete.mk)).obj x) ≫ F.map f ≫ 𝟙 (F.obj y)).down
[PROOFSTEP]
aesop_cat
[GOAL]
case h_obj
X Y : Type u
F : typeToCat.obj X ⟶ typeToCat.obj Y
⊢ ∀ (X_1 : ↑(typeToCat.obj X)),
    (typeToCat.map ((fun {X Y} F => Discrete.as ∘ F.obj ∘ Discrete.mk) F)).obj X_1 = F.obj X_1
[PROOFSTEP]
rintro ⟨x⟩
[GOAL]
case h_obj.mk
X Y : Type u
F : typeToCat.obj X ⟶ typeToCat.obj Y
x : X
⊢ (typeToCat.map ((fun {X Y} F => Discrete.as ∘ F.obj ∘ Discrete.mk) F)).obj { as := x } = F.obj { as := x }
[PROOFSTEP]
apply Discrete.ext
[GOAL]
case h_obj.mk.as
X Y : Type u
F : typeToCat.obj X ⟶ typeToCat.obj Y
x : X
⊢ ((typeToCat.map ((fun {X Y} F => Discrete.as ∘ F.obj ∘ Discrete.mk) F)).obj { as := x }).as = (F.obj { as := x }).as
[PROOFSTEP]
rfl


[GOAL]
ι : Type u_1
α : Type u_2
inst✝ : Zero α
s✝ : Finset ι
f✝ : (i : ι) → i ∈ s✝ → α
i✝ : ι
s : Finset ι
f : (i : ι) → i ∈ s → α
i : ι
⊢ i ∈ map (Embedding.subtype fun x => x ∈ s) (filter (fun i => f ↑i (_ : ↑i ∈ s) ≠ 0) (attach s)) ↔
    (fun i => if H : i ∈ s then f i H else 0) i ≠ 0
[PROOFSTEP]
classical simp
[GOAL]
ι : Type u_1
α : Type u_2
inst✝ : Zero α
s✝ : Finset ι
f✝ : (i : ι) → i ∈ s✝ → α
i✝ : ι
s : Finset ι
f : (i : ι) → i ∈ s → α
i : ι
⊢ i ∈ map (Embedding.subtype fun x => x ∈ s) (filter (fun i => f ↑i (_ : ↑i ∈ s) ≠ 0) (attach s)) ↔
    (fun i => if H : i ∈ s then f i H else 0) i ≠ 0
[PROOFSTEP]
simp
[GOAL]
ι : Type u_1
α : Type u_2
inst✝¹ : Zero α
s : Finset ι
f : (i : ι) → i ∈ s → α
i : ι
inst✝ : DecidableEq ι
⊢ ↑(indicator s f) i = if hi : i ∈ s then f i hi else 0
[PROOFSTEP]
simp only [indicator, ne_eq, coe_mk]
[GOAL]
ι : Type u_1
α : Type u_2
inst✝¹ : Zero α
s : Finset ι
f : (i : ι) → i ∈ s → α
i : ι
inst✝ : DecidableEq ι
⊢ (if H : i ∈ s then f i H else 0) = if hi : i ∈ s then f i hi else 0
[PROOFSTEP]
congr
[GOAL]
ι : Type u_1
α : Type u_2
inst✝ : Zero α
s : Finset ι
f : (i : ι) → i ∈ s → α
i : ι
⊢ Injective fun f => indicator s f
[PROOFSTEP]
intro a b h
[GOAL]
ι : Type u_1
α : Type u_2
inst✝ : Zero α
s : Finset ι
f : (i : ι) → i ∈ s → α
i : ι
a b : (i : ι) → i ∈ s → α
h : (fun f => indicator s f) a = (fun f => indicator s f) b
⊢ a = b
[PROOFSTEP]
ext i hi
[GOAL]
case h.h
ι : Type u_1
α : Type u_2
inst✝ : Zero α
s : Finset ι
f : (i : ι) → i ∈ s → α
i✝ : ι
a b : (i : ι) → i ∈ s → α
h : (fun f => indicator s f) a = (fun f => indicator s f) b
i : ι
hi : i ∈ s
⊢ a i hi = b i hi
[PROOFSTEP]
rw [← indicator_of_mem hi a, ← indicator_of_mem hi b]
[GOAL]
case h.h
ι : Type u_1
α : Type u_2
inst✝ : Zero α
s : Finset ι
f : (i : ι) → i ∈ s → α
i✝ : ι
a b : (i : ι) → i ∈ s → α
h : (fun f => indicator s f) a = (fun f => indicator s f) b
i : ι
hi : i ∈ s
⊢ ↑(indicator s a) i = ↑(indicator s b) i
[PROOFSTEP]
exact FunLike.congr_fun h i
[GOAL]
ι : Type u_1
α : Type u_2
inst✝ : Zero α
s : Finset ι
f : (i : ι) → i ∈ s → α
i : ι
⊢ ↑(indicator s f).support ⊆ ↑s
[PROOFSTEP]
intro i hi
[GOAL]
ι : Type u_1
α : Type u_2
inst✝ : Zero α
s : Finset ι
f : (i : ι) → i ∈ s → α
i✝ i : ι
hi : i ∈ ↑(indicator s f).support
⊢ i ∈ ↑s
[PROOFSTEP]
rw [mem_coe, mem_support_iff] at hi
[GOAL]
ι : Type u_1
α : Type u_2
inst✝ : Zero α
s : Finset ι
f : (i : ι) → i ∈ s → α
i✝ i : ι
hi : ↑(indicator s f) i ≠ 0
⊢ i ∈ ↑s
[PROOFSTEP]
by_contra h
[GOAL]
ι : Type u_1
α : Type u_2
inst✝ : Zero α
s : Finset ι
f : (i : ι) → i ∈ s → α
i✝ i : ι
hi : ↑(indicator s f) i ≠ 0
h : ¬i ∈ ↑s
⊢ False
[PROOFSTEP]
exact hi (indicator_of_not_mem h _)
[GOAL]
ι : Type u_1
α : Type u_2
inst✝ : Zero α
s : Finset ι
f : (i : ι) → i ∈ s → α
i : ι
b : α
⊢ single i b = indicator {i} fun x x => b
[PROOFSTEP]
classical
ext j
simp [single_apply, indicator_apply, @eq_comm _ j]
[GOAL]
ι : Type u_1
α : Type u_2
inst✝ : Zero α
s : Finset ι
f : (i : ι) → i ∈ s → α
i : ι
b : α
⊢ single i b = indicator {i} fun x x => b
[PROOFSTEP]
ext j
[GOAL]
case h
ι : Type u_1
α : Type u_2
inst✝ : Zero α
s : Finset ι
f : (i : ι) → i ∈ s → α
i : ι
b : α
j : ι
⊢ ↑(single i b) j = ↑(indicator {i} fun x x => b) j
[PROOFSTEP]
simp [single_apply, indicator_apply, @eq_comm _ j]


[GOAL]
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
g : ExteriorAlgebra R M →ₐ[R] A
m : M
⊢ ↑g (↑(ι R) m) * ↑g (↑(ι R) m) = 0
[PROOFSTEP]
rw [← AlgHom.map_mul, ι_sq_zero, AlgHom.map_zero]
[GOAL]
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
⊢ ∀ (a : M →ₗ[R] A),
    (∀ (m : M), ↑a m * ↑a m = 0) ↔
      ∀ (m : M), ↑(↑(Equiv.refl (M →ₗ[R] A)) a) m * ↑(↑(Equiv.refl (M →ₗ[R] A)) a) m = ↑(algebraMap R A) (↑0 m)
[PROOFSTEP]
simp
[GOAL]
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
m : M
⊢ ↑0 m * ↑0 m = 0
[PROOFSTEP]
simp
[GOAL]
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
x : R
⊢ ↑algebraMapInv (↑(algebraMap R (ExteriorAlgebra R M)) x) = x
[PROOFSTEP]
simp [algebraMapInv]
[GOAL]
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
⊢ ExteriorAlgebra R M →ₗ[R] M
[PROOFSTEP]
letI : Module Rᵐᵒᵖ M := Module.compHom _ ((RingHom.id R).fromOpposite mul_comm)
[GOAL]
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
this : Module Rᵐᵒᵖ M := Module.compHom M (RingHom.fromOpposite (RingHom.id R) (_ : ∀ (a b : R), a * b = b * a))
⊢ ExteriorAlgebra R M →ₗ[R] M
[PROOFSTEP]
haveI : IsCentralScalar R M := ⟨fun r m => rfl⟩
[GOAL]
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
this✝ : Module Rᵐᵒᵖ M := Module.compHom M (RingHom.fromOpposite (RingHom.id R) (_ : ∀ (a b : R), a * b = b * a))
this : IsCentralScalar R M
⊢ ExteriorAlgebra R M →ₗ[R] M
[PROOFSTEP]
exact (TrivSqZeroExt.sndHom R M).comp toTrivSqZeroExt.toLinearMap
[GOAL]
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
x : M
⊢ ↑ιInv.toAddHom (↑(ι R) x) = x
[PROOFSTEP]
letI : Module Rᵐᵒᵖ M := Module.compHom _ ((RingHom.id R).fromOpposite mul_comm)
[GOAL]
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
x : M
this : Module Rᵐᵒᵖ M := Module.compHom M (RingHom.fromOpposite (RingHom.id R) (_ : ∀ (a b : R), a * b = b * a))
⊢ ↑ιInv.toAddHom (↑(ι R) x) = x
[PROOFSTEP]
haveI : IsCentralScalar R M := ⟨fun r m => rfl⟩
[GOAL]
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
x : M
this✝ : Module Rᵐᵒᵖ M := Module.compHom M (RingHom.fromOpposite (RingHom.id R) (_ : ∀ (a b : R), a * b = b * a))
this : IsCentralScalar R M
⊢ ↑ιInv.toAddHom (↑(ι R) x) = x
[PROOFSTEP]
simp [ιInv]
[GOAL]
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
x : M
⊢ ↑(ι R) x = 0 ↔ x = 0
[PROOFSTEP]
rw [← ι_inj R x 0, LinearMap.map_zero]
[GOAL]
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
x : M
r : R
⊢ ↑(ι R) x = ↑(algebraMap R (ExteriorAlgebra R M)) r ↔ x = 0 ∧ r = 0
[PROOFSTEP]
refine' ⟨fun h => _, _⟩
[GOAL]
case refine'_1
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
x : M
r : R
h : ↑(ι R) x = ↑(algebraMap R (ExteriorAlgebra R M)) r
⊢ x = 0 ∧ r = 0
[PROOFSTEP]
letI : Module Rᵐᵒᵖ M := Module.compHom _ ((RingHom.id R).fromOpposite mul_comm)
[GOAL]
case refine'_1
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
x : M
r : R
h : ↑(ι R) x = ↑(algebraMap R (ExteriorAlgebra R M)) r
this : Module Rᵐᵒᵖ M := Module.compHom M (RingHom.fromOpposite (RingHom.id R) (_ : ∀ (a b : R), a * b = b * a))
⊢ x = 0 ∧ r = 0
[PROOFSTEP]
haveI : IsCentralScalar R M := ⟨fun r m => rfl⟩
[GOAL]
case refine'_1
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
x : M
r : R
h : ↑(ι R) x = ↑(algebraMap R (ExteriorAlgebra R M)) r
this✝ : Module Rᵐᵒᵖ M := Module.compHom M (RingHom.fromOpposite (RingHom.id R) (_ : ∀ (a b : R), a * b = b * a))
this : IsCentralScalar R M
⊢ x = 0 ∧ r = 0
[PROOFSTEP]
have hf0 : toTrivSqZeroExt (ι R x) = (0, x) := toTrivSqZeroExt_ι _
[GOAL]
case refine'_1
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
x : M
r : R
h : ↑(ι R) x = ↑(algebraMap R (ExteriorAlgebra R M)) r
this✝ : Module Rᵐᵒᵖ M := Module.compHom M (RingHom.fromOpposite (RingHom.id R) (_ : ∀ (a b : R), a * b = b * a))
this : IsCentralScalar R M
hf0 : ↑toTrivSqZeroExt (↑(ι R) x) = (0, x)
⊢ x = 0 ∧ r = 0
[PROOFSTEP]
rw [h, AlgHom.commutes] at hf0
[GOAL]
case refine'_1
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
x : M
r : R
h : ↑(ι R) x = ↑(algebraMap R (ExteriorAlgebra R M)) r
this✝ : Module Rᵐᵒᵖ M := Module.compHom M (RingHom.fromOpposite (RingHom.id R) (_ : ∀ (a b : R), a * b = b * a))
this : IsCentralScalar R M
hf0 : ↑(algebraMap R (TrivSqZeroExt R M)) r = (0, x)
⊢ x = 0 ∧ r = 0
[PROOFSTEP]
have : r = 0 ∧ 0 = x := Prod.ext_iff.1 hf0
[GOAL]
case refine'_1
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
x : M
r : R
h : ↑(ι R) x = ↑(algebraMap R (ExteriorAlgebra R M)) r
this✝¹ : Module Rᵐᵒᵖ M := Module.compHom M (RingHom.fromOpposite (RingHom.id R) (_ : ∀ (a b : R), a * b = b * a))
this✝ : IsCentralScalar R M
hf0 : ↑(algebraMap R (TrivSqZeroExt R M)) r = (0, x)
this : r = 0 ∧ 0 = x
⊢ x = 0 ∧ r = 0
[PROOFSTEP]
exact this.symm.imp_left Eq.symm
[GOAL]
case refine'_2
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
x : M
r : R
⊢ x = 0 ∧ r = 0 → ↑(ι R) x = ↑(algebraMap R (ExteriorAlgebra R M)) r
[PROOFSTEP]
rintro ⟨rfl, rfl⟩
[GOAL]
case refine'_2.intro
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
⊢ ↑(ι R) 0 = ↑(algebraMap R (ExteriorAlgebra R M)) 0
[PROOFSTEP]
rw [LinearMap.map_zero, RingHom.map_zero]
[GOAL]
R : Type u1
inst✝⁵ : CommRing R
M : Type u2
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
A : Type u_1
inst✝² : Semiring A
inst✝¹ : Algebra R A
inst✝ : Nontrivial R
x : M
⊢ ↑(ι R) x ≠ 1
[PROOFSTEP]
rw [← (algebraMap R (ExteriorAlgebra R M)).map_one, Ne.def, ι_eq_algebraMap_iff]
[GOAL]
R : Type u1
inst✝⁵ : CommRing R
M : Type u2
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
A : Type u_1
inst✝² : Semiring A
inst✝¹ : Algebra R A
inst✝ : Nontrivial R
x : M
⊢ ¬(x = 0 ∧ 1 = 0)
[PROOFSTEP]
exact one_ne_zero ∘ And.right
[GOAL]
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
⊢ Disjoint (LinearMap.range (ι R)) 1
[PROOFSTEP]
rw [Submodule.disjoint_def]
[GOAL]
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
⊢ ∀ (x : ExteriorAlgebra R M), x ∈ LinearMap.range (ι R) → x ∈ 1 → x = 0
[PROOFSTEP]
rintro _ ⟨x, hx⟩ ⟨r, rfl : algebraMap R (ExteriorAlgebra R M) r = _⟩
[GOAL]
case intro.intro
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
x : M
r : R
hx : ↑(ι R) x = ↑(algebraMap R (ExteriorAlgebra R M)) r
⊢ ↑(algebraMap R (ExteriorAlgebra R M)) r = 0
[PROOFSTEP]
rw [ι_eq_algebraMap_iff x] at hx
[GOAL]
case intro.intro
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
x : M
r : R
hx : x = 0 ∧ r = 0
⊢ ↑(algebraMap R (ExteriorAlgebra R M)) r = 0
[PROOFSTEP]
rw [hx.2, RingHom.map_zero]
[GOAL]
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
x y : M
⊢ ↑(ι R) x * ↑(ι R) y + ↑(ι R) y * ↑(ι R) x = ↑(ι R) (y + x) * ↑(ι R) (y + x)
[PROOFSTEP]
simp [mul_add, add_mul]
[GOAL]
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
n : ℕ
f : Fin n → M
i : Fin n
⊢ ↑(ι R) (f i) * List.prod (List.ofFn fun i => ↑(ι R) (f i)) = 0
[PROOFSTEP]
induction' n with n hn
[GOAL]
case zero
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
n : ℕ
f✝ : Fin n → M
i✝ : Fin n
f : Fin Nat.zero → M
i : Fin Nat.zero
⊢ ↑(ι R) (f i) * List.prod (List.ofFn fun i => ↑(ι R) (f i)) = 0
[PROOFSTEP]
exact i.elim0
[GOAL]
case succ
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
n✝ : ℕ
f✝ : Fin n✝ → M
i✝ : Fin n✝
n : ℕ
hn : ∀ (f : Fin n → M) (i : Fin n), ↑(ι R) (f i) * List.prod (List.ofFn fun i => ↑(ι R) (f i)) = 0
f : Fin (Nat.succ n) → M
i : Fin (Nat.succ n)
⊢ ↑(ι R) (f i) * List.prod (List.ofFn fun i => ↑(ι R) (f i)) = 0
[PROOFSTEP]
rw [List.ofFn_succ, List.prod_cons, ← mul_assoc]
[GOAL]
case succ
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
n✝ : ℕ
f✝ : Fin n✝ → M
i✝ : Fin n✝
n : ℕ
hn : ∀ (f : Fin n → M) (i : Fin n), ↑(ι R) (f i) * List.prod (List.ofFn fun i => ↑(ι R) (f i)) = 0
f : Fin (Nat.succ n) → M
i : Fin (Nat.succ n)
⊢ ↑(ι R) (f i) * ↑(ι R) (f 0) * List.prod (List.ofFn fun i => ↑(ι R) (f (Fin.succ i))) = 0
[PROOFSTEP]
by_cases h : i = 0
[GOAL]
case pos
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
n✝ : ℕ
f✝ : Fin n✝ → M
i✝ : Fin n✝
n : ℕ
hn : ∀ (f : Fin n → M) (i : Fin n), ↑(ι R) (f i) * List.prod (List.ofFn fun i => ↑(ι R) (f i)) = 0
f : Fin (Nat.succ n) → M
i : Fin (Nat.succ n)
h : i = 0
⊢ ↑(ι R) (f i) * ↑(ι R) (f 0) * List.prod (List.ofFn fun i => ↑(ι R) (f (Fin.succ i))) = 0
[PROOFSTEP]
rw [h, ι_sq_zero, zero_mul]
[GOAL]
case neg
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
n✝ : ℕ
f✝ : Fin n✝ → M
i✝ : Fin n✝
n : ℕ
hn : ∀ (f : Fin n → M) (i : Fin n), ↑(ι R) (f i) * List.prod (List.ofFn fun i => ↑(ι R) (f i)) = 0
f : Fin (Nat.succ n) → M
i : Fin (Nat.succ n)
h : ¬i = 0
⊢ ↑(ι R) (f i) * ↑(ι R) (f 0) * List.prod (List.ofFn fun i => ↑(ι R) (f (Fin.succ i))) = 0
[PROOFSTEP]
replace hn := congr_arg ((· * ·) <| ι R <| f 0) (hn (fun i => f <| Fin.succ i) (i.pred h))
[GOAL]
case neg
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
n✝ : ℕ
f✝ : Fin n✝ → M
i✝ : Fin n✝
n : ℕ
f : Fin (Nat.succ n) → M
i : Fin (Nat.succ n)
h : ¬i = 0
hn :
  (fun x x_1 => x * x_1) (↑(ι R) (f 0))
      (↑(ι R) (f (Fin.succ (Fin.pred i h))) * List.prod (List.ofFn fun i => ↑(ι R) (f (Fin.succ i)))) =
    (fun x x_1 => x * x_1) (↑(ι R) (f 0)) 0
⊢ ↑(ι R) (f i) * ↑(ι R) (f 0) * List.prod (List.ofFn fun i => ↑(ι R) (f (Fin.succ i))) = 0
[PROOFSTEP]
simp only at hn
[GOAL]
case neg
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
n✝ : ℕ
f✝ : Fin n✝ → M
i✝ : Fin n✝
n : ℕ
f : Fin (Nat.succ n) → M
i : Fin (Nat.succ n)
h : ¬i = 0
hn :
  ↑(ι R) (f 0) * (↑(ι R) (f (Fin.succ (Fin.pred i h))) * List.prod (List.ofFn fun i => ↑(ι R) (f (Fin.succ i)))) =
    ↑(ι R) (f 0) * 0
⊢ ↑(ι R) (f i) * ↑(ι R) (f 0) * List.prod (List.ofFn fun i => ↑(ι R) (f (Fin.succ i))) = 0
[PROOFSTEP]
rw [Fin.succ_pred, ← mul_assoc, mul_zero] at hn
[GOAL]
case neg
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
n✝ : ℕ
f✝ : Fin n✝ → M
i✝ : Fin n✝
n : ℕ
f : Fin (Nat.succ n) → M
i : Fin (Nat.succ n)
h : ¬i = 0
hn : ↑(ι R) (f 0) * ↑(ι R) (f i) * List.prod (List.ofFn fun i => ↑(ι R) (f (Fin.succ i))) = 0
⊢ ↑(ι R) (f i) * ↑(ι R) (f 0) * List.prod (List.ofFn fun i => ↑(ι R) (f (Fin.succ i))) = 0
[PROOFSTEP]
refine' (eq_zero_iff_eq_zero_of_add_eq_zero _).mp hn
[GOAL]
case neg
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
n✝ : ℕ
f✝ : Fin n✝ → M
i✝ : Fin n✝
n : ℕ
f : Fin (Nat.succ n) → M
i : Fin (Nat.succ n)
h : ¬i = 0
hn : ↑(ι R) (f 0) * ↑(ι R) (f i) * List.prod (List.ofFn fun i => ↑(ι R) (f (Fin.succ i))) = 0
⊢ ↑(ι R) (f 0) * ↑(ι R) (f i) * List.prod (List.ofFn fun i => ↑(ι R) (f (Fin.succ i))) +
      ↑(ι R) (f i) * ↑(ι R) (f 0) * List.prod (List.ofFn fun i => ↑(ι R) (f (Fin.succ i))) =
    0
[PROOFSTEP]
rw [← add_mul, ι_add_mul_swap, zero_mul]
[GOAL]
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
n : ℕ
F : MultilinearMap R (fun x => M) (ExteriorAlgebra R M) :=
  MultilinearMap.compLinearMap (MultilinearMap.mkPiAlgebraFin R n (ExteriorAlgebra R M)) fun x => ι R
f : Fin n → M
x y : Fin n
hfxy : f x = f y
hxy : x ≠ y
⊢ MultilinearMap.toFun
      { toFun := ↑F,
        map_add' :=
          (_ :
            ∀ [inst : DecidableEq (Fin n)] (m : Fin n → M) (i : Fin n) (x y : M),
              MultilinearMap.toFun F (Function.update m i (x + y)) =
                MultilinearMap.toFun F (Function.update m i x) + MultilinearMap.toFun F (Function.update m i y)),
        map_smul' :=
          (_ :
            ∀ [inst : DecidableEq (Fin n)] (m : Fin n → M) (i : Fin n) (c : R) (x : M),
              MultilinearMap.toFun F (Function.update m i (c • x)) =
                c • MultilinearMap.toFun F (Function.update m i x)) }
      f =
    0
[PROOFSTEP]
dsimp
[GOAL]
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
n : ℕ
F : MultilinearMap R (fun x => M) (ExteriorAlgebra R M) :=
  MultilinearMap.compLinearMap (MultilinearMap.mkPiAlgebraFin R n (ExteriorAlgebra R M)) fun x => ι R
f : Fin n → M
x y : Fin n
hfxy : f x = f y
hxy : x ≠ y
⊢ List.prod (List.ofFn fun i => ↑(ι R) (f i)) = 0
[PROOFSTEP]
clear F
[GOAL]
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
n : ℕ
f : Fin n → M
x y : Fin n
hfxy : f x = f y
hxy : x ≠ y
⊢ List.prod (List.ofFn fun i => ↑(ι R) (f i)) = 0
[PROOFSTEP]
wlog h : x < y
[GOAL]
case inr
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
n : ℕ
f : Fin n → M
x y : Fin n
hfxy : f x = f y
hxy : x ≠ y
this :
  ∀ (R : Type u1) [inst : CommRing R] {M : Type u2} [inst_1 : AddCommGroup M] [inst_2 : Module R M] {A : Type u_1}
    [inst_3 : Semiring A] [inst_4 : Algebra R A] (n : ℕ) (f : Fin n → M) (x y : Fin n),
    f x = f y → x ≠ y → x < y → List.prod (List.ofFn fun i => ↑(ι R) (f i)) = 0
h : ¬x < y
⊢ List.prod (List.ofFn fun i => ↑(ι R) (f i)) = 0
[PROOFSTEP]
exact this R (A := A) n f y x hfxy.symm hxy.symm (hxy.lt_or_lt.resolve_left h)
[GOAL]
R✝ : Type u1
inst✝⁷ : CommRing R✝
M✝ : Type u2
inst✝⁶ : AddCommGroup M✝
inst✝⁵ : Module R✝ M✝
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
n : ℕ
f : Fin n → M
x y : Fin n
hfxy : f x = f y
hxy : x ≠ y
h : x < y
⊢ List.prod (List.ofFn fun i => ↑(ι R) (f i)) = 0
[PROOFSTEP]
clear hxy
[GOAL]
R✝ : Type u1
inst✝⁷ : CommRing R✝
M✝ : Type u2
inst✝⁶ : AddCommGroup M✝
inst✝⁵ : Module R✝ M✝
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
n : ℕ
f : Fin n → M
x y : Fin n
hfxy : f x = f y
h : x < y
⊢ List.prod (List.ofFn fun i => ↑(ι R) (f i)) = 0
[PROOFSTEP]
induction' n with n hn
[GOAL]
case zero
R✝ : Type u1
inst✝⁷ : CommRing R✝
M✝ : Type u2
inst✝⁶ : AddCommGroup M✝
inst✝⁵ : Module R✝ M✝
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
n : ℕ
f✝ : Fin n → M
x✝ y✝ : Fin n
hfxy✝ : f✝ x✝ = f✝ y✝
h✝ : x✝ < y✝
f : Fin Nat.zero → M
x y : Fin Nat.zero
hfxy : f x = f y
h : x < y
⊢ List.prod (List.ofFn fun i => ↑(ι R) (f i)) = 0
[PROOFSTEP]
exact x.elim0
[GOAL]
case succ
R✝ : Type u1
inst✝⁷ : CommRing R✝
M✝ : Type u2
inst✝⁶ : AddCommGroup M✝
inst✝⁵ : Module R✝ M✝
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
n✝ : ℕ
f✝ : Fin n✝ → M
x✝ y✝ : Fin n✝
hfxy✝ : f✝ x✝ = f✝ y✝
h✝ : x✝ < y✝
n : ℕ
hn : ∀ (f : Fin n → M) (x y : Fin n), f x = f y → x < y → List.prod (List.ofFn fun i => ↑(ι R) (f i)) = 0
f : Fin (Nat.succ n) → M
x y : Fin (Nat.succ n)
hfxy : f x = f y
h : x < y
⊢ List.prod (List.ofFn fun i => ↑(ι R) (f i)) = 0
[PROOFSTEP]
rw [List.ofFn_succ, List.prod_cons]
[GOAL]
case succ
R✝ : Type u1
inst✝⁷ : CommRing R✝
M✝ : Type u2
inst✝⁶ : AddCommGroup M✝
inst✝⁵ : Module R✝ M✝
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
n✝ : ℕ
f✝ : Fin n✝ → M
x✝ y✝ : Fin n✝
hfxy✝ : f✝ x✝ = f✝ y✝
h✝ : x✝ < y✝
n : ℕ
hn : ∀ (f : Fin n → M) (x y : Fin n), f x = f y → x < y → List.prod (List.ofFn fun i => ↑(ι R) (f i)) = 0
f : Fin (Nat.succ n) → M
x y : Fin (Nat.succ n)
hfxy : f x = f y
h : x < y
⊢ ↑(ι R) (f 0) * List.prod (List.ofFn fun i => ↑(ι R) (f (Fin.succ i))) = 0
[PROOFSTEP]
by_cases hx :
  x =
    0
      -- one of the repeated terms is on the left
[GOAL]
case pos
R✝ : Type u1
inst✝⁷ : CommRing R✝
M✝ : Type u2
inst✝⁶ : AddCommGroup M✝
inst✝⁵ : Module R✝ M✝
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
n✝ : ℕ
f✝ : Fin n✝ → M
x✝ y✝ : Fin n✝
hfxy✝ : f✝ x✝ = f✝ y✝
h✝ : x✝ < y✝
n : ℕ
hn : ∀ (f : Fin n → M) (x y : Fin n), f x = f y → x < y → List.prod (List.ofFn fun i => ↑(ι R) (f i)) = 0
f : Fin (Nat.succ n) → M
x y : Fin (Nat.succ n)
hfxy : f x = f y
h : x < y
hx : x = 0
⊢ ↑(ι R) (f 0) * List.prod (List.ofFn fun i => ↑(ι R) (f (Fin.succ i))) = 0
[PROOFSTEP]
rw [hx] at hfxy h
[GOAL]
case pos
R✝ : Type u1
inst✝⁷ : CommRing R✝
M✝ : Type u2
inst✝⁶ : AddCommGroup M✝
inst✝⁵ : Module R✝ M✝
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
n✝ : ℕ
f✝ : Fin n✝ → M
x✝ y✝ : Fin n✝
hfxy✝ : f✝ x✝ = f✝ y✝
h✝ : x✝ < y✝
n : ℕ
hn : ∀ (f : Fin n → M) (x y : Fin n), f x = f y → x < y → List.prod (List.ofFn fun i => ↑(ι R) (f i)) = 0
f : Fin (Nat.succ n) → M
x y : Fin (Nat.succ n)
hfxy : f 0 = f y
h : 0 < y
hx : x = 0
⊢ ↑(ι R) (f 0) * List.prod (List.ofFn fun i => ↑(ι R) (f (Fin.succ i))) = 0
[PROOFSTEP]
rw [hfxy, ← Fin.succ_pred y (ne_of_lt h).symm]
[GOAL]
case pos
R✝ : Type u1
inst✝⁷ : CommRing R✝
M✝ : Type u2
inst✝⁶ : AddCommGroup M✝
inst✝⁵ : Module R✝ M✝
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
n✝ : ℕ
f✝ : Fin n✝ → M
x✝ y✝ : Fin n✝
hfxy✝ : f✝ x✝ = f✝ y✝
h✝ : x✝ < y✝
n : ℕ
hn : ∀ (f : Fin n → M) (x y : Fin n), f x = f y → x < y → List.prod (List.ofFn fun i => ↑(ι R) (f i)) = 0
f : Fin (Nat.succ n) → M
x y : Fin (Nat.succ n)
hfxy : f 0 = f y
h : 0 < y
hx : x = 0
⊢ ↑(ι R) (f (Fin.succ (Fin.pred y (_ : y ≠ 0)))) * List.prod (List.ofFn fun i => ↑(ι R) (f (Fin.succ i))) = 0
[PROOFSTEP]
exact
  ι_mul_prod_list (f ∘ Fin.succ)
    _
      -- ignore the left-most term and induct on the remaining ones, decrementing indices
[GOAL]
case neg
R✝ : Type u1
inst✝⁷ : CommRing R✝
M✝ : Type u2
inst✝⁶ : AddCommGroup M✝
inst✝⁵ : Module R✝ M✝
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
n✝ : ℕ
f✝ : Fin n✝ → M
x✝ y✝ : Fin n✝
hfxy✝ : f✝ x✝ = f✝ y✝
h✝ : x✝ < y✝
n : ℕ
hn : ∀ (f : Fin n → M) (x y : Fin n), f x = f y → x < y → List.prod (List.ofFn fun i => ↑(ι R) (f i)) = 0
f : Fin (Nat.succ n) → M
x y : Fin (Nat.succ n)
hfxy : f x = f y
h : x < y
hx : ¬x = 0
⊢ ↑(ι R) (f 0) * List.prod (List.ofFn fun i => ↑(ι R) (f (Fin.succ i))) = 0
[PROOFSTEP]
convert mul_zero (ι R (f 0))
[GOAL]
case h.e'_2.h.e'_6
R✝ : Type u1
inst✝⁷ : CommRing R✝
M✝ : Type u2
inst✝⁶ : AddCommGroup M✝
inst✝⁵ : Module R✝ M✝
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
n✝ : ℕ
f✝ : Fin n✝ → M
x✝ y✝ : Fin n✝
hfxy✝ : f✝ x✝ = f✝ y✝
h✝ : x✝ < y✝
n : ℕ
hn : ∀ (f : Fin n → M) (x y : Fin n), f x = f y → x < y → List.prod (List.ofFn fun i => ↑(ι R) (f i)) = 0
f : Fin (Nat.succ n) → M
x y : Fin (Nat.succ n)
hfxy : f x = f y
h : x < y
hx : ¬x = 0
⊢ List.prod (List.ofFn fun i => ↑(ι R) (f (Fin.succ i))) = 0
[PROOFSTEP]
refine'
  hn (fun i => f <| Fin.succ i) (x.pred hx) (y.pred (ne_of_lt <| lt_of_le_of_lt x.zero_le h).symm) _
    (Fin.pred_lt_pred_iff.mpr h)
[GOAL]
case h.e'_2.h.e'_6
R✝ : Type u1
inst✝⁷ : CommRing R✝
M✝ : Type u2
inst✝⁶ : AddCommGroup M✝
inst✝⁵ : Module R✝ M✝
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
n✝ : ℕ
f✝ : Fin n✝ → M
x✝ y✝ : Fin n✝
hfxy✝ : f✝ x✝ = f✝ y✝
h✝ : x✝ < y✝
n : ℕ
hn : ∀ (f : Fin n → M) (x y : Fin n), f x = f y → x < y → List.prod (List.ofFn fun i => ↑(ι R) (f i)) = 0
f : Fin (Nat.succ n) → M
x y : Fin (Nat.succ n)
hfxy : f x = f y
h : x < y
hx : ¬x = 0
⊢ (fun i => f (Fin.succ i)) (Fin.pred x hx) = (fun i => f (Fin.succ i)) (Fin.pred y (_ : y ≠ 0))
[PROOFSTEP]
simp only [Fin.succ_pred]
[GOAL]
case h.e'_2.h.e'_6
R✝ : Type u1
inst✝⁷ : CommRing R✝
M✝ : Type u2
inst✝⁶ : AddCommGroup M✝
inst✝⁵ : Module R✝ M✝
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
n✝ : ℕ
f✝ : Fin n✝ → M
x✝ y✝ : Fin n✝
hfxy✝ : f✝ x✝ = f✝ y✝
h✝ : x✝ < y✝
n : ℕ
hn : ∀ (f : Fin n → M) (x y : Fin n), f x = f y → x < y → List.prod (List.ofFn fun i => ↑(ι R) (f i)) = 0
f : Fin (Nat.succ n) → M
x y : Fin (Nat.succ n)
hfxy : f x = f y
h : x < y
hx : ¬x = 0
⊢ f x = f y
[PROOFSTEP]
exact hfxy
[GOAL]
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
n : ℕ
m : M
v : Fin n → M
⊢ ↑(ι R) (Matrix.vecCons m v 0) * ↑(ιMulti R n) (Matrix.vecTail (Matrix.vecCons m v)) =
    ↑(↑(LinearMap.compAlternatingMap (LinearMap.mulLeft R (↑(ι R) m))) (ιMulti R n)) v
[PROOFSTEP]
simp_rw [Matrix.tail_cons]
[GOAL]
R : Type u1
inst✝⁴ : CommRing R
M : Type u2
inst✝³ : AddCommGroup M
inst✝² : Module R M
A : Type u_1
inst✝¹ : Semiring A
inst✝ : Algebra R A
n : ℕ
m : M
v : Fin n → M
⊢ ↑(ι R) (Matrix.vecCons m v 0) * ↑(ιMulti R n) v =
    ↑(↑(LinearMap.compAlternatingMap (LinearMap.mulLeft R (↑(ι R) m))) (ιMulti R n)) v
[PROOFSTEP]
rfl
[GOAL]
R : Type u1
inst✝² : CommRing R
M : Type u2
inst✝¹ : AddCommGroup M
inst✝ : Module R M
m : M
⊢ ↑toExterior (↑(ι R) m) = ↑(ExteriorAlgebra.ι R) m
[PROOFSTEP]
simp [toExterior]