[GOAL]
R : Type u_1
S : Type u_2
inst✝¹⁴ : CommRing R
inst✝¹³ : CommRing S
inst✝¹² : Algebra R S
Rₘ : Type u_3
Sₘ : Type u_4
inst✝¹¹ : CommRing Rₘ
inst✝¹⁰ : Algebra R Rₘ
inst✝⁹ : CommRing Sₘ
inst✝⁸ : Algebra S Sₘ
M : Submonoid R
inst✝⁷ : IsLocalization M Rₘ
inst✝⁶ : IsLocalization (algebraMapSubmonoid S M) Sₘ
inst✝⁵ : Algebra Rₘ Sₘ
inst✝⁴ : Algebra R Sₘ
inst✝³ : IsScalarTower R Rₘ Sₘ
inst✝² : IsScalarTower R S Sₘ
ι : Type u_5
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
b : Basis ι R S
a : S
⊢ ↑(RingHom.mapMatrix (algebraMap R Rₘ)) (↑(leftMulMatrix b) a) =
    ↑(leftMulMatrix (Basis.localizationLocalization Rₘ M Sₘ b)) (↑(algebraMap S Sₘ) a)
[PROOFSTEP]
ext i j
[GOAL]
case a.h
R : Type u_1
S : Type u_2
inst✝¹⁴ : CommRing R
inst✝¹³ : CommRing S
inst✝¹² : Algebra R S
Rₘ : Type u_3
Sₘ : Type u_4
inst✝¹¹ : CommRing Rₘ
inst✝¹⁰ : Algebra R Rₘ
inst✝⁹ : CommRing Sₘ
inst✝⁸ : Algebra S Sₘ
M : Submonoid R
inst✝⁷ : IsLocalization M Rₘ
inst✝⁶ : IsLocalization (algebraMapSubmonoid S M) Sₘ
inst✝⁵ : Algebra Rₘ Sₘ
inst✝⁴ : Algebra R Sₘ
inst✝³ : IsScalarTower R Rₘ Sₘ
inst✝² : IsScalarTower R S Sₘ
ι : Type u_5
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
b : Basis ι R S
a : S
i j : ι
⊢ ↑(RingHom.mapMatrix (algebraMap R Rₘ)) (↑(leftMulMatrix b) a) i j =
    ↑(leftMulMatrix (Basis.localizationLocalization Rₘ M Sₘ b)) (↑(algebraMap S Sₘ) a) i j
[PROOFSTEP]
simp only [Matrix.map_apply, RingHom.mapMatrix_apply, leftMulMatrix_eq_repr_mul, ← map_mul,
  Basis.localizationLocalization_apply, Basis.localizationLocalization_repr_algebraMap]
[GOAL]
R : Type u_1
S : Type u_2
inst✝¹⁴ : CommRing R
inst✝¹³ : CommRing S
inst✝¹² : Algebra R S
Rₘ : Type u_3
Sₘ : Type u_4
inst✝¹¹ : CommRing Rₘ
inst✝¹⁰ : Algebra R Rₘ
inst✝⁹ : CommRing Sₘ
inst✝⁸ : Algebra S Sₘ
M : Submonoid R
inst✝⁷ : IsLocalization M Rₘ
inst✝⁶ : IsLocalization (algebraMapSubmonoid S M) Sₘ
inst✝⁵ : Algebra Rₘ Sₘ
inst✝⁴ : Algebra R Sₘ
inst✝³ : IsScalarTower R Rₘ Sₘ
inst✝² : IsScalarTower R S Sₘ
inst✝¹ : Module.Free R S
inst✝ : Module.Finite R S
a : S
⊢ ↑(norm Rₘ) (↑(algebraMap S Sₘ) a) = ↑(algebraMap R Rₘ) (↑(norm R) a)
[PROOFSTEP]
cases subsingleton_or_nontrivial R
[GOAL]
case inl
R : Type u_1
S : Type u_2
inst✝¹⁴ : CommRing R
inst✝¹³ : CommRing S
inst✝¹² : Algebra R S
Rₘ : Type u_3
Sₘ : Type u_4
inst✝¹¹ : CommRing Rₘ
inst✝¹⁰ : Algebra R Rₘ
inst✝⁹ : CommRing Sₘ
inst✝⁸ : Algebra S Sₘ
M : Submonoid R
inst✝⁷ : IsLocalization M Rₘ
inst✝⁶ : IsLocalization (algebraMapSubmonoid S M) Sₘ
inst✝⁵ : Algebra Rₘ Sₘ
inst✝⁴ : Algebra R Sₘ
inst✝³ : IsScalarTower R Rₘ Sₘ
inst✝² : IsScalarTower R S Sₘ
inst✝¹ : Module.Free R S
inst✝ : Module.Finite R S
a : S
h✝ : Subsingleton R
⊢ ↑(norm Rₘ) (↑(algebraMap S Sₘ) a) = ↑(algebraMap R Rₘ) (↑(norm R) a)
[PROOFSTEP]
haveI : Subsingleton Rₘ := Module.subsingleton R Rₘ
[GOAL]
case inl
R : Type u_1
S : Type u_2
inst✝¹⁴ : CommRing R
inst✝¹³ : CommRing S
inst✝¹² : Algebra R S
Rₘ : Type u_3
Sₘ : Type u_4
inst✝¹¹ : CommRing Rₘ
inst✝¹⁰ : Algebra R Rₘ
inst✝⁹ : CommRing Sₘ
inst✝⁸ : Algebra S Sₘ
M : Submonoid R
inst✝⁷ : IsLocalization M Rₘ
inst✝⁶ : IsLocalization (algebraMapSubmonoid S M) Sₘ
inst✝⁵ : Algebra Rₘ Sₘ
inst✝⁴ : Algebra R Sₘ
inst✝³ : IsScalarTower R Rₘ Sₘ
inst✝² : IsScalarTower R S Sₘ
inst✝¹ : Module.Free R S
inst✝ : Module.Finite R S
a : S
h✝ : Subsingleton R
this : Subsingleton Rₘ
⊢ ↑(norm Rₘ) (↑(algebraMap S Sₘ) a) = ↑(algebraMap R Rₘ) (↑(norm R) a)
[PROOFSTEP]
simp
[GOAL]
case inr
R : Type u_1
S : Type u_2
inst✝¹⁴ : CommRing R
inst✝¹³ : CommRing S
inst✝¹² : Algebra R S
Rₘ : Type u_3
Sₘ : Type u_4
inst✝¹¹ : CommRing Rₘ
inst✝¹⁰ : Algebra R Rₘ
inst✝⁹ : CommRing Sₘ
inst✝⁸ : Algebra S Sₘ
M : Submonoid R
inst✝⁷ : IsLocalization M Rₘ
inst✝⁶ : IsLocalization (algebraMapSubmonoid S M) Sₘ
inst✝⁵ : Algebra Rₘ Sₘ
inst✝⁴ : Algebra R Sₘ
inst✝³ : IsScalarTower R Rₘ Sₘ
inst✝² : IsScalarTower R S Sₘ
inst✝¹ : Module.Free R S
inst✝ : Module.Finite R S
a : S
h✝ : Nontrivial R
⊢ ↑(norm Rₘ) (↑(algebraMap S Sₘ) a) = ↑(algebraMap R Rₘ) (↑(norm R) a)
[PROOFSTEP]
let b := Module.Free.chooseBasis R S
[GOAL]
case inr
R : Type u_1
S : Type u_2
inst✝¹⁴ : CommRing R
inst✝¹³ : CommRing S
inst✝¹² : Algebra R S
Rₘ : Type u_3
Sₘ : Type u_4
inst✝¹¹ : CommRing Rₘ
inst✝¹⁰ : Algebra R Rₘ
inst✝⁹ : CommRing Sₘ
inst✝⁸ : Algebra S Sₘ
M : Submonoid R
inst✝⁷ : IsLocalization M Rₘ
inst✝⁶ : IsLocalization (algebraMapSubmonoid S M) Sₘ
inst✝⁵ : Algebra Rₘ Sₘ
inst✝⁴ : Algebra R Sₘ
inst✝³ : IsScalarTower R Rₘ Sₘ
inst✝² : IsScalarTower R S Sₘ
inst✝¹ : Module.Free R S
inst✝ : Module.Finite R S
a : S
h✝ : Nontrivial R
b : Basis (Module.Free.ChooseBasisIndex R S) R S := Module.Free.chooseBasis R S
⊢ ↑(norm Rₘ) (↑(algebraMap S Sₘ) a) = ↑(algebraMap R Rₘ) (↑(norm R) a)
[PROOFSTEP]
letI := Classical.decEq (Module.Free.ChooseBasisIndex R S)
[GOAL]
case inr
R : Type u_1
S : Type u_2
inst✝¹⁴ : CommRing R
inst✝¹³ : CommRing S
inst✝¹² : Algebra R S
Rₘ : Type u_3
Sₘ : Type u_4
inst✝¹¹ : CommRing Rₘ
inst✝¹⁰ : Algebra R Rₘ
inst✝⁹ : CommRing Sₘ
inst✝⁸ : Algebra S Sₘ
M : Submonoid R
inst✝⁷ : IsLocalization M Rₘ
inst✝⁶ : IsLocalization (algebraMapSubmonoid S M) Sₘ
inst✝⁵ : Algebra Rₘ Sₘ
inst✝⁴ : Algebra R Sₘ
inst✝³ : IsScalarTower R Rₘ Sₘ
inst✝² : IsScalarTower R S Sₘ
inst✝¹ : Module.Free R S
inst✝ : Module.Finite R S
a : S
h✝ : Nontrivial R
b : Basis (Module.Free.ChooseBasisIndex R S) R S := Module.Free.chooseBasis R S
this : DecidableEq (Module.Free.ChooseBasisIndex R S) := Classical.decEq (Module.Free.ChooseBasisIndex R S)
⊢ ↑(norm Rₘ) (↑(algebraMap S Sₘ) a) = ↑(algebraMap R Rₘ) (↑(norm R) a)
[PROOFSTEP]
rw [Algebra.norm_eq_matrix_det (b.localizationLocalization Rₘ M Sₘ), Algebra.norm_eq_matrix_det b, RingHom.map_det, ←
  Algebra.map_leftMulMatrix_localization]
[GOAL]
R : Type u_1
S : Type u_2
inst✝¹⁴ : CommRing R
inst✝¹³ : CommRing S
inst✝¹² : Algebra R S
Rₘ : Type u_3
Sₘ : Type u_4
inst✝¹¹ : CommRing Rₘ
inst✝¹⁰ : Algebra R Rₘ
inst✝⁹ : CommRing Sₘ
inst✝⁸ : Algebra S Sₘ
M : Submonoid R
inst✝⁷ : IsLocalization M Rₘ
inst✝⁶ : IsLocalization (algebraMapSubmonoid S M) Sₘ
inst✝⁵ : Algebra Rₘ Sₘ
inst✝⁴ : Algebra R Sₘ
inst✝³ : IsScalarTower R Rₘ Sₘ
inst✝² : IsScalarTower R S Sₘ
inst✝¹ : Module.Free R S
inst✝ : Module.Finite R S
a : S
⊢ ↑(trace Rₘ Sₘ) (↑(algebraMap S Sₘ) a) = ↑(algebraMap R Rₘ) (↑(trace R S) a)
[PROOFSTEP]
cases subsingleton_or_nontrivial R
[GOAL]
case inl
R : Type u_1
S : Type u_2
inst✝¹⁴ : CommRing R
inst✝¹³ : CommRing S
inst✝¹² : Algebra R S
Rₘ : Type u_3
Sₘ : Type u_4
inst✝¹¹ : CommRing Rₘ
inst✝¹⁰ : Algebra R Rₘ
inst✝⁹ : CommRing Sₘ
inst✝⁸ : Algebra S Sₘ
M : Submonoid R
inst✝⁷ : IsLocalization M Rₘ
inst✝⁶ : IsLocalization (algebraMapSubmonoid S M) Sₘ
inst✝⁵ : Algebra Rₘ Sₘ
inst✝⁴ : Algebra R Sₘ
inst✝³ : IsScalarTower R Rₘ Sₘ
inst✝² : IsScalarTower R S Sₘ
inst✝¹ : Module.Free R S
inst✝ : Module.Finite R S
a : S
h✝ : Subsingleton R
⊢ ↑(trace Rₘ Sₘ) (↑(algebraMap S Sₘ) a) = ↑(algebraMap R Rₘ) (↑(trace R S) a)
[PROOFSTEP]
haveI : Subsingleton Rₘ := Module.subsingleton R Rₘ
[GOAL]
case inl
R : Type u_1
S : Type u_2
inst✝¹⁴ : CommRing R
inst✝¹³ : CommRing S
inst✝¹² : Algebra R S
Rₘ : Type u_3
Sₘ : Type u_4
inst✝¹¹ : CommRing Rₘ
inst✝¹⁰ : Algebra R Rₘ
inst✝⁹ : CommRing Sₘ
inst✝⁸ : Algebra S Sₘ
M : Submonoid R
inst✝⁷ : IsLocalization M Rₘ
inst✝⁶ : IsLocalization (algebraMapSubmonoid S M) Sₘ
inst✝⁵ : Algebra Rₘ Sₘ
inst✝⁴ : Algebra R Sₘ
inst✝³ : IsScalarTower R Rₘ Sₘ
inst✝² : IsScalarTower R S Sₘ
inst✝¹ : Module.Free R S
inst✝ : Module.Finite R S
a : S
h✝ : Subsingleton R
this : Subsingleton Rₘ
⊢ ↑(trace Rₘ Sₘ) (↑(algebraMap S Sₘ) a) = ↑(algebraMap R Rₘ) (↑(trace R S) a)
[PROOFSTEP]
simp
[GOAL]
case inr
R : Type u_1
S : Type u_2
inst✝¹⁴ : CommRing R
inst✝¹³ : CommRing S
inst✝¹² : Algebra R S
Rₘ : Type u_3
Sₘ : Type u_4
inst✝¹¹ : CommRing Rₘ
inst✝¹⁰ : Algebra R Rₘ
inst✝⁹ : CommRing Sₘ
inst✝⁸ : Algebra S Sₘ
M : Submonoid R
inst✝⁷ : IsLocalization M Rₘ
inst✝⁶ : IsLocalization (algebraMapSubmonoid S M) Sₘ
inst✝⁵ : Algebra Rₘ Sₘ
inst✝⁴ : Algebra R Sₘ
inst✝³ : IsScalarTower R Rₘ Sₘ
inst✝² : IsScalarTower R S Sₘ
inst✝¹ : Module.Free R S
inst✝ : Module.Finite R S
a : S
h✝ : Nontrivial R
⊢ ↑(trace Rₘ Sₘ) (↑(algebraMap S Sₘ) a) = ↑(algebraMap R Rₘ) (↑(trace R S) a)
[PROOFSTEP]
let b := Module.Free.chooseBasis R S
[GOAL]
case inr
R : Type u_1
S : Type u_2
inst✝¹⁴ : CommRing R
inst✝¹³ : CommRing S
inst✝¹² : Algebra R S
Rₘ : Type u_3
Sₘ : Type u_4
inst✝¹¹ : CommRing Rₘ
inst✝¹⁰ : Algebra R Rₘ
inst✝⁹ : CommRing Sₘ
inst✝⁸ : Algebra S Sₘ
M : Submonoid R
inst✝⁷ : IsLocalization M Rₘ
inst✝⁶ : IsLocalization (algebraMapSubmonoid S M) Sₘ
inst✝⁵ : Algebra Rₘ Sₘ
inst✝⁴ : Algebra R Sₘ
inst✝³ : IsScalarTower R Rₘ Sₘ
inst✝² : IsScalarTower R S Sₘ
inst✝¹ : Module.Free R S
inst✝ : Module.Finite R S
a : S
h✝ : Nontrivial R
b : Basis (Module.Free.ChooseBasisIndex R S) R S := Module.Free.chooseBasis R S
⊢ ↑(trace Rₘ Sₘ) (↑(algebraMap S Sₘ) a) = ↑(algebraMap R Rₘ) (↑(trace R S) a)
[PROOFSTEP]
letI := Classical.decEq (Module.Free.ChooseBasisIndex R S)
[GOAL]
case inr
R : Type u_1
S : Type u_2
inst✝¹⁴ : CommRing R
inst✝¹³ : CommRing S
inst✝¹² : Algebra R S
Rₘ : Type u_3
Sₘ : Type u_4
inst✝¹¹ : CommRing Rₘ
inst✝¹⁰ : Algebra R Rₘ
inst✝⁹ : CommRing Sₘ
inst✝⁸ : Algebra S Sₘ
M : Submonoid R
inst✝⁷ : IsLocalization M Rₘ
inst✝⁶ : IsLocalization (algebraMapSubmonoid S M) Sₘ
inst✝⁵ : Algebra Rₘ Sₘ
inst✝⁴ : Algebra R Sₘ
inst✝³ : IsScalarTower R Rₘ Sₘ
inst✝² : IsScalarTower R S Sₘ
inst✝¹ : Module.Free R S
inst✝ : Module.Finite R S
a : S
h✝ : Nontrivial R
b : Basis (Module.Free.ChooseBasisIndex R S) R S := Module.Free.chooseBasis R S
this : DecidableEq (Module.Free.ChooseBasisIndex R S) := Classical.decEq (Module.Free.ChooseBasisIndex R S)
⊢ ↑(trace Rₘ Sₘ) (↑(algebraMap S Sₘ) a) = ↑(algebraMap R Rₘ) (↑(trace R S) a)
[PROOFSTEP]
rw [Algebra.trace_eq_matrix_trace (b.localizationLocalization Rₘ M Sₘ), Algebra.trace_eq_matrix_trace b, ←
  Algebra.map_leftMulMatrix_localization]
