Theorem: Orientation.volumeForm_map
File: Mathlib/Analysis/InnerProductSpace/Orientation.lean

tactic: cases' n with n
state_before: E : Type u_2
inst✝⁴ : NormedAddCommGroup E
inst✝³ : InnerProductSpace ℝ E
n : ℕ
_i : Fact (finrank ℝ E = n)
o : Orientation ℝ E (Fin n)
F : Type u_1
inst✝² : NormedAddCommGroup F
inst✝¹ : InnerProductSpace ℝ F
inst✝ : Fact (finrank ℝ F = n)
φ : E ≃ₗᵢ[ℝ] F
x : Fin n → F
⊢ ↑(volumeForm (↑(map (Fin n) φ.toLinearEquiv) o)) x = ↑(volumeForm o) (↑(LinearIsometryEquiv.symm φ) ∘ x)

tactic: let e : OrthonormalBasis (Fin n.succ) ℝ E := o.finOrthonormalBasis n.succ_pos Fact.out
state_before: case succ
E : Type u_2
inst✝⁴ : NormedAddCommGroup E
inst✝³ : InnerProductSpace ℝ E
F : Type u_1
inst✝² : NormedAddCommGroup F
inst✝¹ : InnerProductSpace ℝ F
φ : E ≃ₗᵢ[ℝ] F
n : ℕ
_i : Fact (finrank ℝ E = Nat.succ n)
o : Orientation ℝ E (Fin (Nat.succ n))
inst✝ : Fact (finrank ℝ F = Nat.succ n)
x : Fin (Nat.succ n) → F
⊢ ↑(volumeForm (↑(map (Fin (Nat.succ n)) φ.toLinearEquiv) o)) x = ↑(volumeForm o) (↑(LinearIsometryEquiv.symm φ) ∘ x)

tactic: have he : e.toBasis.orientation = o :=
  o.finOrthonormalBasis_orientation n.succ_pos Fact.out
state_before: case succ
E : Type u_2
inst✝⁴ : NormedAddCommGroup E
inst✝³ : InnerProductSpace ℝ E
F : Type u_1
inst✝² : NormedAddCommGroup F
inst✝¹ : InnerProductSpace ℝ F
φ : E ≃ₗᵢ[ℝ] F
n : ℕ
_i : Fact (finrank ℝ E = Nat.succ n)
o : Orientation ℝ E (Fin (Nat.succ n))
inst✝ : Fact (finrank ℝ F = Nat.succ n)
x : Fin (Nat.succ n) → F
e : OrthonormalBasis (Fin (Nat.succ n)) ℝ E :=
  Orientation.finOrthonormalBasis (_ : 0 < Nat.succ n) (_ : finrank ℝ E = Nat.succ n) o
⊢ ↑(volumeForm (↑(map (Fin (Nat.succ n)) φ.toLinearEquiv) o)) x = ↑(volumeForm o) (↑(LinearIsometryEquiv.symm φ) ∘ x)

tactic: have heφ : (e.map φ).toBasis.orientation = Orientation.map (Fin n.succ) φ.toLinearEquiv o := by
  rw [← he]
  exact e.toBasis.orientation_map φ.toLinearEquiv
state_before: case succ
E : Type u_2
inst✝⁴ : NormedAddCommGroup E
inst✝³ : InnerProductSpace ℝ E
F : Type u_1
inst✝² : NormedAddCommGroup F
inst✝¹ : InnerProductSpace ℝ F
φ : E ≃ₗᵢ[ℝ] F
n : ℕ
_i : Fact (finrank ℝ E = Nat.succ n)
o : Orientation ℝ E (Fin (Nat.succ n))
inst✝ : Fact (finrank ℝ F = Nat.succ n)
x : Fin (Nat.succ n) → F
e : OrthonormalBasis (Fin (Nat.succ n)) ℝ E :=
  Orientation.finOrthonormalBasis (_ : 0 < Nat.succ n) (_ : finrank ℝ E = Nat.succ n) o
he : Basis.orientation (OrthonormalBasis.toBasis e) = o
⊢ ↑(volumeForm (↑(map (Fin (Nat.succ n)) φ.toLinearEquiv) o)) x = ↑(volumeForm o) (↑(LinearIsometryEquiv.symm φ) ∘ x)

tactic: rw [(Orientation.map (Fin n.succ) φ.toLinearEquiv o).volumeForm_robust (e.map φ) heφ]
state_before: case succ
E : Type u_2
inst✝⁴ : NormedAddCommGroup E
inst✝³ : InnerProductSpace ℝ E
F : Type u_1
inst✝² : NormedAddCommGroup F
inst✝¹ : InnerProductSpace ℝ F
φ : E ≃ₗᵢ[ℝ] F
n : ℕ
_i : Fact (finrank ℝ E = Nat.succ n)
o : Orientation ℝ E (Fin (Nat.succ n))
inst✝ : Fact (finrank ℝ F = Nat.succ n)
x : Fin (Nat.succ n) → F
e : OrthonormalBasis (Fin (Nat.succ n)) ℝ E :=
  Orientation.finOrthonormalBasis (_ : 0 < Nat.succ n) (_ : finrank ℝ E = Nat.succ n) o
he : Basis.orientation (OrthonormalBasis.toBasis e) = o
heφ :
  Basis.orientation (OrthonormalBasis.toBasis (OrthonormalBasis.map e φ)) = ↑(map (Fin (Nat.succ n)) φ.toLinearEquiv) o
⊢ ↑(volumeForm (↑(map (Fin (Nat.succ n)) φ.toLinearEquiv) o)) x = ↑(volumeForm o) (↑(LinearIsometryEquiv.symm φ) ∘ x)