[GOAL]
case inr
R : Type u_1
S : Type u_2
inst✝¹⁴ : CommRing R
inst✝¹³ : CommRing S
inst✝¹² : Algebra R S
Rₘ : Type u_3
Sₘ : Type u_4
inst✝¹¹ : CommRing Rₘ
inst✝¹⁰ : Algebra R Rₘ
inst✝⁹ : CommRing Sₘ
inst✝⁸ : Algebra S Sₘ
M : Submonoid R
inst✝⁷ : IsLocalization M Rₘ
inst✝⁶ : IsLocalization (algebraMapSubmonoid S M) Sₘ
inst✝⁵ : Algebra Rₘ Sₘ
inst✝⁴ : Algebra R Sₘ
inst✝³ : IsScalarTower R Rₘ Sₘ
inst✝² : IsScalarTower R S Sₘ
inst✝¹ : Module.Free R S
inst✝ : Module.Finite R S
a : S
h✝ : Nontrivial R
b : Basis (Module.Free.ChooseBasisIndex R S) R S := Module.Free.chooseBasis R S
this : DecidableEq (Module.Free.ChooseBasisIndex R S) := Classical.decEq (Module.Free.ChooseBasisIndex R S)
⊢ Matrix.trace (↑(RingHom.mapMatrix (algebraMap R Rₘ)) (↑(leftMulMatrix b) a)) =
    ↑(algebraMap R Rₘ) (Matrix.trace (↑(leftMulMatrix b) a))
[PROOFSTEP]
exact (AddMonoidHom.map_trace (algebraMap R Rₘ).toAddMonoidHom _).symm
[GOAL]
R : Type u_1
S : Type u_2
inst✝²¹ : CommRing R
inst✝²⁰ : CommRing S
inst✝¹⁹ : Algebra R S
Rₘ : Type u_3
Sₘ✝ : Type u_4
inst✝¹⁸ : CommRing Rₘ
inst✝¹⁷ : Algebra R Rₘ
inst✝¹⁶ : CommRing Sₘ✝
inst✝¹⁵ : Algebra S Sₘ✝
M : Submonoid R
inst✝¹⁴ : IsLocalization M Rₘ
inst✝¹³ : IsLocalization (algebraMapSubmonoid S M) Sₘ✝
inst✝¹² : Algebra Rₘ Sₘ✝
inst✝¹¹ : Algebra R Sₘ✝
inst✝¹⁰ : IsScalarTower R Rₘ Sₘ✝
inst✝⁹ : IsScalarTower R S Sₘ✝
Sₘ : Type u_5
inst✝⁸ : CommRing Sₘ
inst✝⁷ : Algebra S Sₘ
inst✝⁶ : Algebra Rₘ Sₘ
inst✝⁵ : Algebra R Sₘ
inst✝⁴ : IsScalarTower R Rₘ Sₘ
inst✝³ : IsScalarTower R S Sₘ
inst✝² : IsLocalization (algebraMapSubmonoid S M) Sₘ
ι : Type u_6
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
b : Basis ι R S
⊢ traceMatrix Rₘ ↑(Basis.localizationLocalization Rₘ M Sₘ b) = ↑(RingHom.mapMatrix (algebraMap R Rₘ)) (traceMatrix R ↑b)
[PROOFSTEP]
have : Module.Finite R S := Module.Finite.of_basis b
[GOAL]
R : Type u_1
S : Type u_2
inst✝²¹ : CommRing R
inst✝²⁰ : CommRing S
inst✝¹⁹ : Algebra R S
Rₘ : Type u_3
Sₘ✝ : Type u_4
inst✝¹⁸ : CommRing Rₘ
inst✝¹⁷ : Algebra R Rₘ
inst✝¹⁶ : CommRing Sₘ✝
inst✝¹⁵ : Algebra S Sₘ✝
M : Submonoid R
inst✝¹⁴ : IsLocalization M Rₘ
inst✝¹³ : IsLocalization (algebraMapSubmonoid S M) Sₘ✝
inst✝¹² : Algebra Rₘ Sₘ✝
inst✝¹¹ : Algebra R Sₘ✝
inst✝¹⁰ : IsScalarTower R Rₘ Sₘ✝
inst✝⁹ : IsScalarTower R S Sₘ✝
Sₘ : Type u_5
inst✝⁸ : CommRing Sₘ
inst✝⁷ : Algebra S Sₘ
inst✝⁶ : Algebra Rₘ Sₘ
inst✝⁵ : Algebra R Sₘ
inst✝⁴ : IsScalarTower R Rₘ Sₘ
inst✝³ : IsScalarTower R S Sₘ
inst✝² : IsLocalization (algebraMapSubmonoid S M) Sₘ
ι : Type u_6
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
b : Basis ι R S
this : Module.Finite R S
⊢ traceMatrix Rₘ ↑(Basis.localizationLocalization Rₘ M Sₘ b) = ↑(RingHom.mapMatrix (algebraMap R Rₘ)) (traceMatrix R ↑b)
[PROOFSTEP]
have : Module.Free R S := Module.Free.of_basis b
[GOAL]
R : Type u_1
S : Type u_2
inst✝²¹ : CommRing R
inst✝²⁰ : CommRing S
inst✝¹⁹ : Algebra R S
Rₘ : Type u_3
Sₘ✝ : Type u_4
inst✝¹⁸ : CommRing Rₘ
inst✝¹⁷ : Algebra R Rₘ
inst✝¹⁶ : CommRing Sₘ✝
inst✝¹⁵ : Algebra S Sₘ✝
M : Submonoid R
inst✝¹⁴ : IsLocalization M Rₘ
inst✝¹³ : IsLocalization (algebraMapSubmonoid S M) Sₘ✝
inst✝¹² : Algebra Rₘ Sₘ✝
inst✝¹¹ : Algebra R Sₘ✝
inst✝¹⁰ : IsScalarTower R Rₘ Sₘ✝
inst✝⁹ : IsScalarTower R S Sₘ✝
Sₘ : Type u_5
inst✝⁸ : CommRing Sₘ
inst✝⁷ : Algebra S Sₘ
inst✝⁶ : Algebra Rₘ Sₘ
inst✝⁵ : Algebra R Sₘ
inst✝⁴ : IsScalarTower R Rₘ Sₘ
inst✝³ : IsScalarTower R S Sₘ
inst✝² : IsLocalization (algebraMapSubmonoid S M) Sₘ
ι : Type u_6
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
b : Basis ι R S
this✝ : Module.Finite R S
this : Module.Free R S
⊢ traceMatrix Rₘ ↑(Basis.localizationLocalization Rₘ M Sₘ b) = ↑(RingHom.mapMatrix (algebraMap R Rₘ)) (traceMatrix R ↑b)
[PROOFSTEP]
ext i j : 2
[GOAL]
case a.h
R : Type u_1
S : Type u_2
inst✝²¹ : CommRing R
inst✝²⁰ : CommRing S
inst✝¹⁹ : Algebra R S
Rₘ : Type u_3
Sₘ✝ : Type u_4
inst✝¹⁸ : CommRing Rₘ
inst✝¹⁷ : Algebra R Rₘ
inst✝¹⁶ : CommRing Sₘ✝
inst✝¹⁵ : Algebra S Sₘ✝
M : Submonoid R
inst✝¹⁴ : IsLocalization M Rₘ
inst✝¹³ : IsLocalization (algebraMapSubmonoid S M) Sₘ✝
inst✝¹² : Algebra Rₘ Sₘ✝
inst✝¹¹ : Algebra R Sₘ✝
inst✝¹⁰ : IsScalarTower R Rₘ Sₘ✝
inst✝⁹ : IsScalarTower R S Sₘ✝
Sₘ : Type u_5
inst✝⁸ : CommRing Sₘ
inst✝⁷ : Algebra S Sₘ
inst✝⁶ : Algebra Rₘ Sₘ
inst✝⁵ : Algebra R Sₘ
inst✝⁴ : IsScalarTower R Rₘ Sₘ
inst✝³ : IsScalarTower R S Sₘ
inst✝² : IsLocalization (algebraMapSubmonoid S M) Sₘ
ι : Type u_6
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
b : Basis ι R S
this✝ : Module.Finite R S
this : Module.Free R S
i j : ι
⊢ traceMatrix Rₘ (↑(Basis.localizationLocalization Rₘ M Sₘ b)) i j =
    ↑(RingHom.mapMatrix (algebraMap R Rₘ)) (traceMatrix R ↑b) i j
[PROOFSTEP]
simp_rw [RingHom.mapMatrix_apply, Matrix.map_apply, traceMatrix_apply, traceForm_apply,
  Basis.localizationLocalization_apply, ← map_mul]
[GOAL]
case a.h
R : Type u_1
S : Type u_2
inst✝²¹ : CommRing R
inst✝²⁰ : CommRing S
inst✝¹⁹ : Algebra R S
Rₘ : Type u_3
Sₘ✝ : Type u_4
inst✝¹⁸ : CommRing Rₘ
inst✝¹⁷ : Algebra R Rₘ
inst✝¹⁶ : CommRing Sₘ✝
inst✝¹⁵ : Algebra S Sₘ✝
M : Submonoid R
inst✝¹⁴ : IsLocalization M Rₘ
inst✝¹³ : IsLocalization (algebraMapSubmonoid S M) Sₘ✝
inst✝¹² : Algebra Rₘ Sₘ✝
inst✝¹¹ : Algebra R Sₘ✝
inst✝¹⁰ : IsScalarTower R Rₘ Sₘ✝
inst✝⁹ : IsScalarTower R S Sₘ✝
Sₘ : Type u_5
inst✝⁸ : CommRing Sₘ
inst✝⁷ : Algebra S Sₘ
inst✝⁶ : Algebra Rₘ Sₘ
inst✝⁵ : Algebra R Sₘ
inst✝⁴ : IsScalarTower R Rₘ Sₘ
inst✝³ : IsScalarTower R S Sₘ
inst✝² : IsLocalization (algebraMapSubmonoid S M) Sₘ
ι : Type u_6
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
b : Basis ι R S
this✝ : Module.Finite R S
this : Module.Free R S
i j : ι
⊢ ↑(trace Rₘ Sₘ) (↑(algebraMap S Sₘ) (↑b i * ↑b j)) = ↑(algebraMap R Rₘ) (↑(trace R S) (↑b i * ↑b j))
[PROOFSTEP]
exact Algebra.trace_localization R M _
[GOAL]
R : Type u_1
S : Type u_2
inst✝²¹ : CommRing R
inst✝²⁰ : CommRing S
inst✝¹⁹ : Algebra R S
Rₘ : Type u_3
Sₘ✝ : Type u_4
inst✝¹⁸ : CommRing Rₘ
inst✝¹⁷ : Algebra R Rₘ
inst✝¹⁶ : CommRing Sₘ✝
inst✝¹⁵ : Algebra S Sₘ✝
M : Submonoid R
inst✝¹⁴ : IsLocalization M Rₘ
inst✝¹³ : IsLocalization (algebraMapSubmonoid S M) Sₘ✝
inst✝¹² : Algebra Rₘ Sₘ✝
inst✝¹¹ : Algebra R Sₘ✝
inst✝¹⁰ : IsScalarTower R Rₘ Sₘ✝
inst✝⁹ : IsScalarTower R S Sₘ✝
Sₘ : Type u_5
inst✝⁸ : CommRing Sₘ
inst✝⁷ : Algebra S Sₘ
inst✝⁶ : Algebra Rₘ Sₘ
inst✝⁵ : Algebra R Sₘ
inst✝⁴ : IsScalarTower R Rₘ Sₘ
inst✝³ : IsScalarTower R S Sₘ
inst✝² : IsLocalization (algebraMapSubmonoid S M) Sₘ
ι : Type u_6
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
b : Basis ι R S
⊢ discr Rₘ ↑(Basis.localizationLocalization Rₘ M Sₘ b) = ↑(algebraMap R Rₘ) (discr R ↑b)
[PROOFSTEP]
rw [Algebra.discr_def, Algebra.discr_def, RingHom.map_det, Algebra.traceMatrix_localizationLocalization]


[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
as : List α
⊢ 𝓝 as = traverse 𝓝 as
[PROOFSTEP]
refine' nhds_mkOfNhds _ _ _ _
[GOAL]
case refine'_1
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
as : List α
⊢ pure ≤ traverse 𝓝
[PROOFSTEP]
intro l
[GOAL]
case refine'_1
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
as l : List α
⊢ pure l ≤ traverse 𝓝 l
[PROOFSTEP]
induction l
[GOAL]
case refine'_1.nil
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
as : List α
⊢ pure [] ≤ traverse 𝓝 []
case refine'_1.cons
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
as : List α
head✝ : α
tail✝ : List α
tail_ih✝ : pure tail✝ ≤ traverse 𝓝 tail✝
⊢ pure (head✝ :: tail✝) ≤ traverse 𝓝 (head✝ :: tail✝)
[PROOFSTEP]
case nil => exact le_rfl
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
as : List α
⊢ pure [] ≤ traverse 𝓝 []
[PROOFSTEP]
case nil => exact le_rfl
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
as : List α
⊢ pure [] ≤ traverse 𝓝 []
[PROOFSTEP]
exact le_rfl
[GOAL]
case refine'_1.cons
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
as : List α
head✝ : α
tail✝ : List α
tail_ih✝ : pure tail✝ ≤ traverse 𝓝 tail✝
⊢ pure (head✝ :: tail✝) ≤ traverse 𝓝 (head✝ :: tail✝)
[PROOFSTEP]
case cons a l
  ih =>
  suffices List.cons <$> pure a <*> pure l ≤ List.cons <$> 𝓝 a <*> traverse 𝓝 l by simpa only [functor_norm] using this
  exact Filter.seq_mono (Filter.map_mono <| pure_le_nhds a) ih
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
as : List α
a : α
l : List α
ih : pure l ≤ traverse 𝓝 l
⊢ pure (a :: l) ≤ traverse 𝓝 (a :: l)
[PROOFSTEP]
case cons a l
  ih =>
  suffices List.cons <$> pure a <*> pure l ≤ List.cons <$> 𝓝 a <*> traverse 𝓝 l by simpa only [functor_norm] using this
  exact Filter.seq_mono (Filter.map_mono <| pure_le_nhds a) ih
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
as : List α
a : α
l : List α
ih : pure l ≤ traverse 𝓝 l
⊢ pure (a :: l) ≤ traverse 𝓝 (a :: l)
[PROOFSTEP]
suffices List.cons <$> pure a <*> pure l ≤ List.cons <$> 𝓝 a <*> traverse 𝓝 l by simpa only [functor_norm] using this
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
as : List α
a : α
l : List α
ih : pure l ≤ traverse 𝓝 l
this : (Seq.seq (List.cons <$> pure a) fun x => pure l) ≤ Seq.seq (List.cons <$> 𝓝 a) fun x => traverse 𝓝 l
⊢ pure (a :: l) ≤ traverse 𝓝 (a :: l)
[PROOFSTEP]
simpa only [functor_norm] using this
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
as : List α
a : α
l : List α
ih : pure l ≤ traverse 𝓝 l
⊢ (Seq.seq (List.cons <$> pure a) fun x => pure l) ≤ Seq.seq (List.cons <$> 𝓝 a) fun x => traverse 𝓝 l
[PROOFSTEP]
exact Filter.seq_mono (Filter.map_mono <| pure_le_nhds a) ih
[GOAL]
case refine'_2
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
as : List α
⊢ ∀ (a : List α) (s : Set (List α)),
    s ∈ traverse 𝓝 a → ∃ t, t ∈ traverse 𝓝 a ∧ t ⊆ s ∧ ∀ (a' : List α), a' ∈ t → s ∈ traverse 𝓝 a'
[PROOFSTEP]
intro l s hs
[GOAL]
case refine'_2
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
as l : List α
s : Set (List α)
hs : s ∈ traverse 𝓝 l
⊢ ∃ t, t ∈ traverse 𝓝 l ∧ t ⊆ s ∧ ∀ (a' : List α), a' ∈ t → s ∈ traverse 𝓝 a'
[PROOFSTEP]
rcases(mem_traverse_iff _ _).1 hs with ⟨u, hu, hus⟩
[GOAL]
case refine'_2.intro.intro
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
as l : List α
s : Set (List α)
hs : s ∈ traverse 𝓝 l
u : List (Set α)
hu : List.Forall₂ (fun b s => s ∈ 𝓝 b) l u
hus : sequence u ⊆ s
⊢ ∃ t, t ∈ traverse 𝓝 l ∧ t ⊆ s ∧ ∀ (a' : List α), a' ∈ t → s ∈ traverse 𝓝 a'
[PROOFSTEP]
clear as hs
[GOAL]
case refine'_2.intro.intro
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
l : List α
s : Set (List α)
u : List (Set α)
hu : List.Forall₂ (fun b s => s ∈ 𝓝 b) l u
hus : sequence u ⊆ s
⊢ ∃ t, t ∈ traverse 𝓝 l ∧ t ⊆ s ∧ ∀ (a' : List α), a' ∈ t → s ∈ traverse 𝓝 a'
[PROOFSTEP]
have : ∃ v : List (Set α), l.Forall₂ (fun a s => IsOpen s ∧ a ∈ s) v ∧ sequence v ⊆ s
[GOAL]
case this
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
l : List α
s : Set (List α)
u : List (Set α)
hu : List.Forall₂ (fun b s => s ∈ 𝓝 b) l u
hus : sequence u ⊆ s
⊢ ∃ v, List.Forall₂ (fun a s => IsOpen s ∧ a ∈ s) l v ∧ sequence v ⊆ s
case refine'_2.intro.intro
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
l : List α
s : Set (List α)
u : List (Set α)
hu : List.Forall₂ (fun b s => s ∈ 𝓝 b) l u
hus : sequence u ⊆ s
this : ∃ v, List.Forall₂ (fun a s => IsOpen s ∧ a ∈ s) l v ∧ sequence v ⊆ s
⊢ ∃ t, t ∈ traverse 𝓝 l ∧ t ⊆ s ∧ ∀ (a' : List α), a' ∈ t → s ∈ traverse 𝓝 a'
[PROOFSTEP]
induction hu generalizing s
[GOAL]
case this.nil
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
l : List α
u : List (Set α)
s : Set (List α)
hus : sequence [] ⊆ s
⊢ ∃ v, List.Forall₂ (fun a s => IsOpen s ∧ a ∈ s) [] v ∧ sequence v ⊆ s
case this.cons
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
l : List α
u : List (Set α)
a✝² : α
b✝ : Set α
l₁✝ : List α
l₂✝ : List (Set α)
a✝¹ : b✝ ∈ 𝓝 a✝²
a✝ : List.Forall₂ (fun b s => s ∈ 𝓝 b) l₁✝ l₂✝
a_ih✝ : ∀ (s : Set (List α)), sequence l₂✝ ⊆ s → ∃ v, List.Forall₂ (fun a s => IsOpen s ∧ a ∈ s) l₁✝ v ∧ sequence v ⊆ s
s : Set (List α)
hus : sequence (b✝ :: l₂✝) ⊆ s
⊢ ∃ v, List.Forall₂ (fun a s => IsOpen s ∧ a ∈ s) (a✝² :: l₁✝) v ∧ sequence v ⊆ s
case refine'_2.intro.intro
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
l : List α
s : Set (List α)
u : List (Set α)
hu : List.Forall₂ (fun b s => s ∈ 𝓝 b) l u
hus : sequence u ⊆ s
this : ∃ v, List.Forall₂ (fun a s => IsOpen s ∧ a ∈ s) l v ∧ sequence v ⊆ s
⊢ ∃ t, t ∈ traverse 𝓝 l ∧ t ⊆ s ∧ ∀ (a' : List α), a' ∈ t → s ∈ traverse 𝓝 a'
[PROOFSTEP]
case nil _hs =>
  exists []
  simp only [List.forall₂_nil_left_iff, exists_eq_left]
  exact
    ⟨trivial, hus⟩
      -- porting note -- renamed reordered variables based on previous types
[GOAL]
α : Type u_1
β : Type u_2
inst✝ : TopologicalSpace α
_hs : TopologicalSpace β
l : List α
u : List (Set α)
s : Set (List α)
hus : sequence [] ⊆ s
⊢ ∃ v, List.Forall₂ (fun a s => IsOpen s ∧ a ∈ s) [] v ∧ sequence v ⊆ s
[PROOFSTEP]
case nil _hs =>
  exists []
  simp only [List.forall₂_nil_left_iff, exists_eq_left]
  exact
    ⟨trivial, hus⟩
      -- porting note -- renamed reordered variables based on previous types
[GOAL]
α : Type u_1
β : Type u_2
inst✝ : TopologicalSpace α
_hs : TopologicalSpace β
l : List α
u : List (Set α)
s : Set (List α)
hus : sequence [] ⊆ s
⊢ ∃ v, List.Forall₂ (fun a s => IsOpen s ∧ a ∈ s) [] v ∧ sequence v ⊆ s
[PROOFSTEP]
exists []
[GOAL]
α : Type u_1
β : Type u_2
inst✝ : TopologicalSpace α
_hs : TopologicalSpace β
l : List α
u : List (Set α)
s : Set (List α)
hus : sequence [] ⊆ s
⊢ List.Forall₂ (fun a s => IsOpen s ∧ a ∈ s) [] [] ∧ sequence [] ⊆ s
[PROOFSTEP]
simp only [List.forall₂_nil_left_iff, exists_eq_left]
[GOAL]
α : Type u_1
β : Type u_2
inst✝ : TopologicalSpace α
_hs : TopologicalSpace β
l : List α
u : List (Set α)
s : Set (List α)
hus : sequence [] ⊆ s
⊢ True ∧ sequence [] ⊆ s
[PROOFSTEP]
exact
  ⟨trivial, hus⟩
    -- porting note -- renamed reordered variables based on previous types
[GOAL]
case this.cons
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
l : List α
u : List (Set α)
a✝² : α
b✝ : Set α
l₁✝ : List α
l₂✝ : List (Set α)
a✝¹ : b✝ ∈ 𝓝 a✝²
a✝ : List.Forall₂ (fun b s => s ∈ 𝓝 b) l₁✝ l₂✝
a_ih✝ : ∀ (s : Set (List α)), sequence l₂✝ ⊆ s → ∃ v, List.Forall₂ (fun a s => IsOpen s ∧ a ∈ s) l₁✝ v ∧ sequence v ⊆ s
s : Set (List α)
hus : sequence (b✝ :: l₂✝) ⊆ s
⊢ ∃ v, List.Forall₂ (fun a s => IsOpen s ∧ a ∈ s) (a✝² :: l₁✝) v ∧ sequence v ⊆ s
case refine'_2.intro.intro
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
l : List α
s : Set (List α)
u : List (Set α)
hu : List.Forall₂ (fun b s => s ∈ 𝓝 b) l u
hus : sequence u ⊆ s
this : ∃ v, List.Forall₂ (fun a s => IsOpen s ∧ a ∈ s) l v ∧ sequence v ⊆ s
⊢ ∃ t, t ∈ traverse 𝓝 l ∧ t ⊆ s ∧ ∀ (a' : List α), a' ∈ t → s ∈ traverse 𝓝 a'
[PROOFSTEP]
case cons a s as ss hts h ht _ ih =>
  rcases mem_nhds_iff.1 ht with ⟨u, hut, hu⟩
  rcases ih _ Subset.rfl with ⟨v, hv, hvss⟩
  exact ⟨u :: v, List.Forall₂.cons hu hv, Subset.trans (Set.seq_mono (Set.image_subset _ hut) hvss) hus⟩
[GOAL]
α : Type u_1
β : Type u_2
a : TopologicalSpace α
s✝ : TopologicalSpace β
l : List α
u : List (Set α)
as : α
ss : Set α
hts : List α
h : List (Set α)
ht : ss ∈ 𝓝 as
a✝ : List.Forall₂ (fun b s => s ∈ 𝓝 b) hts h
ih : ∀ (s : Set (List α)), sequence h ⊆ s → ∃ v, List.Forall₂ (fun a_1 s => IsOpen s ∧ a_1 ∈ s) hts v ∧ sequence v ⊆ s
s : Set (List α)
hus : sequence (ss :: h) ⊆ s
⊢ ∃ v, List.Forall₂ (fun a_1 s => IsOpen s ∧ a_1 ∈ s) (as :: hts) v ∧ sequence v ⊆ s
[PROOFSTEP]
case cons a s as ss hts h ht _ ih =>
  rcases mem_nhds_iff.1 ht with ⟨u, hut, hu⟩
  rcases ih _ Subset.rfl with ⟨v, hv, hvss⟩
  exact ⟨u :: v, List.Forall₂.cons hu hv, Subset.trans (Set.seq_mono (Set.image_subset _ hut) hvss) hus⟩
[GOAL]
α : Type u_1
β : Type u_2
a : TopologicalSpace α
s✝ : TopologicalSpace β
l : List α
u : List (Set α)
as : α
ss : Set α
hts : List α
h : List (Set α)
ht : ss ∈ 𝓝 as
a✝ : List.Forall₂ (fun b s => s ∈ 𝓝 b) hts h
ih : ∀ (s : Set (List α)), sequence h ⊆ s → ∃ v, List.Forall₂ (fun a_1 s => IsOpen s ∧ a_1 ∈ s) hts v ∧ sequence v ⊆ s
s : Set (List α)
hus : sequence (ss :: h) ⊆ s
⊢ ∃ v, List.Forall₂ (fun a_1 s => IsOpen s ∧ a_1 ∈ s) (as :: hts) v ∧ sequence v ⊆ s
[PROOFSTEP]
rcases mem_nhds_iff.1 ht with ⟨u, hut, hu⟩
[GOAL]
case intro.intro
α : Type u_1
β : Type u_2
a : TopologicalSpace α
s✝ : TopologicalSpace β
l : List α
u✝ : List (Set α)
as : α
ss : Set α
hts : List α
h : List (Set α)
ht : ss ∈ 𝓝 as
a✝ : List.Forall₂ (fun b s => s ∈ 𝓝 b) hts h
ih : ∀ (s : Set (List α)), sequence h ⊆ s → ∃ v, List.Forall₂ (fun a_1 s => IsOpen s ∧ a_1 ∈ s) hts v ∧ sequence v ⊆ s
s : Set (List α)
hus : sequence (ss :: h) ⊆ s
u : Set α
hut : u ⊆ ss
hu : IsOpen u ∧ as ∈ u
⊢ ∃ v, List.Forall₂ (fun a_1 s => IsOpen s ∧ a_1 ∈ s) (as :: hts) v ∧ sequence v ⊆ s
[PROOFSTEP]
rcases ih _ Subset.rfl with ⟨v, hv, hvss⟩
[GOAL]
case intro.intro.intro.intro
α : Type u_1
β : Type u_2
a : TopologicalSpace α
s✝ : TopologicalSpace β
l : List α
u✝ : List (Set α)
as : α
ss : Set α
hts : List α
h : List (Set α)
ht : ss ∈ 𝓝 as
a✝ : List.Forall₂ (fun b s => s ∈ 𝓝 b) hts h
ih : ∀ (s : Set (List α)), sequence h ⊆ s → ∃ v, List.Forall₂ (fun a_1 s => IsOpen s ∧ a_1 ∈ s) hts v ∧ sequence v ⊆ s
s : Set (List α)
hus : sequence (ss :: h) ⊆ s
u : Set α
hut : u ⊆ ss
hu : IsOpen u ∧ as ∈ u
v : List (Set α)
hv : List.Forall₂ (fun a_1 s => IsOpen s ∧ a_1 ∈ s) hts v
hvss : sequence v ⊆ sequence h
⊢ ∃ v, List.Forall₂ (fun a_1 s => IsOpen s ∧ a_1 ∈ s) (as :: hts) v ∧ sequence v ⊆ s
[PROOFSTEP]
exact ⟨u :: v, List.Forall₂.cons hu hv, Subset.trans (Set.seq_mono (Set.image_subset _ hut) hvss) hus⟩
[GOAL]
case refine'_2.intro.intro
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
l : List α
s : Set (List α)
u : List (Set α)
hu : List.Forall₂ (fun b s => s ∈ 𝓝 b) l u
hus : sequence u ⊆ s
this : ∃ v, List.Forall₂ (fun a s => IsOpen s ∧ a ∈ s) l v ∧ sequence v ⊆ s
⊢ ∃ t, t ∈ traverse 𝓝 l ∧ t ⊆ s ∧ ∀ (a' : List α), a' ∈ t → s ∈ traverse 𝓝 a'
[PROOFSTEP]
rcases this with ⟨v, hv, hvs⟩
[GOAL]
case refine'_2.intro.intro.intro.intro
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
l : List α
s : Set (List α)
u : List (Set α)
hu : List.Forall₂ (fun b s => s ∈ 𝓝 b) l u
hus : sequence u ⊆ s
v : List (Set α)
hv : List.Forall₂ (fun a s => IsOpen s ∧ a ∈ s) l v
hvs : sequence v ⊆ s
⊢ ∃ t, t ∈ traverse 𝓝 l ∧ t ⊆ s ∧ ∀ (a' : List α), a' ∈ t → s ∈ traverse 𝓝 a'
[PROOFSTEP]
refine' ⟨sequence v, mem_traverse _ _ _, hvs, _⟩
[GOAL]
case refine'_2.intro.intro.intro.intro.refine'_1
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
l : List α
s : Set (List α)
u : List (Set α)
hu : List.Forall₂ (fun b s => s ∈ 𝓝 b) l u
hus : sequence u ⊆ s
v : List (Set α)
hv : List.Forall₂ (fun a s => IsOpen s ∧ a ∈ s) l v
hvs : sequence v ⊆ s
⊢ List.Forall₂ (fun b c => id c ∈ 𝓝 b) l v
[PROOFSTEP]
exact hv.imp fun a s ⟨hs, ha⟩ => IsOpen.mem_nhds hs ha
[GOAL]
case refine'_2.intro.intro.intro.intro.refine'_2
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
l : List α
s : Set (List α)
u : List (Set α)
hu : List.Forall₂ (fun b s => s ∈ 𝓝 b) l u
hus : sequence u ⊆ s
v : List (Set α)
hv : List.Forall₂ (fun a s => IsOpen s ∧ a ∈ s) l v
hvs : sequence v ⊆ s
⊢ ∀ (a' : List α), a' ∈ sequence v → s ∈ traverse 𝓝 a'
[PROOFSTEP]
intro u hu
[GOAL]
case refine'_2.intro.intro.intro.intro.refine'_2
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
l : List α
s : Set (List α)
u✝ : List (Set α)
hu✝ : List.Forall₂ (fun b s => s ∈ 𝓝 b) l u✝
hus : sequence u✝ ⊆ s
v : List (Set α)
hv : List.Forall₂ (fun a s => IsOpen s ∧ a ∈ s) l v
hvs : sequence v ⊆ s
u : List α
hu : u ∈ sequence v
⊢ s ∈ traverse 𝓝 u
[PROOFSTEP]
have hu := (List.mem_traverse _ _).1 hu
[GOAL]
case refine'_2.intro.intro.intro.intro.refine'_2
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
l : List α
s : Set (List α)
u✝ : List (Set α)
hu✝¹ : List.Forall₂ (fun b s => s ∈ 𝓝 b) l u✝
hus : sequence u✝ ⊆ s
v : List (Set α)
hv : List.Forall₂ (fun a s => IsOpen s ∧ a ∈ s) l v
hvs : sequence v ⊆ s
u : List α
hu✝ : u ∈ sequence v
hu : List.Forall₂ (fun b a => b ∈ id a) u v
⊢ s ∈ traverse 𝓝 u
[PROOFSTEP]
have : List.Forall₂ (fun a s => IsOpen s ∧ a ∈ s) u v :=
  by
  refine' List.Forall₂.flip _
  replace hv := hv.flip
  simp only [List.forall₂_and_left, flip] at hv ⊢
  exact ⟨hv.1, hu.flip⟩
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
l : List α
s : Set (List α)
u✝ : List (Set α)
hu✝¹ : List.Forall₂ (fun b s => s ∈ 𝓝 b) l u✝
hus : sequence u✝ ⊆ s
v : List (Set α)
hv : List.Forall₂ (fun a s => IsOpen s ∧ a ∈ s) l v
hvs : sequence v ⊆ s
u : List α
hu✝ : u ∈ sequence v
hu : List.Forall₂ (fun b a => b ∈ id a) u v
⊢ List.Forall₂ (fun a s => IsOpen s ∧ a ∈ s) u v
[PROOFSTEP]
refine' List.Forall₂.flip _
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
l : List α
s : Set (List α)
u✝ : List (Set α)
hu✝¹ : List.Forall₂ (fun b s => s ∈ 𝓝 b) l u✝
hus : sequence u✝ ⊆ s
v : List (Set α)
hv : List.Forall₂ (fun a s => IsOpen s ∧ a ∈ s) l v
hvs : sequence v ⊆ s
u : List α
hu✝ : u ∈ sequence v
hu : List.Forall₂ (fun b a => b ∈ id a) u v
⊢ List.Forall₂ (flip fun a s => IsOpen s ∧ a ∈ s) v u
[PROOFSTEP]
replace hv := hv.flip
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
l : List α
s : Set (List α)
u✝ : List (Set α)
hu✝¹ : List.Forall₂ (fun b s => s ∈ 𝓝 b) l u✝
hus : sequence u✝ ⊆ s
v : List (Set α)
hvs : sequence v ⊆ s
u : List α
hu✝ : u ∈ sequence v
hu : List.Forall₂ (fun b a => b ∈ id a) u v
hv : List.Forall₂ (fun s a => IsOpen s ∧ a ∈ s) v l
⊢ List.Forall₂ (flip fun a s => IsOpen s ∧ a ∈ s) v u
[PROOFSTEP]
simp only [List.forall₂_and_left, flip] at hv ⊢
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
l : List α
s : Set (List α)
u✝ : List (Set α)
hu✝¹ : List.Forall₂ (fun b s => s ∈ 𝓝 b) l u✝
hus : sequence u✝ ⊆ s
v : List (Set α)
hvs : sequence v ⊆ s
u : List α
hu✝ : u ∈ sequence v
hu : List.Forall₂ (fun b a => b ∈ id a) u v
hv : (∀ (a : Set α), a ∈ v → IsOpen a) ∧ List.Forall₂ (fun a b => b ∈ a) v l
⊢ (∀ (a : Set α), a ∈ v → IsOpen a) ∧ List.Forall₂ (fun a b => b ∈ a) v u
[PROOFSTEP]
exact ⟨hv.1, hu.flip⟩
[GOAL]
case refine'_2.intro.intro.intro.intro.refine'_2
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
l : List α
s : Set (List α)
u✝ : List (Set α)
hu✝¹ : List.Forall₂ (fun b s => s ∈ 𝓝 b) l u✝
hus : sequence u✝ ⊆ s
v : List (Set α)
hv : List.Forall₂ (fun a s => IsOpen s ∧ a ∈ s) l v
hvs : sequence v ⊆ s
u : List α
hu✝ : u ∈ sequence v
hu : List.Forall₂ (fun b a => b ∈ id a) u v
this : List.Forall₂ (fun a s => IsOpen s ∧ a ∈ s) u v
⊢ s ∈ traverse 𝓝 u
[PROOFSTEP]
refine' mem_of_superset _ hvs
[GOAL]
case refine'_2.intro.intro.intro.intro.refine'_2
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
l : List α
s : Set (List α)
u✝ : List (Set α)
hu✝¹ : List.Forall₂ (fun b s => s ∈ 𝓝 b) l u✝
hus : sequence u✝ ⊆ s
v : List (Set α)
hv : List.Forall₂ (fun a s => IsOpen s ∧ a ∈ s) l v
hvs : sequence v ⊆ s
u : List α
hu✝ : u ∈ sequence v
hu : List.Forall₂ (fun b a => b ∈ id a) u v
this : List.Forall₂ (fun a s => IsOpen s ∧ a ∈ s) u v
⊢ sequence v ∈ traverse 𝓝 u
[PROOFSTEP]
exact mem_traverse _ _ (this.imp fun a s ⟨hs, ha⟩ => IsOpen.mem_nhds hs ha)
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
⊢ 𝓝 [] = pure []
[PROOFSTEP]
rw [nhds_list, List.traverse_nil _]
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
a : α
l : List α
⊢ 𝓝 (a :: l) = Seq.seq (List.cons <$> 𝓝 a) fun x => 𝓝 l
[PROOFSTEP]
rw [nhds_list, List.traverse_cons _, ← nhds_list]
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
a : α
l : List α
⊢ Tendsto (fun p => p.fst :: p.snd) (𝓝 a ×ˢ 𝓝 l) (𝓝 (a :: l))
[PROOFSTEP]
rw [nhds_cons, Tendsto, Filter.map_prod]
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
a : α
l : List α
⊢ Filter.seq (Filter.map (fun a b => (a, b).fst :: (a, b).snd) (𝓝 a)) (𝓝 l) ≤ Seq.seq (cons <$> 𝓝 a) fun x => 𝓝 l
[PROOFSTEP]
exact le_rfl
[GOAL]
α : Type u_1
β✝ : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β✝
β : Type u_3
f : List α → β
b : Filter β
a : α
l : List α
⊢ Tendsto f (𝓝 (a :: l)) b ↔ Tendsto (fun p => f (p.fst :: p.snd)) (𝓝 a ×ˢ 𝓝 l) b
[PROOFSTEP]
have : 𝓝 (a :: l) = (𝓝 a ×ˢ 𝓝 l).map fun p : α × List α => p.1 :: p.2 :=
  by
  simp only [nhds_cons, Filter.prod_eq, (Filter.map_def _ _).symm, (Filter.seq_eq_filter_seq _ _).symm]
  simp [-Filter.map_def, (· ∘ ·), functor_norm]
[GOAL]
α : Type u_1
β✝ : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β✝
β : Type u_3
f : List α → β
b : Filter β
a : α
l : List α
⊢ 𝓝 (a :: l) = Filter.map (fun p => p.fst :: p.snd) (𝓝 a ×ˢ 𝓝 l)
[PROOFSTEP]
simp only [nhds_cons, Filter.prod_eq, (Filter.map_def _ _).symm, (Filter.seq_eq_filter_seq _ _).symm]
[GOAL]
α : Type u_1
β✝ : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β✝
β : Type u_3
f : List α → β
b : Filter β
a : α
l : List α
⊢ (Seq.seq (cons <$> 𝓝 a) fun x => 𝓝 l) = (fun p => p.fst :: p.snd) <$> Seq.seq (Prod.mk <$> 𝓝 a) fun x => 𝓝 l
[PROOFSTEP]
simp [-Filter.map_def, (· ∘ ·), functor_norm]
[GOAL]
α : Type u_1
β✝ : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β✝
β : Type u_3
f : List α → β
b : Filter β
a : α
l : List α
this : 𝓝 (a :: l) = Filter.map (fun p => p.fst :: p.snd) (𝓝 a ×ˢ 𝓝 l)
⊢ Tendsto f (𝓝 (a :: l)) b ↔ Tendsto (fun p => f (p.fst :: p.snd)) (𝓝 a ×ˢ 𝓝 l) b
[PROOFSTEP]
rw [this, Filter.tendsto_map'_iff]
[GOAL]
α : Type u_1
β✝ : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β✝
β : Type u_3
f : List α → β
b : Filter β
a : α
l : List α
this : 𝓝 (a :: l) = Filter.map (fun p => p.fst :: p.snd) (𝓝 a ×ˢ 𝓝 l)
⊢ Tendsto (f ∘ fun p => p.fst :: p.snd) (𝓝 a ×ˢ 𝓝 l) b ↔ Tendsto (fun p => f (p.fst :: p.snd)) (𝓝 a ×ˢ 𝓝 l) b
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
β✝ : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β✝
β : Type u_3
f : List α → β
r : List α → Filter β
h_nil : Tendsto f (pure []) (r [])
h_cons : ∀ (l : List α) (a : α), Tendsto f (𝓝 l) (r l) → Tendsto (fun p => f (p.fst :: p.snd)) (𝓝 a ×ˢ 𝓝 l) (r (a :: l))
⊢ Tendsto f (𝓝 []) (r [])
[PROOFSTEP]
rwa [nhds_nil]
[GOAL]
α : Type u_1
β✝ : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β✝
β : Type u_3
f : List α → β
r : List α → Filter β
h_nil : Tendsto f (pure []) (r [])
h_cons : ∀ (l : List α) (a : α), Tendsto f (𝓝 l) (r l) → Tendsto (fun p => f (p.fst :: p.snd)) (𝓝 a ×ˢ 𝓝 l) (r (a :: l))
a : α
l : List α
⊢ Tendsto f (𝓝 (a :: l)) (r (a :: l))
[PROOFSTEP]
rw [tendsto_cons_iff]
[GOAL]
α : Type u_1
β✝ : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β✝
β : Type u_3
f : List α → β
r : List α → Filter β
h_nil : Tendsto f (pure []) (r [])
h_cons : ∀ (l : List α) (a : α), Tendsto f (𝓝 l) (r l) → Tendsto (fun p => f (p.fst :: p.snd)) (𝓝 a ×ˢ 𝓝 l) (r (a :: l))
a : α
l : List α
⊢ Tendsto (fun p => f (p.fst :: p.snd)) (𝓝 a ×ˢ 𝓝 l) (r (a :: l))
[PROOFSTEP]
exact h_cons l a (@tendsto_nhds _ _ _ h_nil h_cons l)
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
⊢ ∀ (l : List α), ContinuousAt length l
[PROOFSTEP]
simp only [ContinuousAt, nhds_discrete]
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
⊢ ∀ (l : List α), Tendsto length (𝓝 l) (pure (length l))
[PROOFSTEP]
refine' tendsto_nhds _ _
[GOAL]
case refine'_1
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
⊢ Tendsto length (pure []) (pure (length []))
[PROOFSTEP]
exact tendsto_pure_pure _ _
[GOAL]
case refine'_2
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
⊢ ∀ (l : List α) (a : α),
    Tendsto length (𝓝 l) (pure (length l)) →
      Tendsto (fun p => length (p.fst :: p.snd)) (𝓝 a ×ˢ 𝓝 l) (pure (length (a :: l)))
[PROOFSTEP]
intro l a ih
[GOAL]
case refine'_2
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
l : List α
a : α
ih : Tendsto length (𝓝 l) (pure (length l))
⊢ Tendsto (fun p => length (p.fst :: p.snd)) (𝓝 a ×ˢ 𝓝 l) (pure (length (a :: l)))
[PROOFSTEP]
dsimp only [List.length]
[GOAL]
case refine'_2
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
l : List α
a : α
ih : Tendsto length (𝓝 l) (pure (length l))
⊢ Tendsto (fun p => length p.snd + 1) (𝓝 a ×ˢ 𝓝 l) (pure (length l + 1))
[PROOFSTEP]
refine' Tendsto.comp (tendsto_pure_pure (fun x => x + 1) _) _
[GOAL]
case refine'_2
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
l : List α
a : α
ih : Tendsto length (𝓝 l) (pure (length l))
⊢ Tendsto (fun p => Nat.add (length p.snd) 0) (𝓝 a ×ˢ 𝓝 l) (pure (length l))
[PROOFSTEP]
refine' Tendsto.comp ih tendsto_snd
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
a : α
n : ℕ
⊢ Tendsto (fun p => insertNth (n + 1) p.fst p.snd) (𝓝 a ×ˢ 𝓝 []) (𝓝 (insertNth (n + 1) a []))
[PROOFSTEP]
simp
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
a : α
n : ℕ
a' : α
l : List α
⊢ Tendsto (fun p => insertNth (n + 1) p.fst p.snd) (𝓝 a ×ˢ 𝓝 (a' :: l)) (𝓝 (insertNth (n + 1) a (a' :: l)))
[PROOFSTEP]
have : 𝓝 a ×ˢ 𝓝 (a' :: l) = (𝓝 a ×ˢ (𝓝 a' ×ˢ 𝓝 l)).map fun p : α × α × List α => (p.1, p.2.1 :: p.2.2) :=
  by
  simp only [nhds_cons, Filter.prod_eq, ← Filter.map_def, ← Filter.seq_eq_filter_seq]
  simp [-Filter.map_def, (· ∘ ·), functor_norm]
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
a : α
n : ℕ
a' : α
l : List α
⊢ 𝓝 a ×ˢ 𝓝 (a' :: l) = Filter.map (fun p => (p.fst, p.snd.fst :: p.snd.snd)) (𝓝 a ×ˢ 𝓝 a' ×ˢ 𝓝 l)
[PROOFSTEP]
simp only [nhds_cons, Filter.prod_eq, ← Filter.map_def, ← Filter.seq_eq_filter_seq]
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
a : α
n : ℕ
a' : α
l : List α
⊢ (Seq.seq (Prod.mk <$> 𝓝 a) fun x => Seq.seq (cons <$> 𝓝 a') fun x => 𝓝 l) =
    (fun p => (p.fst, p.snd.fst :: p.snd.snd)) <$>
      Seq.seq (Prod.mk <$> 𝓝 a) fun x => Seq.seq (Prod.mk <$> 𝓝 a') fun x => 𝓝 l
[PROOFSTEP]
simp [-Filter.map_def, (· ∘ ·), functor_norm]
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
a : α
n : ℕ
a' : α
l : List α
this : 𝓝 a ×ˢ 𝓝 (a' :: l) = Filter.map (fun p => (p.fst, p.snd.fst :: p.snd.snd)) (𝓝 a ×ˢ 𝓝 a' ×ˢ 𝓝 l)
⊢ Tendsto (fun p => insertNth (n + 1) p.fst p.snd) (𝓝 a ×ˢ 𝓝 (a' :: l)) (𝓝 (insertNth (n + 1) a (a' :: l)))
[PROOFSTEP]
rw [this, tendsto_map'_iff]
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
a : α
n : ℕ
a' : α
l : List α
this : 𝓝 a ×ˢ 𝓝 (a' :: l) = Filter.map (fun p => (p.fst, p.snd.fst :: p.snd.snd)) (𝓝 a ×ˢ 𝓝 a' ×ˢ 𝓝 l)
⊢ Tendsto ((fun p => insertNth (n + 1) p.fst p.snd) ∘ fun p => (p.fst, p.snd.fst :: p.snd.snd)) (𝓝 a ×ˢ 𝓝 a' ×ˢ 𝓝 l)
    (𝓝 (insertNth (n + 1) a (a' :: l)))
[PROOFSTEP]
exact
  (tendsto_fst.comp tendsto_snd).cons
    ((@tendsto_insertNth' _ n l).comp <| tendsto_fst.prod_mk <| tendsto_snd.comp tendsto_snd)
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
n : ℕ
x✝ : α × List α
a : α
l : List α
⊢ ContinuousAt (fun p => insertNth n p.fst p.snd) (a, l)
[PROOFSTEP]
rw [ContinuousAt, nhds_prod_eq]
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
n : ℕ
x✝ : α × List α
a : α
l : List α
⊢ Tendsto (fun p => insertNth n p.fst p.snd) (𝓝 a ×ˢ 𝓝 l) (𝓝 (insertNth n (a, l).fst (a, l).snd))
[PROOFSTEP]
exact tendsto_insertNth'
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
x✝ : ℕ
⊢ Tendsto (fun l => removeNth l x✝) (𝓝 []) (𝓝 (removeNth [] x✝))
[PROOFSTEP]
rw [nhds_nil]
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
x✝ : ℕ
⊢ Tendsto (fun l => removeNth l x✝) (pure []) (𝓝 (removeNth [] x✝))
[PROOFSTEP]
exact tendsto_pure_nhds _ _
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
a : α
l : List α
⊢ Tendsto (fun l => removeNth l 0) (𝓝 (a :: l)) (𝓝 (removeNth (a :: l) 0))
[PROOFSTEP]
rw [tendsto_cons_iff]
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
a : α
l : List α
⊢ Tendsto (fun p => removeNth (p.fst :: p.snd) 0) (𝓝 a ×ˢ 𝓝 l) (𝓝 (removeNth (a :: l) 0))
[PROOFSTEP]
exact tendsto_snd
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
n : ℕ
a : α
l : List α
⊢ Tendsto (fun l => removeNth l (n + 1)) (𝓝 (a :: l)) (𝓝 (removeNth (a :: l) (n + 1)))
[PROOFSTEP]
rw [tendsto_cons_iff]
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
n : ℕ
a : α
l : List α
⊢ Tendsto (fun p => removeNth (p.fst :: p.snd) (n + 1)) (𝓝 a ×ˢ 𝓝 l) (𝓝 (removeNth (a :: l) (n + 1)))
[PROOFSTEP]
dsimp [removeNth]
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
n : ℕ
a : α
l : List α
⊢ Tendsto (fun p => p.fst :: removeNth p.snd n) (𝓝 a ×ˢ 𝓝 l) (𝓝 (a :: removeNth l n))
[PROOFSTEP]
exact tendsto_fst.cons ((@tendsto_removeNth n l).comp tendsto_snd)
[GOAL]
α : Type u_1
β : Type u_2
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : Monoid α
inst✝ : ContinuousMul α
l : List α
⊢ Tendsto prod (𝓝 l) (𝓝 (prod l))
[PROOFSTEP]
induction' l with x l ih
[GOAL]
case nil
α : Type u_1
β : Type u_2
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : Monoid α
inst✝ : ContinuousMul α
⊢ Tendsto prod (𝓝 []) (𝓝 (prod []))
[PROOFSTEP]
simp (config := { contextual := true }) [nhds_nil, mem_of_mem_nhds, tendsto_pure_left]
[GOAL]
case cons
α : Type u_1
β : Type u_2
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : Monoid α
inst✝ : ContinuousMul α
x : α
l : List α
ih : Tendsto prod (𝓝 l) (𝓝 (prod l))
⊢ Tendsto prod (𝓝 (x :: l)) (𝓝 (prod (x :: l)))
[PROOFSTEP]
simp_rw [tendsto_cons_iff, prod_cons]
[GOAL]
case cons
α : Type u_1
β : Type u_2
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : Monoid α
inst✝ : ContinuousMul α
x : α
l : List α
ih : Tendsto prod (𝓝 l) (𝓝 (prod l))
⊢ Tendsto (fun p => p.fst * prod p.snd) (𝓝 x ×ˢ 𝓝 l) (𝓝 (x * prod l))
[PROOFSTEP]
have := continuous_iff_continuousAt.mp continuous_mul (x, l.prod)
[GOAL]
case cons
α : Type u_1
β : Type u_2
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : Monoid α
inst✝ : ContinuousMul α
x : α
l : List α
ih : Tendsto prod (𝓝 l) (𝓝 (prod l))
this : ContinuousAt (fun p => p.fst * p.snd) (x, prod l)
⊢ Tendsto (fun p => p.fst * prod p.snd) (𝓝 x ×ˢ 𝓝 l) (𝓝 (x * prod l))
[PROOFSTEP]
rw [ContinuousAt, nhds_prod_eq] at this
[GOAL]
case cons
α : Type u_1
β : Type u_2
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : Monoid α
inst✝ : ContinuousMul α
x : α
l : List α
ih : Tendsto prod (𝓝 l) (𝓝 (prod l))
this : Tendsto (fun p => p.fst * p.snd) (𝓝 x ×ˢ 𝓝 (prod l)) (𝓝 ((x, prod l).fst * (x, prod l).snd))
⊢ Tendsto (fun p => p.fst * prod p.snd) (𝓝 x ×ˢ 𝓝 l) (𝓝 (x * prod l))
[PROOFSTEP]
exact this.comp (tendsto_id.prod_map ih)
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
n : ℕ
⊢ TopologicalSpace (Vector α n)
[PROOFSTEP]
unfold Vector
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
n : ℕ
⊢ TopologicalSpace { l // List.length l = n }
[PROOFSTEP]
infer_instance
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
n : ℕ
a : α
l : Vector α n
⊢ Tendsto (fun p => p.fst ::ᵥ p.snd) (𝓝 a ×ˢ 𝓝 l) (𝓝 (a ::ᵥ l))
[PROOFSTEP]
rw [tendsto_subtype_rng, cons_val]
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
n : ℕ
a : α
l : Vector α n
⊢ Tendsto (fun x => ↑(x.fst ::ᵥ x.snd)) (𝓝 a ×ˢ 𝓝 l) (𝓝 (a :: ↑l))
[PROOFSTEP]
exact tendsto_fst.cons (Tendsto.comp continuousAt_subtype_val tendsto_snd)
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
n : ℕ
i : Fin (n + 1)
a : α
l : List α
hl : List.length l = n
⊢ Tendsto (fun p => insertNth p.fst i p.snd) (𝓝 a ×ˢ 𝓝 { val := l, property := hl })
    (𝓝 (insertNth a i { val := l, property := hl }))
[PROOFSTEP]
rw [insertNth, tendsto_subtype_rng]
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
n : ℕ
i : Fin (n + 1)
a : α
l : List α
hl : List.length l = n
⊢ Tendsto (fun x => ↑(insertNth x.fst i x.snd)) (𝓝 a ×ˢ 𝓝 { val := l, property := hl })
    (𝓝
      ↑{ val := List.insertNth (↑i) a ↑{ val := l, property := hl },
          property := (_ : List.length (List.insertNth (↑i) a ↑{ val := l, property := hl }) = n + 1) })
[PROOFSTEP]
simp [insertNth_val]
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
n : ℕ
i : Fin (n + 1)
a : α
l : List α
hl : List.length l = n
⊢ Tendsto (fun x => List.insertNth (↑i) x.fst ↑x.snd) (𝓝 a ×ˢ 𝓝 { val := l, property := hl })
    (𝓝 (List.insertNth (↑i) a l))
[PROOFSTEP]
exact List.tendsto_insertNth tendsto_fst (Tendsto.comp continuousAt_subtype_val tendsto_snd : _)
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
n : ℕ
i : Fin (n + 1)
x✝ : α × Vector α n
a : α
l : Vector α n
⊢ ContinuousAt (fun p => insertNth p.fst i p.snd) (a, l)
[PROOFSTEP]
rw [ContinuousAt, nhds_prod_eq]
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
n : ℕ
i : Fin (n + 1)
x✝ : α × Vector α n
a : α
l : Vector α n
⊢ Tendsto (fun p => insertNth p.fst i p.snd) (𝓝 a ×ˢ 𝓝 l) (𝓝 (insertNth (a, l).fst i (a, l).snd))
[PROOFSTEP]
exact tendsto_insertNth
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
n : ℕ
i : Fin (n + 1)
l : List α
hl : List.length l = n + 1
⊢ ContinuousAt (removeNth i) { val := l, property := hl }
[PROOFSTEP]
rw [ContinuousAt, removeNth, tendsto_subtype_rng]
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
n : ℕ
i : Fin (n + 1)
l : List α
hl : List.length l = n + 1
⊢ Tendsto (fun x => ↑(removeNth i x)) (𝓝 { val := l, property := hl })
    (𝓝
      ↑(match { val := l, property := hl } with
        | { val := l, property := p } =>
          { val := List.removeNth l ↑i, property := (_ : List.length (List.removeNth l ↑i) = n + 1 - 1) }))
[PROOFSTEP]
simp only [Vector.removeNth_val]
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : TopologicalSpace α
inst✝ : TopologicalSpace β
n : ℕ
i : Fin (n + 1)
l : List α
hl : List.length l = n + 1
⊢ Tendsto (fun x => List.removeNth ↑x ↑i) (𝓝 { val := l, property := hl }) (𝓝 (List.removeNth l ↑i))
[PROOFSTEP]
exact Tendsto.comp List.tendsto_removeNth continuousAt_subtype_val


[GOAL]
C : Type u_1
inst✝³ : Category.{u_2, u_1} C
inst✝² : HasZeroMorphisms C
inst✝¹ : HasZeroObject C
X : C
inst✝ : ArtinianObject X
h : ¬IsZero X
⊢ ∃ Y, Simple (underlying.obj Y)
[PROOFSTEP]
haveI : Nontrivial (Subobject X) := nontrivial_of_not_isZero h
[GOAL]
C : Type u_1
inst✝³ : Category.{u_2, u_1} C
inst✝² : HasZeroMorphisms C
inst✝¹ : HasZeroObject C
X : C
inst✝ : ArtinianObject X
h : ¬IsZero X
this : Nontrivial (Subobject X)
⊢ ∃ Y, Simple (underlying.obj Y)
[PROOFSTEP]
haveI := isAtomic_of_orderBot_wellFounded_lt (ArtinianObject.subobject_lt_wellFounded X)
[GOAL]
C : Type u_1
inst✝³ : Category.{u_2, u_1} C
inst✝² : HasZeroMorphisms C
inst✝¹ : HasZeroObject C
X : C
inst✝ : ArtinianObject X
h : ¬IsZero X
this✝ : Nontrivial (Subobject X)
this : IsAtomic (Subobject X)
⊢ ∃ Y, Simple (underlying.obj Y)
[PROOFSTEP]
obtain ⟨Y, s⟩ := (IsAtomic.eq_bot_or_exists_atom_le (⊤ : Subobject X)).resolve_left top_ne_bot
[GOAL]
case intro
C : Type u_1
inst✝³ : Category.{u_2, u_1} C
inst✝² : HasZeroMorphisms C
inst✝¹ : HasZeroObject C
X : C
inst✝ : ArtinianObject X
h : ¬IsZero X
this✝ : Nontrivial (Subobject X)
this : IsAtomic (Subobject X)
Y : Subobject X
s : IsAtom Y ∧ Y ≤ ⊤
⊢ ∃ Y, Simple (underlying.obj Y)
[PROOFSTEP]
exact ⟨Y, (subobject_simple_iff_isAtom _).mpr s.1⟩
[GOAL]
C : Type u_1
inst✝³ : Category.{?u.7023, u_1} C
inst✝² : HasZeroMorphisms C
inst✝¹ : HasZeroObject C
X : C
inst✝ : ArtinianObject X
h : ¬IsZero X
⊢ Mono (simpleSubobjectArrow h)
[PROOFSTEP]
dsimp only [simpleSubobjectArrow]
[GOAL]
C : Type u_1
inst✝³ : Category.{?u.7023, u_1} C
inst✝² : HasZeroMorphisms C
inst✝¹ : HasZeroObject C
X : C
inst✝ : ArtinianObject X
h : ¬IsZero X
⊢ Mono (arrow (Exists.choose (_ : ∃ Y, Simple (underlying.obj Y))))
[PROOFSTEP]
infer_instance


[GOAL]
V : Type u
inst✝¹ : Category.{v, u} V
inst✝ : HasZeroMorphisms V
ι : Type u_1
c : ComplexShape ι
ι' : Type u_2
c' : ComplexShape ι'
C : HomologicalComplex (HomologicalComplex V c) c'
i : ι
j j' : ι'
w : ¬ComplexShape.Rel c' j j'
⊢ (fun j j' => Hom.f (d C j j') i) j j' = 0
[PROOFSTEP]
simp_all only [shape, zero_f]
[GOAL]
V : Type u
inst✝¹ : Category.{v, u} V
inst✝ : HasZeroMorphisms V
ι : Type u_1
c : ComplexShape ι
ι' : Type u_2
c' : ComplexShape ι'
C : HomologicalComplex (HomologicalComplex V c) c'
i i' : ι
w : ¬ComplexShape.Rel c i i'
⊢ (fun i i' => Hom.mk fun j => d (X C j) i i') i i' = 0
[PROOFSTEP]
ext j
[GOAL]
case h
V : Type u
inst✝¹ : Category.{v, u} V
inst✝ : HasZeroMorphisms V
ι : Type u_1
c : ComplexShape ι
ι' : Type u_2
c' : ComplexShape ι'
C : HomologicalComplex (HomologicalComplex V c) c'
i i' : ι
w : ¬ComplexShape.Rel c i i'
j : ι'
⊢ Hom.f ((fun i i' => Hom.mk fun j => d (X C j) i i') i i') j = Hom.f 0 j
[PROOFSTEP]
exact (C.X j).shape i i' w
[GOAL]
V : Type u
inst✝¹ : Category.{v, u} V
inst✝ : HasZeroMorphisms V
ι : Type u_1
c : ComplexShape ι
ι' : Type u_2
c' : ComplexShape ι'
C : HomologicalComplex (HomologicalComplex V c) c'
i j : ι'
x✝ : ComplexShape.Rel c' i j
⊢ (fun i => Hom.mk fun j => 𝟙 (X (X C i) j)) i ≫ d ((flip V c c' ⋙ flip V c' c).obj C) i j =
    d ((𝟭 (HomologicalComplex (HomologicalComplex V c) c')).obj C) i j ≫ (fun i => Hom.mk fun j => 𝟙 (X (X C i) j)) j
[PROOFSTEP]
ext
[GOAL]
case h
V : Type u
inst✝¹ : Category.{v, u} V
inst✝ : HasZeroMorphisms V
ι : Type u_1
c : ComplexShape ι
ι' : Type u_2
c' : ComplexShape ι'
C : HomologicalComplex (HomologicalComplex V c) c'
i j : ι'
x✝ : ComplexShape.Rel c' i j
i✝ : ι
⊢ Hom.f ((fun i => Hom.mk fun j => 𝟙 (X (X C i) j)) i ≫ d ((flip V c c' ⋙ flip V c' c).obj C) i j) i✝ =
    Hom.f
      (d ((𝟭 (HomologicalComplex (HomologicalComplex V c) c')).obj C) i j ≫
        (fun i => Hom.mk fun j => 𝟙 (X (X C i) j)) j)
      i✝
[PROOFSTEP]
dsimp
[GOAL]
case h
V : Type u
inst✝¹ : Category.{v, u} V
inst✝ : HasZeroMorphisms V
ι : Type u_1
c : ComplexShape ι
ι' : Type u_2
c' : ComplexShape ι'
C : HomologicalComplex (HomologicalComplex V c) c'
i j : ι'
x✝ : ComplexShape.Rel c' i j
i✝ : ι
⊢ 𝟙 (X (X C i) i✝) ≫ Hom.f (d C i j) i✝ = Hom.f (d C i j) i✝ ≫ 𝟙 (X (X C j) i✝)
[PROOFSTEP]
simp only [Category.id_comp, Category.comp_id]
[GOAL]
V : Type u
inst✝¹ : Category.{v, u} V
inst✝ : HasZeroMorphisms V
ι : Type u_1
c : ComplexShape ι
ι' : Type u_2
c' : ComplexShape ι'
C : HomologicalComplex (HomologicalComplex V c) c'
i j : ι'
x✝ : ComplexShape.Rel c' i j
⊢ (fun i => Hom.mk fun j => 𝟙 (X (X C i) j)) i ≫ d ((𝟭 (HomologicalComplex (HomologicalComplex V c) c')).obj C) i j =
    d ((flip V c c' ⋙ flip V c' c).obj C) i j ≫ (fun i => Hom.mk fun j => 𝟙 (X (X C i) j)) j
[PROOFSTEP]
ext
[GOAL]
case h
V : Type u
inst✝¹ : Category.{v, u} V
inst✝ : HasZeroMorphisms V
ι : Type u_1
c : ComplexShape ι
ι' : Type u_2
c' : ComplexShape ι'
C : HomologicalComplex (HomologicalComplex V c) c'
i j : ι'
x✝ : ComplexShape.Rel c' i j
i✝ : ι
⊢ Hom.f
      ((fun i => Hom.mk fun j => 𝟙 (X (X C i) j)) i ≫
        d ((𝟭 (HomologicalComplex (HomologicalComplex V c) c')).obj C) i j)
      i✝ =
    Hom.f (d ((flip V c c' ⋙ flip V c' c).obj C) i j ≫ (fun i => Hom.mk fun j => 𝟙 (X (X C i) j)) j) i✝
[PROOFSTEP]
dsimp
[GOAL]
case h
V : Type u
inst✝¹ : Category.{v, u} V
inst✝ : HasZeroMorphisms V
ι : Type u_1
c : ComplexShape ι
ι' : Type u_2
c' : ComplexShape ι'
C : HomologicalComplex (HomologicalComplex V c) c'
i j : ι'
x✝ : ComplexShape.Rel c' i j
i✝ : ι
⊢ 𝟙 (X (X C i) i✝) ≫ Hom.f (d C i j) i✝ = Hom.f (d C i j) i✝ ≫ 𝟙 (X (X C j) i✝)
[PROOFSTEP]
simp only [Category.id_comp, Category.comp_id]
[GOAL]
V : Type u
inst✝¹ : Category.{v, u} V
inst✝ : HasZeroMorphisms V
ι : Type u_1
c : ComplexShape ι
ι' : Type u_2
c' : ComplexShape ι'
X Y : HomologicalComplex (HomologicalComplex V c) c'
f : X ⟶ Y
⊢ (𝟭 (HomologicalComplex (HomologicalComplex V c) c')).map f ≫
      ((fun C =>
            Iso.mk (Hom.mk fun i => Hom.mk fun j => 𝟙 (HomologicalComplex.X (HomologicalComplex.X C i) j))
              (Hom.mk fun i => Hom.mk fun j => 𝟙 (HomologicalComplex.X (HomologicalComplex.X C i) j)))
          Y).hom =
    ((fun C =>
            Iso.mk (Hom.mk fun i => Hom.mk fun j => 𝟙 (HomologicalComplex.X (HomologicalComplex.X C i) j))
              (Hom.mk fun i => Hom.mk fun j => 𝟙 (HomologicalComplex.X (HomologicalComplex.X C i) j)))
          X).hom ≫
      (flip V c c' ⋙ flip V c' c).map f
[PROOFSTEP]
ext
[GOAL]
case h.h
V : Type u
inst✝¹ : Category.{v, u} V
inst✝ : HasZeroMorphisms V
ι : Type u_1
c : ComplexShape ι
ι' : Type u_2
c' : ComplexShape ι'
X Y : HomologicalComplex (HomologicalComplex V c) c'
f : X ⟶ Y
i✝¹ : ι'
i✝ : ι
⊢ Hom.f
      (Hom.f
        ((𝟭 (HomologicalComplex (HomologicalComplex V c) c')).map f ≫
          ((fun C =>
                Iso.mk (Hom.mk fun i => Hom.mk fun j => 𝟙 (HomologicalComplex.X (HomologicalComplex.X C i) j))
                  (Hom.mk fun i => Hom.mk fun j => 𝟙 (HomologicalComplex.X (HomologicalComplex.X C i) j)))
              Y).hom)
        i✝¹)
      i✝ =
    Hom.f
      (Hom.f
        (((fun C =>
                Iso.mk (Hom.mk fun i => Hom.mk fun j => 𝟙 (HomologicalComplex.X (HomologicalComplex.X C i) j))
                  (Hom.mk fun i => Hom.mk fun j => 𝟙 (HomologicalComplex.X (HomologicalComplex.X C i) j)))
              X).hom ≫
          (flip V c c' ⋙ flip V c' c).map f)
        i✝¹)
      i✝
[PROOFSTEP]
dsimp
[GOAL]
case h.h
V : Type u
inst✝¹ : Category.{v, u} V
inst✝ : HasZeroMorphisms V
ι : Type u_1
c : ComplexShape ι
ι' : Type u_2
c' : ComplexShape ι'
X Y : HomologicalComplex (HomologicalComplex V c) c'
f : X ⟶ Y
i✝¹ : ι'
i✝ : ι
⊢ Hom.f (Hom.f f i✝¹) i✝ ≫ 𝟙 (HomologicalComplex.X (HomologicalComplex.X Y i✝¹) i✝) =
    𝟙 (HomologicalComplex.X (HomologicalComplex.X X i✝¹) i✝) ≫ Hom.f (Hom.f f i✝¹) i✝
[PROOFSTEP]
simp only [Category.id_comp, Category.comp_id]
[GOAL]
V : Type u
inst✝¹ : Category.{v, u} V
inst✝ : HasZeroMorphisms V
ι : Type u_1
c : ComplexShape ι
ι' : Type u_2
c' : ComplexShape ι'
C : HomologicalComplex (HomologicalComplex V c') c
i j : ι
x✝ : ComplexShape.Rel c i j
⊢ (fun i => Hom.mk fun j => 𝟙 (X (X C i) j)) i ≫ d ((𝟭 (HomologicalComplex (HomologicalComplex V c') c)).obj C) i j =
    d ((flip V c' c ⋙ flip V c c').obj C) i j ≫ (fun i => Hom.mk fun j => 𝟙 (X (X C i) j)) j
[PROOFSTEP]
ext
[GOAL]
case h
V : Type u
inst✝¹ : Category.{v, u} V
inst✝ : HasZeroMorphisms V
ι : Type u_1
c : ComplexShape ι
ι' : Type u_2
c' : ComplexShape ι'
C : HomologicalComplex (HomologicalComplex V c') c
i j : ι
x✝ : ComplexShape.Rel c i j
i✝ : ι'
⊢ Hom.f
      ((fun i => Hom.mk fun j => 𝟙 (X (X C i) j)) i ≫
        d ((𝟭 (HomologicalComplex (HomologicalComplex V c') c)).obj C) i j)
      i✝ =
    Hom.f (d ((flip V c' c ⋙ flip V c c').obj C) i j ≫ (fun i => Hom.mk fun j => 𝟙 (X (X C i) j)) j) i✝
[PROOFSTEP]
dsimp
[GOAL]
case h
V : Type u
inst✝¹ : Category.{v, u} V
inst✝ : HasZeroMorphisms V
ι : Type u_1
c : ComplexShape ι
ι' : Type u_2
c' : ComplexShape ι'
C : HomologicalComplex (HomologicalComplex V c') c
i j : ι
x✝ : ComplexShape.Rel c i j
i✝ : ι'
⊢ 𝟙 (X (X C i) i✝) ≫ Hom.f (d C i j) i✝ = Hom.f (d C i j) i✝ ≫ 𝟙 (X (X C j) i✝)
[PROOFSTEP]
simp only [Category.id_comp, Category.comp_id]
[GOAL]
V : Type u
inst✝¹ : Category.{v, u} V
inst✝ : HasZeroMorphisms V
ι : Type u_1
c : ComplexShape ι
ι' : Type u_2
c' : ComplexShape ι'
C : HomologicalComplex (HomologicalComplex V c') c
i j : ι
x✝ : ComplexShape.Rel c i j
⊢ (fun i => Hom.mk fun j => 𝟙 (X (X C i) j)) i ≫ d ((flip V c' c ⋙ flip V c c').obj C) i j =
    d ((𝟭 (HomologicalComplex (HomologicalComplex V c') c)).obj C) i j ≫ (fun i => Hom.mk fun j => 𝟙 (X (X C i) j)) j
[PROOFSTEP]
ext
[GOAL]
case h
V : Type u
inst✝¹ : Category.{v, u} V
inst✝ : HasZeroMorphisms V
ι : Type u_1
c : ComplexShape ι
ι' : Type u_2
c' : ComplexShape ι'
C : HomologicalComplex (HomologicalComplex V c') c
i j : ι
x✝ : ComplexShape.Rel c i j
i✝ : ι'
⊢ Hom.f ((fun i => Hom.mk fun j => 𝟙 (X (X C i) j)) i ≫ d ((flip V c' c ⋙ flip V c c').obj C) i j) i✝ =
    Hom.f
      (d ((𝟭 (HomologicalComplex (HomologicalComplex V c') c)).obj C) i j ≫
        (fun i => Hom.mk fun j => 𝟙 (X (X C i) j)) j)
      i✝
[PROOFSTEP]
dsimp
[GOAL]
case h
V : Type u
inst✝¹ : Category.{v, u} V
inst✝ : HasZeroMorphisms V
ι : Type u_1
c : ComplexShape ι
ι' : Type u_2
c' : ComplexShape ι'
C : HomologicalComplex (HomologicalComplex V c') c
i j : ι
x✝ : ComplexShape.Rel c i j
i✝ : ι'
⊢ 𝟙 (X (X C i) i✝) ≫ Hom.f (d C i j) i✝ = Hom.f (d C i j) i✝ ≫ 𝟙 (X (X C j) i✝)
[PROOFSTEP]
simp only [Category.id_comp, Category.comp_id]
[GOAL]
V : Type u
inst✝¹ : Category.{v, u} V
inst✝ : HasZeroMorphisms V
ι : Type u_1
c : ComplexShape ι
ι' : Type u_2
c' : ComplexShape ι'
X Y : HomologicalComplex (HomologicalComplex V c') c
f : X ⟶ Y
⊢ (flip V c' c ⋙ flip V c c').map f ≫
      ((fun C =>
            Iso.mk (Hom.mk fun i => Hom.mk fun j => 𝟙 (HomologicalComplex.X (HomologicalComplex.X C i) j))
              (Hom.mk fun i => Hom.mk fun j => 𝟙 (HomologicalComplex.X (HomologicalComplex.X C i) j)))
          Y).hom =
    ((fun C =>
            Iso.mk (Hom.mk fun i => Hom.mk fun j => 𝟙 (HomologicalComplex.X (HomologicalComplex.X C i) j))
              (Hom.mk fun i => Hom.mk fun j => 𝟙 (HomologicalComplex.X (HomologicalComplex.X C i) j)))
          X).hom ≫
      (𝟭 (HomologicalComplex (HomologicalComplex V c') c)).map f
[PROOFSTEP]
ext
[GOAL]
case h.h
V : Type u
inst✝¹ : Category.{v, u} V
inst✝ : HasZeroMorphisms V
ι : Type u_1
c : ComplexShape ι
ι' : Type u_2
c' : ComplexShape ι'
X Y : HomologicalComplex (HomologicalComplex V c') c
f : X ⟶ Y
i✝¹ : ι
i✝ : ι'
⊢ Hom.f
      (Hom.f
        ((flip V c' c ⋙ flip V c c').map f ≫
          ((fun C =>
                Iso.mk (Hom.mk fun i => Hom.mk fun j => 𝟙 (HomologicalComplex.X (HomologicalComplex.X C i) j))
                  (Hom.mk fun i => Hom.mk fun j => 𝟙 (HomologicalComplex.X (HomologicalComplex.X C i) j)))
              Y).hom)
        i✝¹)
      i✝ =
    Hom.f
      (Hom.f
        (((fun C =>
                Iso.mk (Hom.mk fun i => Hom.mk fun j => 𝟙 (HomologicalComplex.X (HomologicalComplex.X C i) j))
                  (Hom.mk fun i => Hom.mk fun j => 𝟙 (HomologicalComplex.X (HomologicalComplex.X C i) j)))
              X).hom ≫
          (𝟭 (HomologicalComplex (HomologicalComplex V c') c)).map f)
        i✝¹)
      i✝
[PROOFSTEP]
dsimp
[GOAL]
case h.h
V : Type u
inst✝¹ : Category.{v, u} V
inst✝ : HasZeroMorphisms V
ι : Type u_1
c : ComplexShape ι
ι' : Type u_2
c' : ComplexShape ι'
X Y : HomologicalComplex (HomologicalComplex V c') c
f : X ⟶ Y
i✝¹ : ι
i✝ : ι'
⊢ Hom.f (Hom.f f i✝¹) i✝ ≫ 𝟙 (HomologicalComplex.X (HomologicalComplex.X Y i✝¹) i✝) =
    𝟙 (HomologicalComplex.X (HomologicalComplex.X X i✝¹) i✝) ≫ Hom.f (Hom.f f i✝¹) i✝
[PROOFSTEP]
simp only [Category.id_comp, Category.comp_id]


[GOAL]
E : Type u_1
L : Type u_2
inst✝⁶ : MeasurableSpace E
μ : Measure E
F s : Set E
inst✝⁵ : AddCommGroup L
inst✝⁴ : Countable L
inst✝³ : AddAction L E
inst✝² : MeasurableSpace L
inst✝¹ : MeasurableVAdd L E
inst✝ : VAddInvariantMeasure L E μ
fund : IsAddFundamentalDomain L F
hS : NullMeasurableSet s
h : ↑↑μ F < ↑↑μ s
⊢ ∃ x y, x ≠ y ∧ ¬Disjoint (x +ᵥ s) (y +ᵥ s)
[PROOFSTEP]
contrapose! h
[GOAL]
E : Type u_1
L : Type u_2
inst✝⁶ : MeasurableSpace E
μ : Measure E
F s : Set E
inst✝⁵ : AddCommGroup L
inst✝⁴ : Countable L
inst✝³ : AddAction L E
inst✝² : MeasurableSpace L
inst✝¹ : MeasurableVAdd L E
inst✝ : VAddInvariantMeasure L E μ
fund : IsAddFundamentalDomain L F
hS : NullMeasurableSet s
h : ∀ (x y : L), x ≠ y → Disjoint (x +ᵥ s) (y +ᵥ s)
⊢ ↑↑μ s ≤ ↑↑μ F
[PROOFSTEP]
exact
  ((fund.measure_eq_tsum _).trans
        (measure_iUnion₀ (Pairwise.mono h fun i j hij => (hij.mono inf_le_left inf_le_left).aedisjoint) fun _ =>
            (hS.vadd _).inter fund.nullMeasurableSet).symm).trans_le
    (measure_mono <| Set.iUnion_subset fun _ => Set.inter_subset_right _ _)
[GOAL]
E : Type u_1
L✝ : Type u_2
inst✝⁶ : MeasurableSpace E
μ : Measure E
F s : Set E
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : BorelSpace E
inst✝² : FiniteDimensional ℝ E
inst✝¹ : IsAddHaarMeasure μ
L : AddSubgroup E
inst✝ : Countable { x // x ∈ L }
fund : IsAddFundamentalDomain { x // x ∈ L } F
h : ↑↑μ F * 2 ^ finrank ℝ E < ↑↑μ s
h_symm : ∀ (x : E), x ∈ s → -x ∈ s
h_conv : Convex ℝ s
⊢ ∃ x x_1, ↑x ∈ s
[PROOFSTEP]
have h_vol : μ F < μ ((2⁻¹ : ℝ) • s) :=
  by
  rw [addHaar_smul_of_nonneg μ (by norm_num : 0 ≤ (2 : ℝ)⁻¹) s, ←
    mul_lt_mul_right (pow_ne_zero (finrank ℝ E) (two_ne_zero' _)) (pow_ne_top two_ne_top), mul_right_comm,
    ofReal_pow (by norm_num : 0 ≤ (2 : ℝ)⁻¹), ← ofReal_inv_of_pos zero_lt_two]
  norm_num
  rwa [← mul_pow, ENNReal.inv_mul_cancel two_ne_zero two_ne_top, one_pow, one_mul]
[GOAL]
E : Type u_1
L✝ : Type u_2
inst✝⁶ : MeasurableSpace E
μ : Measure E
F s : Set E
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : BorelSpace E
inst✝² : FiniteDimensional ℝ E
inst✝¹ : IsAddHaarMeasure μ
L : AddSubgroup E
inst✝ : Countable { x // x ∈ L }
fund : IsAddFundamentalDomain { x // x ∈ L } F
h : ↑↑μ F * 2 ^ finrank ℝ E < ↑↑μ s
h_symm : ∀ (x : E), x ∈ s → -x ∈ s
h_conv : Convex ℝ s
⊢ ↑↑μ F < ↑↑μ (2⁻¹ • s)
[PROOFSTEP]
rw [addHaar_smul_of_nonneg μ (by norm_num : 0 ≤ (2 : ℝ)⁻¹) s, ←
  mul_lt_mul_right (pow_ne_zero (finrank ℝ E) (two_ne_zero' _)) (pow_ne_top two_ne_top), mul_right_comm,
  ofReal_pow (by norm_num : 0 ≤ (2 : ℝ)⁻¹), ← ofReal_inv_of_pos zero_lt_two]
[GOAL]
E : Type u_1
L✝ : Type u_2
inst✝⁶ : MeasurableSpace E
μ : Measure E
F s : Set E
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : BorelSpace E
inst✝² : FiniteDimensional ℝ E
inst✝¹ : IsAddHaarMeasure μ
L : AddSubgroup E
inst✝ : Countable { x // x ∈ L }
fund : IsAddFundamentalDomain { x // x ∈ L } F
h : ↑↑μ F * 2 ^ finrank ℝ E < ↑↑μ s
h_symm : ∀ (x : E), x ∈ s → -x ∈ s
h_conv : Convex ℝ s
⊢ 0 ≤ 2⁻¹
[PROOFSTEP]
norm_num
[GOAL]
E : Type u_1
L✝ : Type u_2
inst✝⁶ : MeasurableSpace E
μ : Measure E
F s : Set E
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : BorelSpace E
inst✝² : FiniteDimensional ℝ E
inst✝¹ : IsAddHaarMeasure μ
L : AddSubgroup E
inst✝ : Countable { x // x ∈ L }
fund : IsAddFundamentalDomain { x // x ∈ L } F
h : ↑↑μ F * 2 ^ finrank ℝ E < ↑↑μ s
h_symm : ∀ (x : E), x ∈ s → -x ∈ s
h_conv : Convex ℝ s
⊢ 0 ≤ 2⁻¹
[PROOFSTEP]
norm_num
[GOAL]
E : Type u_1
L✝ : Type u_2
inst✝⁶ : MeasurableSpace E
μ : Measure E
F s : Set E
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : BorelSpace E
inst✝² : FiniteDimensional ℝ E
inst✝¹ : IsAddHaarMeasure μ
L : AddSubgroup E
inst✝ : Countable { x // x ∈ L }
fund : IsAddFundamentalDomain { x // x ∈ L } F
h : ↑↑μ F * 2 ^ finrank ℝ E < ↑↑μ s
h_symm : ∀ (x : E), x ∈ s → -x ∈ s
h_conv : Convex ℝ s
⊢ ↑↑μ F * 2 ^ finrank ℝ E < (ENNReal.ofReal 2)⁻¹ ^ finrank ℝ E * 2 ^ finrank ℝ E * ↑↑μ s
[PROOFSTEP]
norm_num
[GOAL]
E : Type u_1
L✝ : Type u_2
inst✝⁶ : MeasurableSpace E
μ : Measure E
F s : Set E
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : BorelSpace E
inst✝² : FiniteDimensional ℝ E
inst✝¹ : IsAddHaarMeasure μ
L : AddSubgroup E
inst✝ : Countable { x // x ∈ L }
fund : IsAddFundamentalDomain { x // x ∈ L } F
h : ↑↑μ F * 2 ^ finrank ℝ E < ↑↑μ s
h_symm : ∀ (x : E), x ∈ s → -x ∈ s
h_conv : Convex ℝ s
⊢ ↑↑μ F * 2 ^ finrank ℝ E < 2⁻¹ ^ finrank ℝ E * 2 ^ finrank ℝ E * ↑↑μ s
[PROOFSTEP]
rwa [← mul_pow, ENNReal.inv_mul_cancel two_ne_zero two_ne_top, one_pow, one_mul]
[GOAL]
E : Type u_1
L✝ : Type u_2
inst✝⁶ : MeasurableSpace E
μ : Measure E
F s : Set E
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : BorelSpace E
inst✝² : FiniteDimensional ℝ E
inst✝¹ : IsAddHaarMeasure μ
L : AddSubgroup E
inst✝ : Countable { x // x ∈ L }
fund : IsAddFundamentalDomain { x // x ∈ L } F
h : ↑↑μ F * 2 ^ finrank ℝ E < ↑↑μ s
h_symm : ∀ (x : E), x ∈ s → -x ∈ s
h_conv : Convex ℝ s
h_vol : ↑↑μ F < ↑↑μ (2⁻¹ • s)
⊢ ∃ x x_1, ↑x ∈ s
[PROOFSTEP]
obtain ⟨x, y, hxy, h⟩ := exists_pair_mem_lattice_not_disjoint_vadd fund ((h_conv.smul _).nullMeasurableSet _) h_vol
[GOAL]
case intro.intro.intro
E : Type u_1
L✝ : Type u_2
inst✝⁶ : MeasurableSpace E
μ : Measure E
F s : Set E
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : BorelSpace E
inst✝² : FiniteDimensional ℝ E
inst✝¹ : IsAddHaarMeasure μ
L : AddSubgroup E
inst✝ : Countable { x // x ∈ L }
fund : IsAddFundamentalDomain { x // x ∈ L } F
h✝ : ↑↑μ F * 2 ^ finrank ℝ E < ↑↑μ s
h_symm : ∀ (x : E), x ∈ s → -x ∈ s
h_conv : Convex ℝ s
h_vol : ↑↑μ F < ↑↑μ (2⁻¹ • s)
x y : { x // x ∈ L }
hxy : x ≠ y
h : ¬Disjoint (x +ᵥ 2⁻¹ • s) (y +ᵥ 2⁻¹ • s)
⊢ ∃ x x_1, ↑x ∈ s
[PROOFSTEP]
obtain ⟨_, ⟨v, hv, rfl⟩, w, hw, hvw⟩ := Set.not_disjoint_iff.mp h
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.intro.intro
E : Type u_1
L✝ : Type u_2
inst✝⁶ : MeasurableSpace E
μ : Measure E
F s : Set E
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : BorelSpace E
inst✝² : FiniteDimensional ℝ E
inst✝¹ : IsAddHaarMeasure μ
L : AddSubgroup E
inst✝ : Countable { x // x ∈ L }
fund : IsAddFundamentalDomain { x // x ∈ L } F
h✝ : ↑↑μ F * 2 ^ finrank ℝ E < ↑↑μ s
h_symm : ∀ (x : E), x ∈ s → -x ∈ s
h_conv : Convex ℝ s
h_vol : ↑↑μ F < ↑↑μ (2⁻¹ • s)
x y : { x // x ∈ L }
hxy : x ≠ y
h : ¬Disjoint (x +ᵥ 2⁻¹ • s) (y +ᵥ 2⁻¹ • s)
v : E
hv : v ∈ 2⁻¹ • s
w : E
hw : w ∈ 2⁻¹ • s
hvw : (fun x => y +ᵥ x) w = (fun x_1 => x +ᵥ x_1) v
⊢ ∃ x x_1, ↑x ∈ s
[PROOFSTEP]
refine' ⟨x - y, sub_ne_zero.2 hxy, _⟩
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.intro.intro
E : Type u_1
L✝ : Type u_2
inst✝⁶ : MeasurableSpace E
μ : Measure E
F s : Set E
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : BorelSpace E
inst✝² : FiniteDimensional ℝ E
inst✝¹ : IsAddHaarMeasure μ
L : AddSubgroup E
inst✝ : Countable { x // x ∈ L }
fund : IsAddFundamentalDomain { x // x ∈ L } F
h✝ : ↑↑μ F * 2 ^ finrank ℝ E < ↑↑μ s
h_symm : ∀ (x : E), x ∈ s → -x ∈ s
h_conv : Convex ℝ s
h_vol : ↑↑μ F < ↑↑μ (2⁻¹ • s)
x y : { x // x ∈ L }
hxy : x ≠ y
h : ¬Disjoint (x +ᵥ 2⁻¹ • s) (y +ᵥ 2⁻¹ • s)
v : E
hv : v ∈ 2⁻¹ • s
w : E
hw : w ∈ 2⁻¹ • s
hvw : (fun x => y +ᵥ x) w = (fun x_1 => x +ᵥ x_1) v
⊢ ↑(x - y) ∈ s
[PROOFSTEP]
rw [Set.mem_inv_smul_set_iff₀ (two_ne_zero' ℝ)] at hv hw
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.intro.intro
E : Type u_1
L✝ : Type u_2
inst✝⁶ : MeasurableSpace E
μ : Measure E
F s : Set E
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : BorelSpace E
inst✝² : FiniteDimensional ℝ E
inst✝¹ : IsAddHaarMeasure μ
L : AddSubgroup E
inst✝ : Countable { x // x ∈ L }
fund : IsAddFundamentalDomain { x // x ∈ L } F
h✝ : ↑↑μ F * 2 ^ finrank ℝ E < ↑↑μ s
h_symm : ∀ (x : E), x ∈ s → -x ∈ s
h_conv : Convex ℝ s
h_vol : ↑↑μ F < ↑↑μ (2⁻¹ • s)
x y : { x // x ∈ L }
hxy : x ≠ y
h : ¬Disjoint (x +ᵥ 2⁻¹ • s) (y +ᵥ 2⁻¹ • s)
v : E
hv : 2 • v ∈ s
w : E
hw : 2 • w ∈ s
hvw : (fun x => y +ᵥ x) w = (fun x_1 => x +ᵥ x_1) v
⊢ ↑(x - y) ∈ s
[PROOFSTEP]
simp_rw [AddSubgroup.vadd_def, vadd_eq_add, add_comm _ w, ← sub_eq_sub_iff_add_eq_add, ← AddSubgroup.coe_sub] at hvw
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.intro.intro
E : Type u_1
L✝ : Type u_2
inst✝⁶ : MeasurableSpace E
μ : Measure E
F s : Set E
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : BorelSpace E
inst✝² : FiniteDimensional ℝ E
inst✝¹ : IsAddHaarMeasure μ
L : AddSubgroup E
inst✝ : Countable { x // x ∈ L }
fund : IsAddFundamentalDomain { x // x ∈ L } F
h✝ : ↑↑μ F * 2 ^ finrank ℝ E < ↑↑μ s
h_symm : ∀ (x : E), x ∈ s → -x ∈ s
h_conv : Convex ℝ s
h_vol : ↑↑μ F < ↑↑μ (2⁻¹ • s)
x y : { x // x ∈ L }
hxy : x ≠ y
h : ¬Disjoint (x +ᵥ 2⁻¹ • s) (y +ᵥ 2⁻¹ • s)
v : E
hv : 2 • v ∈ s
w : E
hw : 2 • w ∈ s
hvw : w - v = ↑(x - y)
⊢ ↑(x - y) ∈ s
[PROOFSTEP]
rw [← hvw, ← inv_smul_smul₀ (two_ne_zero' ℝ) (_ - _), smul_sub, sub_eq_add_neg, smul_add]
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.intro.intro
E : Type u_1
L✝ : Type u_2
inst✝⁶ : MeasurableSpace E
μ : Measure E
F s : Set E
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : BorelSpace E
inst✝² : FiniteDimensional ℝ E
inst✝¹ : IsAddHaarMeasure μ
L : AddSubgroup E
inst✝ : Countable { x // x ∈ L }
fund : IsAddFundamentalDomain { x // x ∈ L } F
h✝ : ↑↑μ F * 2 ^ finrank ℝ E < ↑↑μ s
h_symm : ∀ (x : E), x ∈ s → -x ∈ s
h_conv : Convex ℝ s
h_vol : ↑↑μ F < ↑↑μ (2⁻¹ • s)
x y : { x // x ∈ L }
hxy : x ≠ y
h : ¬Disjoint (x +ᵥ 2⁻¹ • s) (y +ᵥ 2⁻¹ • s)
v : E
hv : 2 • v ∈ s
w : E
hw : 2 • w ∈ s
hvw : w - v = ↑(x - y)
⊢ 2⁻¹ • 2 • w + 2⁻¹ • -(2 • v) ∈ s
[PROOFSTEP]
refine' h_conv hw (h_symm _ hv) _ _ _
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.intro.intro.refine'_1
E : Type u_1
L✝ : Type u_2
inst✝⁶ : MeasurableSpace E
μ : Measure E
F s : Set E
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : BorelSpace E
inst✝² : FiniteDimensional ℝ E
inst✝¹ : IsAddHaarMeasure μ
L : AddSubgroup E
inst✝ : Countable { x // x ∈ L }
fund : IsAddFundamentalDomain { x // x ∈ L } F
h✝ : ↑↑μ F * 2 ^ finrank ℝ E < ↑↑μ s
h_symm : ∀ (x : E), x ∈ s → -x ∈ s
h_conv : Convex ℝ s
h_vol : ↑↑μ F < ↑↑μ (2⁻¹ • s)
x y : { x // x ∈ L }
hxy : x ≠ y
h : ¬Disjoint (x +ᵥ 2⁻¹ • s) (y +ᵥ 2⁻¹ • s)
v : E
hv : 2 • v ∈ s
w : E
hw : 2 • w ∈ s
hvw : w - v = ↑(x - y)
⊢ 0 ≤ 2⁻¹
[PROOFSTEP]
norm_num
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.intro.intro.refine'_2
E : Type u_1
L✝ : Type u_2
inst✝⁶ : MeasurableSpace E
μ : Measure E
F s : Set E
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : BorelSpace E
inst✝² : FiniteDimensional ℝ E
inst✝¹ : IsAddHaarMeasure μ
L : AddSubgroup E
inst✝ : Countable { x // x ∈ L }
fund : IsAddFundamentalDomain { x // x ∈ L } F
h✝ : ↑↑μ F * 2 ^ finrank ℝ E < ↑↑μ s
h_symm : ∀ (x : E), x ∈ s → -x ∈ s
h_conv : Convex ℝ s
h_vol : ↑↑μ F < ↑↑μ (2⁻¹ • s)
x y : { x // x ∈ L }
hxy : x ≠ y
h : ¬Disjoint (x +ᵥ 2⁻¹ • s) (y +ᵥ 2⁻¹ • s)
v : E
hv : 2 • v ∈ s
w : E
hw : 2 • w ∈ s
hvw : w - v = ↑(x - y)
⊢ 0 ≤ 2⁻¹
[PROOFSTEP]
norm_num
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.intro.intro.refine'_3
E : Type u_1
L✝ : Type u_2
inst✝⁶ : MeasurableSpace E
μ : Measure E
F s : Set E
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : BorelSpace E
inst✝² : FiniteDimensional ℝ E
inst✝¹ : IsAddHaarMeasure μ
L : AddSubgroup E
inst✝ : Countable { x // x ∈ L }
fund : IsAddFundamentalDomain { x // x ∈ L } F
h✝ : ↑↑μ F * 2 ^ finrank ℝ E < ↑↑μ s
h_symm : ∀ (x : E), x ∈ s → -x ∈ s
h_conv : Convex ℝ s
h_vol : ↑↑μ F < ↑↑μ (2⁻¹ • s)
x y : { x // x ∈ L }
hxy : x ≠ y
h : ¬Disjoint (x +ᵥ 2⁻¹ • s) (y +ᵥ 2⁻¹ • s)
v : E
hv : 2 • v ∈ s
w : E
hw : 2 • w ∈ s
hvw : w - v = ↑(x - y)
⊢ 2⁻¹ + 2⁻¹ = 1
[PROOFSTEP]
norm_num


[GOAL]
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
S : DiscreteQuotient X
toSetoid✝¹ : Setoid X
isOpen_setOf_rel✝¹ : ∀ (x : X), IsOpen (setOf (Setoid.Rel toSetoid✝¹ x))
toSetoid✝ : Setoid X
isOpen_setOf_rel✝ : ∀ (x : X), IsOpen (setOf (Setoid.Rel toSetoid✝ x))
x✝ :
  { toSetoid := toSetoid✝¹, isOpen_setOf_rel := isOpen_setOf_rel✝¹ }.toSetoid =
    { toSetoid := toSetoid✝, isOpen_setOf_rel := isOpen_setOf_rel✝ }.toSetoid
⊢ { toSetoid := toSetoid✝¹, isOpen_setOf_rel := isOpen_setOf_rel✝¹ } =
    { toSetoid := toSetoid✝, isOpen_setOf_rel := isOpen_setOf_rel✝ }
[PROOFSTEP]
congr
[GOAL]
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
S : DiscreteQuotient X
A : Set X
h : IsClopen A
x : X
⊢ IsOpen (setOf (Setoid.Rel { r := fun x y => x ∈ A ↔ y ∈ A, iseqv := (_ : Equivalence fun x y => x ∈ A ↔ y ∈ A) } x))
[PROOFSTEP]
by_cases hx : x ∈ A
[GOAL]
case pos
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
S : DiscreteQuotient X
A : Set X
h : IsClopen A
x : X
hx : x ∈ A
⊢ IsOpen (setOf (Setoid.Rel { r := fun x y => x ∈ A ↔ y ∈ A, iseqv := (_ : Equivalence fun x y => x ∈ A ↔ y ∈ A) } x))
[PROOFSTEP]
simp [Setoid.Rel, hx, h.1, h.2, ← compl_setOf]
[GOAL]
case neg
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
S : DiscreteQuotient X
A : Set X
h : IsClopen A
x : X
hx : ¬x ∈ A
⊢ IsOpen (setOf (Setoid.Rel { r := fun x y => x ∈ A ↔ y ∈ A, iseqv := (_ : Equivalence fun x y => x ∈ A ↔ y ∈ A) } x))
[PROOFSTEP]
simp [Setoid.Rel, hx, h.1, h.2, ← compl_setOf]
[GOAL]
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
S : DiscreteQuotient X
x : X
⊢ IsOpen {proj S x}
[PROOFSTEP]
rw [← S.proj_quotientMap.isOpen_preimage, fiber_eq]
[GOAL]
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
S : DiscreteQuotient X
x : X
⊢ IsOpen (setOf (Setoid.Rel S.toSetoid x))
[PROOFSTEP]
exact S.isOpen_setOf_rel _
[GOAL]
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
S : DiscreteQuotient X
x : X
⊢ IsClopen (setOf (Setoid.Rel S.toSetoid x))
[PROOFSTEP]
rw [← fiber_eq]
[GOAL]
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
S : DiscreteQuotient X
x : X
⊢ IsClopen (proj S ⁻¹' {proj S x})
[PROOFSTEP]
apply isClopen_preimage
[GOAL]
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
S a : DiscreteQuotient X
⊢ a ≤ ⊤
[PROOFSTEP]
tauto
[GOAL]
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
S : DiscreteQuotient X
⊢ ∀ (a b : Quotient ⊤.toSetoid), a = b
[PROOFSTEP]
rintro ⟨_⟩ ⟨_⟩
[GOAL]
case mk.mk
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
S : DiscreteQuotient X
a✝² : Quotient ⊤.toSetoid
a✝¹ : X
b✝ : Quotient ⊤.toSetoid
a✝ : X
⊢ Quot.mk Setoid.r a✝¹ = Quot.mk Setoid.r a✝
[PROOFSTEP]
exact Quotient.sound trivial
[GOAL]
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
S : DiscreteQuotient X
g : C(Y, Z)
f : C(X, Y)
A B : DiscreteQuotient Y
h : A ≤ B
⊢ comap f A ≤ comap f B
[PROOFSTEP]
tauto
[GOAL]
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
S A B C : DiscreteQuotient X
⊢ ofLE (_ : A ≤ A) = id
[PROOFSTEP]
ext ⟨⟩
[GOAL]
case h.mk
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
S A B C : DiscreteQuotient X
x✝ : Quotient A.toSetoid
a✝ : X
⊢ ofLE (_ : A ≤ A) (Quot.mk Setoid.r a✝) = id (Quot.mk Setoid.r a✝)
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
S A B C : DiscreteQuotient X
a : Quotient A.toSetoid
⊢ ofLE (_ : A ≤ A) a = a
[PROOFSTEP]
simp
[GOAL]
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
S A B C : DiscreteQuotient X
h₁ : A ≤ B
h₂ : B ≤ C
x : Quotient A.toSetoid
⊢ ofLE h₂ (ofLE h₁ x) = ofLE (_ : A ≤ C) x
[PROOFSTEP]
rcases x with ⟨⟩
[GOAL]
case mk
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
S A B C : DiscreteQuotient X
h₁ : A ≤ B
h₂ : B ≤ C
x : Quotient A.toSetoid
a✝ : X
⊢ ofLE h₂ (ofLE h₁ (Quot.mk Setoid.r a✝)) = ofLE (_ : A ≤ C) (Quot.mk Setoid.r a✝)
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
S : DiscreteQuotient X
inst✝ : LocallyConnectedSpace X
x : X
⊢ IsOpen (setOf (Setoid.Rel (connectedComponentSetoid X) x))
[PROOFSTEP]
convert isOpen_connectedComponent (x := x)
[GOAL]
case h.e'_3
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
S : DiscreteQuotient X
inst✝ : LocallyConnectedSpace X
x : X
⊢ setOf (Setoid.Rel (connectedComponentSetoid X) x) = connectedComponent x
[PROOFSTEP]
ext y
[GOAL]
case h.e'_3.h
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
S : DiscreteQuotient X
inst✝ : LocallyConnectedSpace X
x y : X
⊢ y ∈ setOf (Setoid.Rel (connectedComponentSetoid X) x) ↔ y ∈ connectedComponent x
[PROOFSTEP]
simpa only [connectedComponentSetoid, ← connectedComponent_eq_iff_mem] using eq_comm
[GOAL]
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
S : DiscreteQuotient X
inst✝ : DiscreteTopology X
x y : X
⊢ proj ⊥ x = proj ⊥ y ↔ x = y
[PROOFSTEP]
simp
[GOAL]
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
S : DiscreteQuotient X
f : C(X, Y)
A A' : DiscreteQuotient X
B B' : DiscreteQuotient Y
g : C(Y, Z)
C : DiscreteQuotient Z
⊢ LEComap g B C → LEComap f A B → LEComap (ContinuousMap.comp g f) A C
[PROOFSTEP]
tauto
[GOAL]
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
S : DiscreteQuotient X
f : C(X, Y)
A A' : DiscreteQuotient X
B B' : DiscreteQuotient Y
g : C(Y, Z)
C : DiscreteQuotient Z
⊢ map (ContinuousMap.id X) (_ : LEComap (ContinuousMap.id X) A A) = id
[PROOFSTEP]
ext ⟨⟩
[GOAL]
case h.mk
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
S : DiscreteQuotient X
f : C(X, Y)
A A' : DiscreteQuotient X
B B' : DiscreteQuotient Y
g : C(Y, Z)
C : DiscreteQuotient Z
x✝ : Quotient A.toSetoid
a✝ : X
⊢ map (ContinuousMap.id X) (_ : LEComap (ContinuousMap.id X) A A) (Quot.mk Setoid.r a✝) = id (Quot.mk Setoid.r a✝)
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
S : DiscreteQuotient X
f : C(X, Y)
A A' : DiscreteQuotient X
B B' : DiscreteQuotient Y
g : C(Y, Z)
C : DiscreteQuotient Z
h1 : LEComap g B C
h2 : LEComap f A B
⊢ map (ContinuousMap.comp g f) (_ : LEComap (ContinuousMap.comp g f) A C) = map g h1 ∘ map f h2
[PROOFSTEP]
ext ⟨⟩
[GOAL]
case h.mk
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
S : DiscreteQuotient X
f : C(X, Y)
A A' : DiscreteQuotient X
B B' : DiscreteQuotient Y
g : C(Y, Z)
C : DiscreteQuotient Z
h1 : LEComap g B C
h2 : LEComap f A B
x✝ : Quotient A.toSetoid
a✝ : X
⊢ map (ContinuousMap.comp g f) (_ : LEComap (ContinuousMap.comp g f) A C) (Quot.mk Setoid.r a✝) =
    (map g h1 ∘ map f h2) (Quot.mk Setoid.r a✝)
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
S : DiscreteQuotient X
f : C(X, Y)
A A' : DiscreteQuotient X
B B' : DiscreteQuotient Y
g : C(Y, Z)
C : DiscreteQuotient Z
cond : LEComap f A B
h : B ≤ B'
a : Quotient A.toSetoid
⊢ ofLE h (map f cond a) = map f (_ : LEComap f A B') a
[PROOFSTEP]
rcases a with ⟨⟩
[GOAL]
case mk
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
S : DiscreteQuotient X
f : C(X, Y)
A A' : DiscreteQuotient X
B B' : DiscreteQuotient Y
g : C(Y, Z)
C : DiscreteQuotient Z
cond : LEComap f A B
h : B ≤ B'
a : Quotient A.toSetoid
a✝ : X
⊢ ofLE h (map f cond (Quot.mk Setoid.r a✝)) = map f (_ : LEComap f A B') (Quot.mk Setoid.r a✝)
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
S : DiscreteQuotient X
f : C(X, Y)
A A' : DiscreteQuotient X
B B' : DiscreteQuotient Y
g : C(Y, Z)
C : DiscreteQuotient Z
cond : LEComap f A B
h : A' ≤ A
c : Quotient A'.toSetoid
⊢ map f cond (ofLE h c) = map f (_ : LEComap f A' B) c
[PROOFSTEP]
rcases c with ⟨⟩
[GOAL]
case mk
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
S : DiscreteQuotient X
f : C(X, Y)
A A' : DiscreteQuotient X
B B' : DiscreteQuotient Y
g : C(Y, Z)
C : DiscreteQuotient Z
cond : LEComap f A B
h : A' ≤ A
c : Quotient A'.toSetoid
a✝ : X
⊢ map f cond (ofLE h (Quot.mk Setoid.r a✝)) = map f (_ : LEComap f A' B) (Quot.mk Setoid.r a✝)
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝⁴ : TopologicalSpace X
inst✝³ : TopologicalSpace Y
inst✝² : TopologicalSpace Z
S : DiscreteQuotient X
inst✝¹ : T2Space X
inst✝ : CompactSpace X
disc : TotallyDisconnectedSpace X
x y : X
h : ∀ (Q : DiscreteQuotient X), proj Q x = proj Q y
⊢ x = y
[PROOFSTEP]
rw [← mem_singleton_iff, ← connectedComponent_eq_singleton, connectedComponent_eq_iInter_clopen, mem_iInter]
[GOAL]
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝⁴ : TopologicalSpace X
inst✝³ : TopologicalSpace Y
inst✝² : TopologicalSpace Z
S : DiscreteQuotient X
inst✝¹ : T2Space X
inst✝ : CompactSpace X
disc : TotallyDisconnectedSpace X
x y : X
h : ∀ (Q : DiscreteQuotient X), proj Q x = proj Q y
⊢ ∀ (i : { Z // IsClopen Z ∧ y ∈ Z }), x ∈ ↑i
[PROOFSTEP]
rintro ⟨U, hU1, hU2⟩
[GOAL]
case mk.intro
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝⁴ : TopologicalSpace X
inst✝³ : TopologicalSpace Y
inst✝² : TopologicalSpace Z
S : DiscreteQuotient X
inst✝¹ : T2Space X
inst✝ : CompactSpace X
disc : TotallyDisconnectedSpace X
x y : X
h : ∀ (Q : DiscreteQuotient X), proj Q x = proj Q y
U : Set X
hU1 : IsClopen U
hU2 : y ∈ U
⊢ x ∈ ↑{ val := U, property := (_ : IsClopen U ∧ y ∈ U) }
[PROOFSTEP]
exact (Quotient.exact' (h (ofClopen hU1))).mpr hU2
[GOAL]
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
S A B : DiscreteQuotient X
h : A ≤ B
a : Quotient A.toSetoid
⊢ proj A ⁻¹' {a} ⊆ proj B ⁻¹' {ofLE h a}
[PROOFSTEP]
rcases A.proj_surjective a with ⟨a, rfl⟩
[GOAL]
case intro
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
S A B : DiscreteQuotient X
h : A ≤ B
a : X
⊢ proj A ⁻¹' {proj A a} ⊆ proj B ⁻¹' {ofLE h (proj A a)}
[PROOFSTEP]
rw [fiber_eq, ofLE_proj, fiber_eq]
[GOAL]
case intro
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
S A B : DiscreteQuotient X
h : A ≤ B
a : X
⊢ setOf (Setoid.Rel A.toSetoid a) ⊆ setOf (Setoid.Rel B.toSetoid a)
[PROOFSTEP]
exact fun _ h' => h h'
[GOAL]
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
S : DiscreteQuotient X
inst✝ : CompactSpace X
Qs : (Q : DiscreteQuotient X) → Quotient Q.toSetoid
compat : ∀ (A B : DiscreteQuotient X) (h : A ≤ B), ofLE h (Qs A) = Qs B
⊢ ∃ x, ∀ (Q : DiscreteQuotient X), proj Q x = Qs Q
[PROOFSTEP]
have H₁ : ∀ Q₁ Q₂, Q₁ ≤ Q₂ → proj Q₁ ⁻¹' {Qs Q₁} ⊆ proj Q₂ ⁻¹' {Qs Q₂} := fun _ _ h =>
  by
  rw [← compat _ _ h]
  exact fiber_subset_ofLE _ _
[GOAL]
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
S : DiscreteQuotient X
inst✝ : CompactSpace X
Qs : (Q : DiscreteQuotient X) → Quotient Q.toSetoid
compat : ∀ (A B : DiscreteQuotient X) (h : A ≤ B), ofLE h (Qs A) = Qs B
x✝¹ x✝ : DiscreteQuotient X
h : x✝¹ ≤ x✝
⊢ proj x✝¹ ⁻¹' {Qs x✝¹} ⊆ proj x✝ ⁻¹' {Qs x✝}
[PROOFSTEP]
rw [← compat _ _ h]
[GOAL]
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
S : DiscreteQuotient X
inst✝ : CompactSpace X
Qs : (Q : DiscreteQuotient X) → Quotient Q.toSetoid
compat : ∀ (A B : DiscreteQuotient X) (h : A ≤ B), ofLE h (Qs A) = Qs B
x✝¹ x✝ : DiscreteQuotient X
h : x✝¹ ≤ x✝
⊢ proj x✝¹ ⁻¹' {Qs x✝¹} ⊆ proj x✝ ⁻¹' {ofLE h (Qs x✝¹)}
[PROOFSTEP]
exact fiber_subset_ofLE _ _
[GOAL]
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
S : DiscreteQuotient X
inst✝ : CompactSpace X
Qs : (Q : DiscreteQuotient X) → Quotient Q.toSetoid
compat : ∀ (A B : DiscreteQuotient X) (h : A ≤ B), ofLE h (Qs A) = Qs B
H₁ : ∀ (Q₁ Q₂ : DiscreteQuotient X), Q₁ ≤ Q₂ → proj Q₁ ⁻¹' {Qs Q₁} ⊆ proj Q₂ ⁻¹' {Qs Q₂}
⊢ ∃ x, ∀ (Q : DiscreteQuotient X), proj Q x = Qs Q
[PROOFSTEP]
obtain ⟨x, hx⟩ : Set.Nonempty (⋂ Q, proj Q ⁻¹' {Qs Q}) :=
  IsCompact.nonempty_iInter_of_directed_nonempty_compact_closed (fun Q : DiscreteQuotient X => Q.proj ⁻¹' {Qs _})
    (directed_of_inf H₁) (fun Q => (singleton_nonempty _).preimage Q.proj_surjective)
    (fun Q => (Q.isClosed_preimage {Qs _}).isCompact) fun Q => Q.isClosed_preimage _
[GOAL]
case intro
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
S : DiscreteQuotient X
inst✝ : CompactSpace X
Qs : (Q : DiscreteQuotient X) → Quotient Q.toSetoid
compat : ∀ (A B : DiscreteQuotient X) (h : A ≤ B), ofLE h (Qs A) = Qs B
H₁ : ∀ (Q₁ Q₂ : DiscreteQuotient X), Q₁ ≤ Q₂ → proj Q₁ ⁻¹' {Qs Q₁} ⊆ proj Q₂ ⁻¹' {Qs Q₂}
x : X
hx : x ∈ ⋂ (Q : DiscreteQuotient X), proj Q ⁻¹' {Qs Q}
⊢ ∃ x, ∀ (Q : DiscreteQuotient X), proj Q x = Qs Q
[PROOFSTEP]
exact ⟨x, mem_iInter.1 hx⟩
[GOAL]
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
S : DiscreteQuotient X
inst✝ : CompactSpace X
⊢ Finite (Quotient S.toSetoid)
[PROOFSTEP]
have : CompactSpace S := Quotient.compactSpace
[GOAL]
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
S : DiscreteQuotient X
inst✝ : CompactSpace X
this : CompactSpace (Quotient S.toSetoid)
⊢ Finite (Quotient S.toSetoid)
[PROOFSTEP]
rwa [← isCompact_univ_iff, isCompact_iff_finite, finite_univ_iff] at this


[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
f : α → β
p : Pmf α
b : β
⊢ ↑(map f p) b = ∑' (a : α), if b = f a then ↑p a else 0
[PROOFSTEP]
simp [map]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
f : α → β
p : Pmf α
b✝ b : β
⊢ b ∈ support (map f p) ↔ b ∈ f '' support p
[PROOFSTEP]
simp [map, @eq_comm β b]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
f : α → β
p : Pmf α
b : β
⊢ b ∈ support (map f p) ↔ ∃ a, a ∈ support p ∧ f a = b
[PROOFSTEP]
simp
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
f : α → β
p : Pmf α
b : β
g : β → γ
⊢ map g (map f p) = map (g ∘ f) p
[PROOFSTEP]
simp [map, Function.comp]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
f : α → β
p : Pmf α
b : β
⊢ map (Function.const α b) p = pure b
[PROOFSTEP]
simp only [map, Function.comp, bind_const, Function.const]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
f : α → β
p : Pmf α
b : β
s : Set β
⊢ ↑(toOuterMeasure (map f p)) s = ↑(toOuterMeasure p) (f ⁻¹' s)
[PROOFSTEP]
simp [map, Set.indicator, toOuterMeasure_apply p (f ⁻¹' s)]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
f : α → β
p : Pmf α
b : β
s : Set β
inst✝¹ : MeasurableSpace α
inst✝ : MeasurableSpace β
hf : Measurable f
hs : MeasurableSet s
⊢ ↑↑(toMeasure (map f p)) s = ↑↑(toMeasure p) (f ⁻¹' s)
[PROOFSTEP]
rw [toMeasure_apply_eq_toOuterMeasure_apply _ s hs,
  toMeasure_apply_eq_toOuterMeasure_apply _ (f ⁻¹' s) (measurableSet_preimage hf hs)]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
f : α → β
p : Pmf α
b : β
s : Set β
inst✝¹ : MeasurableSpace α
inst✝ : MeasurableSpace β
hf : Measurable f
hs : MeasurableSet s
⊢ ↑(toOuterMeasure (map f p)) s = ↑(toOuterMeasure p) (f ⁻¹' s)
[PROOFSTEP]
exact toOuterMeasure_map_apply f p s
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
q : Pmf (α → β)
p : Pmf α
b : β
⊢ ↑(seq q p) b = ∑' (f : α → β) (a : α), if b = f a then ↑q f * ↑p a else 0
[PROOFSTEP]
simp only [seq, mul_boole, bind_apply, pure_apply]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
q : Pmf (α → β)
p : Pmf α
b : β
⊢ (∑' (a : α → β), ↑q a * ∑' (a_1 : α), if b = a a_1 then ↑p a_1 else 0) =
    ∑' (f : α → β) (a : α), if b = f a then ↑q f * ↑p a else 0
[PROOFSTEP]
refine' tsum_congr fun f => ENNReal.tsum_mul_left.symm.trans (tsum_congr fun a => _)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
q : Pmf (α → β)
p : Pmf α
b : β
f : α → β
a : α
⊢ (↑q f * if b = f a then ↑p a else 0) = if b = f a then ↑q f * ↑p a else 0
[PROOFSTEP]
simpa only [mul_zero] using mul_ite (b = f a) (q f) (p a) 0
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
q : Pmf (α → β)
p : Pmf α
b✝ b : β
⊢ b ∈ support (seq q p) ↔ b ∈ ⋃ (f : α → β) (_ : f ∈ support q), f '' support p
[PROOFSTEP]
simp [-mem_support_iff, seq, @eq_comm β b]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
q : Pmf (α → β)
p : Pmf α
b : β
⊢ b ∈ support (seq q p) ↔ ∃ f, f ∈ support q ∧ b ∈ f '' support p
[PROOFSTEP]
simp
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
f : α → ℝ≥0∞
s : Finset α
h : ∑ a in s, f a = 1
h' : ∀ (a : α), ¬a ∈ s → f a = 0
a : α
⊢ a ∈ support (ofFinset f s h h') ↔ a ∈ ↑s ∩ Function.support f
[PROOFSTEP]
simpa [mem_support_iff] using mt (h' a)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
f : α → ℝ≥0∞
s : Finset α
h : ∑ a in s, f a = 1
h' : ∀ (a : α), ¬a ∈ s → f a = 0
a : α
⊢ a ∈ support (ofFinset f s h h') ↔ a ∈ s ∧ f a ≠ 0
[PROOFSTEP]
simp
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
f : α → ℝ≥0∞
hf0 : tsum f ≠ 0
hf : tsum f ≠ ⊤
a : α
⊢ a ∈ support (normalize f hf0 hf) ↔ a ∈ Function.support f
[PROOFSTEP]
simp [hf, mem_support_iff]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
f : α → ℝ≥0∞
hf0 : tsum f ≠ 0
hf : tsum f ≠ ⊤
a : α
⊢ a ∈ support (normalize f hf0 hf) ↔ f a ≠ 0
[PROOFSTEP]
simp
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
p : Pmf α
s : Set α
h : ∃ a, a ∈ s ∧ a ∈ support p
⊢ tsum (Set.indicator s ↑p) ≠ 0
[PROOFSTEP]
simpa using h
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
p : Pmf α
s : Set α
h : ∃ a, a ∈ s ∧ a ∈ support p
a : α
⊢ ↑(filter p s h) a = Set.indicator s (↑p) a * (∑' (a' : α), Set.indicator s (↑p) a')⁻¹
[PROOFSTEP]
rw [filter, normalize_apply]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
p : Pmf α
s : Set α
h : ∃ a, a ∈ s ∧ a ∈ support p
a : α
ha : ¬a ∈ s
⊢ ↑(filter p s h) a = 0
[PROOFSTEP]
rw [filter_apply, Set.indicator_apply_eq_zero.mpr fun ha' => absurd ha' ha, zero_mul]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
p : Pmf α
s : Set α
h : ∃ a, a ∈ s ∧ a ∈ support p
a : α
⊢ ↑(filter p s h) a = 0 ↔ ¬a ∈ s ∨ ¬a ∈ support p
[PROOFSTEP]
erw [apply_eq_zero_iff, support_filter, Set.mem_inter_iff, not_and_or]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
p : Pmf α
s : Set α
h : ∃ a, a ∈ s ∧ a ∈ support p
a : α
⊢ ↑(filter p s h) a ≠ 0 ↔ a ∈ s ∧ a ∈ support p
[PROOFSTEP]
rw [Ne.def, filter_apply_eq_zero_iff, not_or, Classical.not_not, Classical.not_not]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
p : ℝ≥0∞
h : p ≤ 1
⊢ ∑ a : Bool, (fun b => bif b then p else 1 - p) a = 1
[PROOFSTEP]
simp [h]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
p : ℝ≥0∞
h : p ≤ 1
b : Bool
⊢ support (bernoulli p h) = {b | bif b then p ≠ 0 else p ≠ 1}
[PROOFSTEP]
refine' Set.ext fun b => _
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
p : ℝ≥0∞
h : p ≤ 1
b✝ b : Bool
⊢ b ∈ support (bernoulli p h) ↔ b ∈ {b | bif b then p ≠ 0 else p ≠ 1}
[PROOFSTEP]
induction b
[GOAL]
case false
α : Type u_1
β : Type u_2
γ : Type u_3
p : ℝ≥0∞
h : p ≤ 1
b : Bool
⊢ false ∈ support (bernoulli p h) ↔ false ∈ {b | bif b then p ≠ 0 else p ≠ 1}
[PROOFSTEP]
simp_rw [mem_support_iff, bernoulli_apply, Bool.cond_false, Ne.def, tsub_eq_zero_iff_le, not_le]
[GOAL]
case false
α : Type u_1
β : Type u_2
γ : Type u_3
p : ℝ≥0∞
h : p ≤ 1
b : Bool
⊢ p < 1 ↔ false ∈ {b | bif b then ¬p = 0 else ¬p = 1}
[PROOFSTEP]
exact ⟨ne_of_lt, lt_of_le_of_ne h⟩
[GOAL]
case true
α : Type u_1
β : Type u_2
γ : Type u_3
p : ℝ≥0∞
h : p ≤ 1
b : Bool
⊢ true ∈ support (bernoulli p h) ↔ true ∈ {b | bif b then p ≠ 0 else p ≠ 1}
[PROOFSTEP]
simp only [mem_support_iff, bernoulli_apply, Bool.cond_true, Set.mem_setOf_eq]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
p : ℝ≥0∞
h : p ≤ 1
b : Bool
⊢ b ∈ support (bernoulli p h) ↔ bif b then p ≠ 0 else p ≠ 1
[PROOFSTEP]
simp