tactic: rw [o.volumeForm_robust e he]
state_before: case succ
E : Type u_2
inst✝⁴ : NormedAddCommGroup E
inst✝³ : InnerProductSpace ℝ E
F : Type u_1
inst✝² : NormedAddCommGroup F
inst✝¹ : InnerProductSpace ℝ F
φ : E ≃ₗᵢ[ℝ] F
n : ℕ
_i : Fact (finrank ℝ E = Nat.succ n)
o : Orientation ℝ E (Fin (Nat.succ n))
inst✝ : Fact (finrank ℝ F = Nat.succ n)
x : Fin (Nat.succ n) → F
e : OrthonormalBasis (Fin (Nat.succ n)) ℝ E :=
  Orientation.finOrthonormalBasis (_ : 0 < Nat.succ n) (_ : finrank ℝ E = Nat.succ n) o
he : Basis.orientation (OrthonormalBasis.toBasis e) = o
heφ :
  Basis.orientation (OrthonormalBasis.toBasis (OrthonormalBasis.map e φ)) = ↑(map (Fin (Nat.succ n)) φ.toLinearEquiv) o
⊢ ↑(Basis.det (OrthonormalBasis.toBasis (OrthonormalBasis.map e φ))) x =
    ↑(volumeForm o) (↑(LinearIsometryEquiv.symm φ) ∘ x)

tactic: simp
state_before: case succ
E : Type u_2
inst✝⁴ : NormedAddCommGroup E
inst✝³ : InnerProductSpace ℝ E
F : Type u_1
inst✝² : NormedAddCommGroup F
inst✝¹ : InnerProductSpace ℝ F
φ : E ≃ₗᵢ[ℝ] F
n : ℕ
_i : Fact (finrank ℝ E = Nat.succ n)
o : Orientation ℝ E (Fin (Nat.succ n))
inst✝ : Fact (finrank ℝ F = Nat.succ n)
x : Fin (Nat.succ n) → F
e : OrthonormalBasis (Fin (Nat.succ n)) ℝ E :=
  Orientation.finOrthonormalBasis (_ : 0 < Nat.succ n) (_ : finrank ℝ E = Nat.succ n) o
he : Basis.orientation (OrthonormalBasis.toBasis e) = o
heφ :
  Basis.orientation (OrthonormalBasis.toBasis (OrthonormalBasis.map e φ)) = ↑(map (Fin (Nat.succ n)) φ.toLinearEquiv) o
⊢ ↑(Basis.det (OrthonormalBasis.toBasis (OrthonormalBasis.map e φ))) x =
    ↑(Basis.det (OrthonormalBasis.toBasis e)) (↑(LinearIsometryEquiv.symm φ) ∘ x)

tactic: refine' o.eq_or_eq_neg_of_isEmpty.elim _ _ <;> rintro rfl <;> simp
state_before: case zero
E : Type u_2
inst✝⁴ : NormedAddCommGroup E
inst✝³ : InnerProductSpace ℝ E
F : Type u_1
inst✝² : NormedAddCommGroup F
inst✝¹ : InnerProductSpace ℝ F
φ : E ≃ₗᵢ[ℝ] F
_i : Fact (finrank ℝ E = Nat.zero)
o : Orientation ℝ E (Fin Nat.zero)
inst✝ : Fact (finrank ℝ F = Nat.zero)
x : Fin Nat.zero → F
⊢ ↑(volumeForm (↑(map (Fin Nat.zero) φ.toLinearEquiv) o)) x = ↑(volumeForm o) (↑(LinearIsometryEquiv.symm φ) ∘ x)

tactic: rw [← he]
state_before: E : Type u_2
inst✝⁴ : NormedAddCommGroup E
inst✝³ : InnerProductSpace ℝ E
F : Type u_1
inst✝² : NormedAddCommGroup F
inst✝¹ : InnerProductSpace ℝ F
φ : E ≃ₗᵢ[ℝ] F
n : ℕ
_i : Fact (finrank ℝ E = Nat.succ n)
o : Orientation ℝ E (Fin (Nat.succ n))
inst✝ : Fact (finrank ℝ F = Nat.succ n)
x : Fin (Nat.succ n) → F
e : OrthonormalBasis (Fin (Nat.succ n)) ℝ E :=
  Orientation.finOrthonormalBasis (_ : 0 < Nat.succ n) (_ : finrank ℝ E = Nat.succ n) o
he : Basis.orientation (OrthonormalBasis.toBasis e) = o
⊢ Basis.orientation (OrthonormalBasis.toBasis (OrthonormalBasis.map e φ)) = ↑(map (Fin (Nat.succ n)) φ.toLinearEquiv) o

tactic: exact e.toBasis.orientation_map φ.toLinearEquiv
state_before: E : Type u_2
inst✝⁴ : NormedAddCommGroup E
inst✝³ : InnerProductSpace ℝ E
F : Type u_1
inst✝² : NormedAddCommGroup F
inst✝¹ : InnerProductSpace ℝ F
φ : E ≃ₗᵢ[ℝ] F
n : ℕ
_i : Fact (finrank ℝ E = Nat.succ n)
o : Orientation ℝ E (Fin (Nat.succ n))
inst✝ : Fact (finrank ℝ F = Nat.succ n)
x : Fin (Nat.succ n) → F
e : OrthonormalBasis (Fin (Nat.succ n)) ℝ E :=
  Orientation.finOrthonormalBasis (_ : 0 < Nat.succ n) (_ : finrank ℝ E = Nat.succ n) o
he : Basis.orientation (OrthonormalBasis.toBasis e) = o
⊢ Basis.orientation (OrthonormalBasis.toBasis (OrthonormalBasis.map e φ)) =
    ↑(map (Fin (Nat.succ n)) φ.toLinearEquiv) (Basis.orientation (OrthonormalBasis.toBasis e))