[GOAL]
n : Type u_1
inst✝⁴ : Fintype n
R : Type u_2
M : Type u_3
inst✝³ : CommRing R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b : Basis n R M
inst✝ : DecidableEq n
A : Matrix n n R
hA : IsUnit (det A)
⊢ M ≃ₗ[R] M
[PROOFSTEP]
refine'
  { toLin b b A with
    toFun := toLin b b A
    invFun := toLin b b A⁻¹
    left_inv := fun x => _
    right_inv := fun x => _ }
[GOAL]
case refine'_1
n : Type u_1
inst✝⁴ : Fintype n
R : Type u_2
M : Type u_3
inst✝³ : CommRing R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b : Basis n R M
inst✝ : DecidableEq n
A : Matrix n n R
hA : IsUnit (det A)
src✝ : (fun x => M →ₗ[R] M) A := ↑(toLin b b) A
x : M
⊢ ↑(↑(toLin b b) A⁻¹)
      (AddHom.toFun
        {
            toAddHom :=
              { toFun := ↑(↑(toLin b b) A),
                map_add' :=
                  (_ :
                    ∀ (x y : M),
                      AddHom.toFun src✝.toAddHom (x + y) =
                        AddHom.toFun src✝.toAddHom x + AddHom.toFun src✝.toAddHom y) },
            map_smul' :=
              (_ :
                ∀ (r : R) (x : M),
                  AddHom.toFun src✝.toAddHom (r • x) = ↑(RingHom.id R) r • AddHom.toFun src✝.toAddHom x) }.toAddHom
        x) =
    x
[PROOFSTEP]
simp only
[GOAL]
case refine'_2
n : Type u_1
inst✝⁴ : Fintype n
R : Type u_2
M : Type u_3
inst✝³ : CommRing R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b : Basis n R M
inst✝ : DecidableEq n
A : Matrix n n R
hA : IsUnit (det A)
src✝ : (fun x => M →ₗ[R] M) A := ↑(toLin b b) A
x : M
⊢ AddHom.toFun
      {
          toAddHom :=
            { toFun := ↑(↑(toLin b b) A),
              map_add' :=
                (_ :
                  ∀ (x y : M),
                    AddHom.toFun src✝.toAddHom (x + y) = AddHom.toFun src✝.toAddHom x + AddHom.toFun src✝.toAddHom y) },
          map_smul' :=
            (_ :
              ∀ (r : R) (x : M),
                AddHom.toFun src✝.toAddHom (r • x) = ↑(RingHom.id R) r • AddHom.toFun src✝.toAddHom x) }.toAddHom
      (↑(↑(toLin b b) A⁻¹) x) =
    x
[PROOFSTEP]
simp only
[GOAL]
case refine'_1
n : Type u_1
inst✝⁴ : Fintype n
R : Type u_2
M : Type u_3
inst✝³ : CommRing R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b : Basis n R M
inst✝ : DecidableEq n
A : Matrix n n R
hA : IsUnit (det A)
src✝ : (fun x => M →ₗ[R] M) A := ↑(toLin b b) A
x : M
⊢ ↑(↑(toLin b b) A⁻¹) (↑(↑(toLin b b) A) x) = x
[PROOFSTEP]
rw [← LinearMap.comp_apply]
[GOAL]
case refine'_2
n : Type u_1
inst✝⁴ : Fintype n
R : Type u_2
M : Type u_3
inst✝³ : CommRing R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b : Basis n R M
inst✝ : DecidableEq n
A : Matrix n n R
hA : IsUnit (det A)
src✝ : (fun x => M →ₗ[R] M) A := ↑(toLin b b) A
x : M
⊢ ↑(↑(toLin b b) A) (↑(↑(toLin b b) A⁻¹) x) = x
[PROOFSTEP]
rw [← LinearMap.comp_apply]
[GOAL]
case refine'_1
n : Type u_1
inst✝⁴ : Fintype n
R : Type u_2
M : Type u_3
inst✝³ : CommRing R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b : Basis n R M
inst✝ : DecidableEq n
A : Matrix n n R
hA : IsUnit (det A)
src✝ : (fun x => M →ₗ[R] M) A := ↑(toLin b b) A
x : M
⊢ ↑(comp (↑(toLin b b) A⁻¹) (↑(toLin b b) A)) x = x
[PROOFSTEP]
simp only [← Matrix.toLin_mul b b b, Matrix.nonsing_inv_mul _ hA, Matrix.mul_nonsing_inv _ hA, toLin_one,
  LinearMap.id_apply]
[GOAL]
case refine'_2
n : Type u_1
inst✝⁴ : Fintype n
R : Type u_2
M : Type u_3
inst✝³ : CommRing R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
b : Basis n R M
inst✝ : DecidableEq n
A : Matrix n n R
hA : IsUnit (det A)
src✝ : (fun x => M →ₗ[R] M) A := ↑(toLin b b) A
x : M
⊢ ↑(comp (↑(toLin b b) A) (↑(toLin b b) A⁻¹)) x = x
[PROOFSTEP]
simp only [← Matrix.toLin_mul b b b, Matrix.nonsing_inv_mul _ hA, Matrix.mul_nonsing_inv _ hA, toLin_one,
  LinearMap.id_apply]
[GOAL]
n : Type u_1
inst✝⁵ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M✝
inst✝² : Module R M✝
K : Type u_4
inst✝¹ : DecidableEq n
inst✝ : Field K
M : Matrix n n K
⊢ (∃ v x, mulVec M v = 0) ↔ det M = 0
[PROOFSTEP]
constructor
[GOAL]
case mp
n : Type u_1
inst✝⁵ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M✝
inst✝² : Module R M✝
K : Type u_4
inst✝¹ : DecidableEq n
inst✝ : Field K
M : Matrix n n K
⊢ (∃ v x, mulVec M v = 0) → det M = 0
[PROOFSTEP]
rintro ⟨v, hv, mul_eq⟩
[GOAL]
case mp.intro.intro
n : Type u_1
inst✝⁵ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M✝
inst✝² : Module R M✝
K : Type u_4
inst✝¹ : DecidableEq n
inst✝ : Field K
M : Matrix n n K
v : n → K
hv : v ≠ 0
mul_eq : mulVec M v = 0
⊢ det M = 0
[PROOFSTEP]
contrapose! hv
[GOAL]
case mp.intro.intro
n : Type u_1
inst✝⁵ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M✝
inst✝² : Module R M✝
K : Type u_4
inst✝¹ : DecidableEq n
inst✝ : Field K
M : Matrix n n K
v : n → K
mul_eq : mulVec M v = 0
hv : det M ≠ 0
⊢ v = 0
[PROOFSTEP]
exact eq_zero_of_mulVec_eq_zero hv mul_eq
[GOAL]
case mpr
n : Type u_1
inst✝⁵ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M✝
inst✝² : Module R M✝
K : Type u_4
inst✝¹ : DecidableEq n
inst✝ : Field K
M : Matrix n n K
⊢ det M = 0 → ∃ v x, mulVec M v = 0
[PROOFSTEP]
contrapose!
[GOAL]
case mpr
n : Type u_1
inst✝⁵ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M✝
inst✝² : Module R M✝
K : Type u_4
inst✝¹ : DecidableEq n
inst✝ : Field K
M : Matrix n n K
⊢ (∀ (v : n → K), v ≠ 0 → mulVec M v ≠ 0) → det M ≠ 0
[PROOFSTEP]
intro h
[GOAL]
case mpr
n : Type u_1
inst✝⁵ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M✝
inst✝² : Module R M✝
K : Type u_4
inst✝¹ : DecidableEq n
inst✝ : Field K
M : Matrix n n K
h : ∀ (v : n → K), v ≠ 0 → mulVec M v ≠ 0
⊢ det M ≠ 0
[PROOFSTEP]
have : Function.Injective (Matrix.toLin' M) := by
  simpa only [← LinearMap.ker_eq_bot, ker_toLin'_eq_bot_iff, not_imp_not] using h
[GOAL]
n : Type u_1
inst✝⁵ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M✝
inst✝² : Module R M✝
K : Type u_4
inst✝¹ : DecidableEq n
inst✝ : Field K
M : Matrix n n K
h : ∀ (v : n → K), v ≠ 0 → mulVec M v ≠ 0
⊢ Function.Injective ↑(↑toLin' M)
[PROOFSTEP]
simpa only [← LinearMap.ker_eq_bot, ker_toLin'_eq_bot_iff, not_imp_not] using h
[GOAL]
case mpr
n : Type u_1
inst✝⁵ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M✝
inst✝² : Module R M✝
K : Type u_4
inst✝¹ : DecidableEq n
inst✝ : Field K
M : Matrix n n K
h : ∀ (v : n → K), v ≠ 0 → mulVec M v ≠ 0
this : Function.Injective ↑(↑toLin' M)
⊢ det M ≠ 0
[PROOFSTEP]
have : M * LinearMap.toMatrix' ((LinearEquiv.ofInjectiveEndo (Matrix.toLin' M) this).symm : (n → K) →ₗ[K] n → K) = 1 :=
  by
  refine' Matrix.toLin'.injective (LinearMap.ext fun v => _)
  rw [Matrix.toLin'_mul, Matrix.toLin'_one, Matrix.toLin'_toMatrix', LinearMap.comp_apply]
  exact (LinearEquiv.ofInjectiveEndo (Matrix.toLin' M) this).apply_symm_apply v
[GOAL]
n : Type u_1
inst✝⁵ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M✝
inst✝² : Module R M✝
K : Type u_4
inst✝¹ : DecidableEq n
inst✝ : Field K
M : Matrix n n K
h : ∀ (v : n → K), v ≠ 0 → mulVec M v ≠ 0
this : Function.Injective ↑(↑toLin' M)
⊢ M * ↑toMatrix' ↑(LinearEquiv.symm (LinearEquiv.ofInjectiveEndo (↑toLin' M) this)) = 1
[PROOFSTEP]
refine' Matrix.toLin'.injective (LinearMap.ext fun v => _)
[GOAL]
n : Type u_1
inst✝⁵ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M✝
inst✝² : Module R M✝
K : Type u_4
inst✝¹ : DecidableEq n
inst✝ : Field K
M : Matrix n n K
h : ∀ (v : n → K), v ≠ 0 → mulVec M v ≠ 0
this : Function.Injective ↑(↑toLin' M)
v : n → K
⊢ ↑(↑toLin' (M * ↑toMatrix' ↑(LinearEquiv.symm (LinearEquiv.ofInjectiveEndo (↑toLin' M) this)))) v = ↑(↑toLin' 1) v
[PROOFSTEP]
rw [Matrix.toLin'_mul, Matrix.toLin'_one, Matrix.toLin'_toMatrix', LinearMap.comp_apply]
[GOAL]
n : Type u_1
inst✝⁵ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M✝
inst✝² : Module R M✝
K : Type u_4
inst✝¹ : DecidableEq n
inst✝ : Field K
M : Matrix n n K
h : ∀ (v : n → K), v ≠ 0 → mulVec M v ≠ 0
this : Function.Injective ↑(↑toLin' M)
v : n → K
⊢ ↑(↑toLin' M) (↑↑(LinearEquiv.symm (LinearEquiv.ofInjectiveEndo (↑toLin' M) this)) v) = ↑LinearMap.id v
[PROOFSTEP]
exact (LinearEquiv.ofInjectiveEndo (Matrix.toLin' M) this).apply_symm_apply v
[GOAL]
case mpr
n : Type u_1
inst✝⁵ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁴ : CommRing R
inst✝³ : AddCommGroup M✝
inst✝² : Module R M✝
K : Type u_4
inst✝¹ : DecidableEq n
inst✝ : Field K
M : Matrix n n K
h : ∀ (v : n → K), v ≠ 0 → mulVec M v ≠ 0
this✝ : Function.Injective ↑(↑toLin' M)
this : M * ↑toMatrix' ↑(LinearEquiv.symm (LinearEquiv.ofInjectiveEndo (↑toLin' M) this✝)) = 1
⊢ det M ≠ 0
[PROOFSTEP]
exact Matrix.det_ne_zero_of_right_inverse this
[GOAL]
n : Type u_1
inst✝⁹ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : AddCommGroup M✝
inst✝⁶ : Module R M✝
A : Type u_4
K : Type u_5
inst✝⁵ : DecidableEq n
inst✝⁴ : CommRing A
inst✝³ : Nontrivial A
inst✝² : Field K
inst✝¹ : Algebra A K
inst✝ : IsFractionRing A K
M : Matrix n n A
⊢ (∃ v x, mulVec M v = 0) ↔ det M = 0
[PROOFSTEP]
have : (∃ (v : _) (_ : v ≠ 0), mulVec ((algebraMap A K).mapMatrix M) v = 0) ↔ _ := exists_mulVec_eq_zero_iff_aux
[GOAL]
n : Type u_1
inst✝⁹ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : AddCommGroup M✝
inst✝⁶ : Module R M✝
A : Type u_4
K : Type u_5
inst✝⁵ : DecidableEq n
inst✝⁴ : CommRing A
inst✝³ : Nontrivial A
inst✝² : Field K
inst✝¹ : Algebra A K
inst✝ : IsFractionRing A K
M : Matrix n n A
this :
  (∃ v x, mulVec (↑(RingHom.mapMatrix (algebraMap A K)) M) v = 0) ↔ det (↑(RingHom.mapMatrix (algebraMap A K)) M) = 0
⊢ (∃ v x, mulVec M v = 0) ↔ det M = 0
[PROOFSTEP]
rw [← RingHom.map_det, IsFractionRing.to_map_eq_zero_iff] at this
[GOAL]
n : Type u_1
inst✝⁹ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : AddCommGroup M✝
inst✝⁶ : Module R M✝
A : Type u_4
K : Type u_5
inst✝⁵ : DecidableEq n
inst✝⁴ : CommRing A
inst✝³ : Nontrivial A
inst✝² : Field K
inst✝¹ : Algebra A K
inst✝ : IsFractionRing A K
M : Matrix n n A
this : (∃ v x, mulVec (↑(RingHom.mapMatrix (algebraMap A K)) M) v = 0) ↔ det M = 0
⊢ (∃ v x, mulVec M v = 0) ↔ det M = 0
[PROOFSTEP]
refine' Iff.trans _ this
[GOAL]
n : Type u_1
inst✝⁹ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : AddCommGroup M✝
inst✝⁶ : Module R M✝
A : Type u_4
K : Type u_5
inst✝⁵ : DecidableEq n
inst✝⁴ : CommRing A
inst✝³ : Nontrivial A
inst✝² : Field K
inst✝¹ : Algebra A K
inst✝ : IsFractionRing A K
M : Matrix n n A
this : (∃ v x, mulVec (↑(RingHom.mapMatrix (algebraMap A K)) M) v = 0) ↔ det M = 0
⊢ (∃ v x, mulVec M v = 0) ↔ ∃ v x, mulVec (↑(RingHom.mapMatrix (algebraMap A K)) M) v = 0
[PROOFSTEP]
constructor
[GOAL]
case mp
n : Type u_1
inst✝⁹ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : AddCommGroup M✝
inst✝⁶ : Module R M✝
A : Type u_4
K : Type u_5
inst✝⁵ : DecidableEq n
inst✝⁴ : CommRing A
inst✝³ : Nontrivial A
inst✝² : Field K
inst✝¹ : Algebra A K
inst✝ : IsFractionRing A K
M : Matrix n n A
this : (∃ v x, mulVec (↑(RingHom.mapMatrix (algebraMap A K)) M) v = 0) ↔ det M = 0
⊢ (∃ v x, mulVec M v = 0) → ∃ v x, mulVec (↑(RingHom.mapMatrix (algebraMap A K)) M) v = 0
[PROOFSTEP]
rintro ⟨v, hv, mul_eq⟩
[GOAL]
case mpr
n : Type u_1
inst✝⁹ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : AddCommGroup M✝
inst✝⁶ : Module R M✝
A : Type u_4
K : Type u_5
inst✝⁵ : DecidableEq n
inst✝⁴ : CommRing A
inst✝³ : Nontrivial A
inst✝² : Field K
inst✝¹ : Algebra A K
inst✝ : IsFractionRing A K
M : Matrix n n A
this : (∃ v x, mulVec (↑(RingHom.mapMatrix (algebraMap A K)) M) v = 0) ↔ det M = 0
⊢ (∃ v x, mulVec (↑(RingHom.mapMatrix (algebraMap A K)) M) v = 0) → ∃ v x, mulVec M v = 0
[PROOFSTEP]
rintro ⟨v, hv, mul_eq⟩
[GOAL]
case mp.intro.intro
n : Type u_1
inst✝⁹ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : AddCommGroup M✝
inst✝⁶ : Module R M✝
A : Type u_4
K : Type u_5
inst✝⁵ : DecidableEq n
inst✝⁴ : CommRing A
inst✝³ : Nontrivial A
inst✝² : Field K
inst✝¹ : Algebra A K
inst✝ : IsFractionRing A K
M : Matrix n n A
this : (∃ v x, mulVec (↑(RingHom.mapMatrix (algebraMap A K)) M) v = 0) ↔ det M = 0
v : n → A
hv : v ≠ 0
mul_eq : mulVec M v = 0
⊢ ∃ v x, mulVec (↑(RingHom.mapMatrix (algebraMap A K)) M) v = 0
[PROOFSTEP]
refine' ⟨fun i => algebraMap _ _ (v i), mt (fun h => funext fun i => _) hv, _⟩
[GOAL]
case mp.intro.intro.refine'_1
n : Type u_1
inst✝⁹ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : AddCommGroup M✝
inst✝⁶ : Module R M✝
A : Type u_4
K : Type u_5
inst✝⁵ : DecidableEq n
inst✝⁴ : CommRing A
inst✝³ : Nontrivial A
inst✝² : Field K
inst✝¹ : Algebra A K
inst✝ : IsFractionRing A K
M : Matrix n n A
this : (∃ v x, mulVec (↑(RingHom.mapMatrix (algebraMap A K)) M) v = 0) ↔ det M = 0
v : n → A
hv : v ≠ 0
mul_eq : mulVec M v = 0
h : (fun i => ↑(algebraMap A K) (v i)) = 0
i : n
⊢ v i = OfNat.ofNat 0 i
[PROOFSTEP]
exact IsFractionRing.to_map_eq_zero_iff.mp (congr_fun h i)
[GOAL]
case mp.intro.intro.refine'_2
n : Type u_1
inst✝⁹ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : AddCommGroup M✝
inst✝⁶ : Module R M✝
A : Type u_4
K : Type u_5
inst✝⁵ : DecidableEq n
inst✝⁴ : CommRing A
inst✝³ : Nontrivial A
inst✝² : Field K
inst✝¹ : Algebra A K
inst✝ : IsFractionRing A K
M : Matrix n n A
this : (∃ v x, mulVec (↑(RingHom.mapMatrix (algebraMap A K)) M) v = 0) ↔ det M = 0
v : n → A
hv : v ≠ 0
mul_eq : mulVec M v = 0
⊢ (mulVec (↑(RingHom.mapMatrix (algebraMap A K)) M) fun i => ↑(algebraMap A K) (v i)) = 0
[PROOFSTEP]
ext i
[GOAL]
case mp.intro.intro.refine'_2.h
n : Type u_1
inst✝⁹ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : AddCommGroup M✝
inst✝⁶ : Module R M✝
A : Type u_4
K : Type u_5
inst✝⁵ : DecidableEq n
inst✝⁴ : CommRing A
inst✝³ : Nontrivial A
inst✝² : Field K
inst✝¹ : Algebra A K
inst✝ : IsFractionRing A K
M : Matrix n n A
this : (∃ v x, mulVec (↑(RingHom.mapMatrix (algebraMap A K)) M) v = 0) ↔ det M = 0
v : n → A
hv : v ≠ 0
mul_eq : mulVec M v = 0
i : n
⊢ mulVec (↑(RingHom.mapMatrix (algebraMap A K)) M) (fun i => ↑(algebraMap A K) (v i)) i = OfNat.ofNat 0 i
[PROOFSTEP]
refine' (RingHom.map_mulVec _ _ _ i).symm.trans _
[GOAL]
case mp.intro.intro.refine'_2.h
n : Type u_1
inst✝⁹ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : AddCommGroup M✝
inst✝⁶ : Module R M✝
A : Type u_4
K : Type u_5
inst✝⁵ : DecidableEq n
inst✝⁴ : CommRing A
inst✝³ : Nontrivial A
inst✝² : Field K
inst✝¹ : Algebra A K
inst✝ : IsFractionRing A K
M : Matrix n n A
this : (∃ v x, mulVec (↑(RingHom.mapMatrix (algebraMap A K)) M) v = 0) ↔ det M = 0
v : n → A
hv : v ≠ 0
mul_eq : mulVec M v = 0
i : n
⊢ ↑(algebraMap A K) (mulVec (fun i j => M i j) (fun i => v i) i) = OfNat.ofNat 0 i
[PROOFSTEP]
rw [mul_eq, Pi.zero_apply, RingHom.map_zero, Pi.zero_apply]
[GOAL]
case mpr.intro.intro
n : Type u_1
inst✝⁹ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : AddCommGroup M✝
inst✝⁶ : Module R M✝
A : Type u_4
K : Type u_5
inst✝⁵ : DecidableEq n
inst✝⁴ : CommRing A
inst✝³ : Nontrivial A
inst✝² : Field K
inst✝¹ : Algebra A K
inst✝ : IsFractionRing A K
M : Matrix n n A
this : (∃ v x, mulVec (↑(RingHom.mapMatrix (algebraMap A K)) M) v = 0) ↔ det M = 0
v : n → K
hv : v ≠ 0
mul_eq : mulVec (↑(RingHom.mapMatrix (algebraMap A K)) M) v = 0
⊢ ∃ v x, mulVec M v = 0
[PROOFSTEP]
letI := Classical.decEq K
[GOAL]
case mpr.intro.intro
n : Type u_1
inst✝⁹ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : AddCommGroup M✝
inst✝⁶ : Module R M✝
A : Type u_4
K : Type u_5
inst✝⁵ : DecidableEq n
inst✝⁴ : CommRing A
inst✝³ : Nontrivial A
inst✝² : Field K
inst✝¹ : Algebra A K
inst✝ : IsFractionRing A K
M : Matrix n n A
this✝ : (∃ v x, mulVec (↑(RingHom.mapMatrix (algebraMap A K)) M) v = 0) ↔ det M = 0
v : n → K
hv : v ≠ 0
mul_eq : mulVec (↑(RingHom.mapMatrix (algebraMap A K)) M) v = 0
this : DecidableEq K := Classical.decEq K
⊢ ∃ v x, mulVec M v = 0
[PROOFSTEP]
obtain ⟨⟨b, hb⟩, ba_eq⟩ := IsLocalization.exist_integer_multiples_of_finset (nonZeroDivisors A) (Finset.univ.image v)
[GOAL]
case mpr.intro.intro.intro.mk
n : Type u_1
inst✝⁹ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : AddCommGroup M✝
inst✝⁶ : Module R M✝
A : Type u_4
K : Type u_5
inst✝⁵ : DecidableEq n
inst✝⁴ : CommRing A
inst✝³ : Nontrivial A
inst✝² : Field K
inst✝¹ : Algebra A K
inst✝ : IsFractionRing A K
M : Matrix n n A
this✝ : (∃ v x, mulVec (↑(RingHom.mapMatrix (algebraMap A K)) M) v = 0) ↔ det M = 0
v : n → K
hv : v ≠ 0
mul_eq : mulVec (↑(RingHom.mapMatrix (algebraMap A K)) M) v = 0
this : DecidableEq K := Classical.decEq K
b : A
hb : b ∈ nonZeroDivisors A
ba_eq : ∀ (a : K), a ∈ Finset.image v Finset.univ → IsLocalization.IsInteger A (↑{ val := b, property := hb } • a)
⊢ ∃ v x, mulVec M v = 0
[PROOFSTEP]
choose f hf using ba_eq
[GOAL]
case mpr.intro.intro.intro.mk
n : Type u_1
inst✝⁹ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : AddCommGroup M✝
inst✝⁶ : Module R M✝
A : Type u_4
K : Type u_5
inst✝⁵ : DecidableEq n
inst✝⁴ : CommRing A
inst✝³ : Nontrivial A
inst✝² : Field K
inst✝¹ : Algebra A K
inst✝ : IsFractionRing A K
M : Matrix n n A
this✝ : (∃ v x, mulVec (↑(RingHom.mapMatrix (algebraMap A K)) M) v = 0) ↔ det M = 0
v : n → K
hv : v ≠ 0
mul_eq : mulVec (↑(RingHom.mapMatrix (algebraMap A K)) M) v = 0
this : DecidableEq K := Classical.decEq K
b : A
hb : b ∈ nonZeroDivisors A
f : (a : K) → a ∈ Finset.image v Finset.univ → A
hf : ∀ (a : K) (a_1 : a ∈ Finset.image v Finset.univ), ↑(algebraMap A K) (f a a_1) = ↑{ val := b, property := hb } • a
⊢ ∃ v x, mulVec M v = 0
[PROOFSTEP]
refine' ⟨fun i => f _ (Finset.mem_image.mpr ⟨i, Finset.mem_univ i, rfl⟩), mt (fun h => funext fun i => _) hv, _⟩
[GOAL]
case mpr.intro.intro.intro.mk.refine'_1
n : Type u_1
inst✝⁹ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : AddCommGroup M✝
inst✝⁶ : Module R M✝
A : Type u_4
K : Type u_5
inst✝⁵ : DecidableEq n
inst✝⁴ : CommRing A
inst✝³ : Nontrivial A
inst✝² : Field K
inst✝¹ : Algebra A K
inst✝ : IsFractionRing A K
M : Matrix n n A
this✝ : (∃ v x, mulVec (↑(RingHom.mapMatrix (algebraMap A K)) M) v = 0) ↔ det M = 0
v : n → K
hv : v ≠ 0
mul_eq : mulVec (↑(RingHom.mapMatrix (algebraMap A K)) M) v = 0
this : DecidableEq K := Classical.decEq K
b : A
hb : b ∈ nonZeroDivisors A
f : (a : K) → a ∈ Finset.image v Finset.univ → A
hf : ∀ (a : K) (a_1 : a ∈ Finset.image v Finset.univ), ↑(algebraMap A K) (f a a_1) = ↑{ val := b, property := hb } • a
h : (fun i => f (v i) (_ : v i ∈ Finset.image v Finset.univ)) = 0
i : n
⊢ v i = OfNat.ofNat 0 i
[PROOFSTEP]
have := congr_arg (algebraMap A K) (congr_fun h i)
[GOAL]
case mpr.intro.intro.intro.mk.refine'_1
n : Type u_1
inst✝⁹ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : AddCommGroup M✝
inst✝⁶ : Module R M✝
A : Type u_4
K : Type u_5
inst✝⁵ : DecidableEq n
inst✝⁴ : CommRing A
inst✝³ : Nontrivial A
inst✝² : Field K
inst✝¹ : Algebra A K
inst✝ : IsFractionRing A K
M : Matrix n n A
this✝¹ : (∃ v x, mulVec (↑(RingHom.mapMatrix (algebraMap A K)) M) v = 0) ↔ det M = 0
v : n → K
hv : v ≠ 0
mul_eq : mulVec (↑(RingHom.mapMatrix (algebraMap A K)) M) v = 0
this✝ : DecidableEq K := Classical.decEq K
b : A
hb : b ∈ nonZeroDivisors A
f : (a : K) → a ∈ Finset.image v Finset.univ → A
hf : ∀ (a : K) (a_1 : a ∈ Finset.image v Finset.univ), ↑(algebraMap A K) (f a a_1) = ↑{ val := b, property := hb } • a
h : (fun i => f (v i) (_ : v i ∈ Finset.image v Finset.univ)) = 0
i : n
this : ↑(algebraMap A K) (f (v i) (_ : v i ∈ Finset.image v Finset.univ)) = ↑(algebraMap A K) (OfNat.ofNat 0 i)
⊢ v i = OfNat.ofNat 0 i
[PROOFSTEP]
rw [hf, Subtype.coe_mk, Pi.zero_apply, RingHom.map_zero, Algebra.smul_def, mul_eq_zero,
  IsFractionRing.to_map_eq_zero_iff] at this
[GOAL]
case mpr.intro.intro.intro.mk.refine'_1
n : Type u_1
inst✝⁹ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : AddCommGroup M✝
inst✝⁶ : Module R M✝
A : Type u_4
K : Type u_5
inst✝⁵ : DecidableEq n
inst✝⁴ : CommRing A
inst✝³ : Nontrivial A
inst✝² : Field K
inst✝¹ : Algebra A K
inst✝ : IsFractionRing A K
M : Matrix n n A
this✝¹ : (∃ v x, mulVec (↑(RingHom.mapMatrix (algebraMap A K)) M) v = 0) ↔ det M = 0
v : n → K
hv : v ≠ 0
mul_eq : mulVec (↑(RingHom.mapMatrix (algebraMap A K)) M) v = 0
this✝ : DecidableEq K := Classical.decEq K
b : A
hb : b ∈ nonZeroDivisors A
f : (a : K) → a ∈ Finset.image v Finset.univ → A
hf : ∀ (a : K) (a_1 : a ∈ Finset.image v Finset.univ), ↑(algebraMap A K) (f a a_1) = ↑{ val := b, property := hb } • a
h : (fun i => f (v i) (_ : v i ∈ Finset.image v Finset.univ)) = 0
i : n
this : b = 0 ∨ v i = 0
⊢ v i = OfNat.ofNat 0 i
[PROOFSTEP]
exact this.resolve_left (nonZeroDivisors.ne_zero hb)
[GOAL]
case mpr.intro.intro.intro.mk.refine'_2
n : Type u_1
inst✝⁹ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : AddCommGroup M✝
inst✝⁶ : Module R M✝
A : Type u_4
K : Type u_5
inst✝⁵ : DecidableEq n
inst✝⁴ : CommRing A
inst✝³ : Nontrivial A
inst✝² : Field K
inst✝¹ : Algebra A K
inst✝ : IsFractionRing A K
M : Matrix n n A
this✝ : (∃ v x, mulVec (↑(RingHom.mapMatrix (algebraMap A K)) M) v = 0) ↔ det M = 0
v : n → K
hv : v ≠ 0
mul_eq : mulVec (↑(RingHom.mapMatrix (algebraMap A K)) M) v = 0
this : DecidableEq K := Classical.decEq K
b : A
hb : b ∈ nonZeroDivisors A
f : (a : K) → a ∈ Finset.image v Finset.univ → A
hf : ∀ (a : K) (a_1 : a ∈ Finset.image v Finset.univ), ↑(algebraMap A K) (f a a_1) = ↑{ val := b, property := hb } • a
⊢ (mulVec M fun i => f (v i) (_ : v i ∈ Finset.image v Finset.univ)) = 0
[PROOFSTEP]
ext i
[GOAL]
case mpr.intro.intro.intro.mk.refine'_2.h
n : Type u_1
inst✝⁹ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : AddCommGroup M✝
inst✝⁶ : Module R M✝
A : Type u_4
K : Type u_5
inst✝⁵ : DecidableEq n
inst✝⁴ : CommRing A
inst✝³ : Nontrivial A
inst✝² : Field K
inst✝¹ : Algebra A K
inst✝ : IsFractionRing A K
M : Matrix n n A
this✝ : (∃ v x, mulVec (↑(RingHom.mapMatrix (algebraMap A K)) M) v = 0) ↔ det M = 0
v : n → K
hv : v ≠ 0
mul_eq : mulVec (↑(RingHom.mapMatrix (algebraMap A K)) M) v = 0
this : DecidableEq K := Classical.decEq K
b : A
hb : b ∈ nonZeroDivisors A
f : (a : K) → a ∈ Finset.image v Finset.univ → A
hf : ∀ (a : K) (a_1 : a ∈ Finset.image v Finset.univ), ↑(algebraMap A K) (f a a_1) = ↑{ val := b, property := hb } • a
i : n
⊢ mulVec M (fun i => f (v i) (_ : v i ∈ Finset.image v Finset.univ)) i = OfNat.ofNat 0 i
[PROOFSTEP]
refine' IsFractionRing.injective A K _
[GOAL]
case mpr.intro.intro.intro.mk.refine'_2.h
n : Type u_1
inst✝⁹ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : AddCommGroup M✝
inst✝⁶ : Module R M✝
A : Type u_4
K : Type u_5
inst✝⁵ : DecidableEq n
inst✝⁴ : CommRing A
inst✝³ : Nontrivial A
inst✝² : Field K
inst✝¹ : Algebra A K
inst✝ : IsFractionRing A K
M : Matrix n n A
this✝ : (∃ v x, mulVec (↑(RingHom.mapMatrix (algebraMap A K)) M) v = 0) ↔ det M = 0
v : n → K
hv : v ≠ 0
mul_eq : mulVec (↑(RingHom.mapMatrix (algebraMap A K)) M) v = 0
this : DecidableEq K := Classical.decEq K
b : A
hb : b ∈ nonZeroDivisors A
f : (a : K) → a ∈ Finset.image v Finset.univ → A
hf : ∀ (a : K) (a_1 : a ∈ Finset.image v Finset.univ), ↑(algebraMap A K) (f a a_1) = ↑{ val := b, property := hb } • a
i : n
⊢ ↑(algebraMap A K) (mulVec M (fun i => f (v i) (_ : v i ∈ Finset.image v Finset.univ)) i) =
    ↑(algebraMap A K) (OfNat.ofNat 0 i)
[PROOFSTEP]
calc
  algebraMap A K (M.mulVec (fun i : n => f (v i) _) i) =
      ((algebraMap A K).mapMatrix M).mulVec (algebraMap _ K b • v) i :=
    ?_
  _ = 0 := ?_
  _ = algebraMap A K 0 := (RingHom.map_zero _).symm
[GOAL]
case mpr.intro.intro.intro.mk.refine'_2.h.calc_1
n : Type u_1
inst✝⁹ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : AddCommGroup M✝
inst✝⁶ : Module R M✝
A : Type u_4
K : Type u_5
inst✝⁵ : DecidableEq n
inst✝⁴ : CommRing A
inst✝³ : Nontrivial A
inst✝² : Field K
inst✝¹ : Algebra A K
inst✝ : IsFractionRing A K
M : Matrix n n A
this✝ : (∃ v x, mulVec (↑(RingHom.mapMatrix (algebraMap A K)) M) v = 0) ↔ det M = 0
v : n → K
hv : v ≠ 0
mul_eq : mulVec (↑(RingHom.mapMatrix (algebraMap A K)) M) v = 0
this : DecidableEq K := Classical.decEq K
b : A
hb : b ∈ nonZeroDivisors A
f : (a : K) → a ∈ Finset.image v Finset.univ → A
hf : ∀ (a : K) (a_1 : a ∈ Finset.image v Finset.univ), ↑(algebraMap A K) (f a a_1) = ↑{ val := b, property := hb } • a
i : n
⊢ ↑(algebraMap A K) (mulVec M (fun i => f (v i) (_ : v i ∈ Finset.image v Finset.univ)) i) =
    mulVec (↑(RingHom.mapMatrix (algebraMap A K)) M) (↑(algebraMap A K) b • v) i
[PROOFSTEP]
simp_rw [RingHom.map_mulVec, mulVec, dotProduct, Function.comp_apply, hf, RingHom.mapMatrix_apply, Pi.smul_apply,
  smul_eq_mul, Algebra.smul_def]
[GOAL]
case mpr.intro.intro.intro.mk.refine'_2.h.calc_2
n : Type u_1
inst✝⁹ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁸ : CommRing R
inst✝⁷ : AddCommGroup M✝
inst✝⁶ : Module R M✝
A : Type u_4
K : Type u_5
inst✝⁵ : DecidableEq n
inst✝⁴ : CommRing A
inst✝³ : Nontrivial A
inst✝² : Field K
inst✝¹ : Algebra A K
inst✝ : IsFractionRing A K
M : Matrix n n A
this✝ : (∃ v x, mulVec (↑(RingHom.mapMatrix (algebraMap A K)) M) v = 0) ↔ det M = 0
v : n → K
hv : v ≠ 0
mul_eq : mulVec (↑(RingHom.mapMatrix (algebraMap A K)) M) v = 0
this : DecidableEq K := Classical.decEq K
b : A
hb : b ∈ nonZeroDivisors A
f : (a : K) → a ∈ Finset.image v Finset.univ → A
hf : ∀ (a : K) (a_1 : a ∈ Finset.image v Finset.univ), ↑(algebraMap A K) (f a a_1) = ↑{ val := b, property := hb } • a
i : n
⊢ mulVec (↑(RingHom.mapMatrix (algebraMap A K)) M) (↑(algebraMap A K) b • v) i = 0
[PROOFSTEP]
rw [mulVec_smul, mul_eq, Pi.smul_apply, Pi.zero_apply, smul_zero]
[GOAL]
n : Type u_1
inst✝⁶ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
A : Type u_4
inst✝² : DecidableEq n
inst✝¹ : CommRing A
inst✝ : IsDomain A
M : Matrix n n A
⊢ (∃ v x, vecMul v M = 0) ↔ det M = 0
[PROOFSTEP]
simpa only [← M.det_transpose, ← mulVec_transpose] using exists_mulVec_eq_zero_iff
[GOAL]
n : Type u_1
inst✝⁶ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
A : Type u_4
inst✝² : DecidableEq n
inst✝¹ : CommRing A
inst✝ : IsDomain A
M : Matrix n n A
⊢ Nondegenerate M ↔ det M ≠ 0
[PROOFSTEP]
refine' Iff.trans _ (not_iff_not.mpr exists_vecMul_eq_zero_iff)
[GOAL]
n : Type u_1
inst✝⁶ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
A : Type u_4
inst✝² : DecidableEq n
inst✝¹ : CommRing A
inst✝ : IsDomain A
M : Matrix n n A
⊢ Nondegenerate M ↔ ¬∃ v x, vecMul v M = 0
[PROOFSTEP]
simp only [not_exists]
[GOAL]
n : Type u_1
inst✝⁶ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
A : Type u_4
inst✝² : DecidableEq n
inst✝¹ : CommRing A
inst✝ : IsDomain A
M : Matrix n n A
⊢ Nondegenerate M ↔ ∀ (x : n → A), x ≠ 0 → ¬vecMul x M = 0
[PROOFSTEP]
constructor
[GOAL]
case mp
n : Type u_1
inst✝⁶ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
A : Type u_4
inst✝² : DecidableEq n
inst✝¹ : CommRing A
inst✝ : IsDomain A
M : Matrix n n A
⊢ Nondegenerate M → ∀ (x : n → A), x ≠ 0 → ¬vecMul x M = 0
[PROOFSTEP]
intro hM v hv hMv
[GOAL]
case mp
n : Type u_1
inst✝⁶ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
A : Type u_4
inst✝² : DecidableEq n
inst✝¹ : CommRing A
inst✝ : IsDomain A
M : Matrix n n A
hM : Nondegenerate M
v : n → A
hv : v ≠ 0
hMv : vecMul v M = 0
⊢ False
[PROOFSTEP]
obtain ⟨w, hwMv⟩ := hM.exists_not_ortho_of_ne_zero hv
[GOAL]
case mp.intro
n : Type u_1
inst✝⁶ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
A : Type u_4
inst✝² : DecidableEq n
inst✝¹ : CommRing A
inst✝ : IsDomain A
M : Matrix n n A
hM : Nondegenerate M
v : n → A
hv : v ≠ 0
hMv : vecMul v M = 0
w : n → A
hwMv : v ⬝ᵥ mulVec M w ≠ 0
⊢ False
[PROOFSTEP]
simp [dotProduct_mulVec, hMv, zero_dotProduct, ne_eq, not_true] at hwMv
[GOAL]
case mpr
n : Type u_1
inst✝⁶ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
A : Type u_4
inst✝² : DecidableEq n
inst✝¹ : CommRing A
inst✝ : IsDomain A
M : Matrix n n A
⊢ (∀ (x : n → A), x ≠ 0 → ¬vecMul x M = 0) → Nondegenerate M
[PROOFSTEP]
intro h v hv
[GOAL]
case mpr
n : Type u_1
inst✝⁶ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
A : Type u_4
inst✝² : DecidableEq n
inst✝¹ : CommRing A
inst✝ : IsDomain A
M : Matrix n n A
h : ∀ (x : n → A), x ≠ 0 → ¬vecMul x M = 0
v : n → A
hv : ∀ (w : n → A), v ⬝ᵥ mulVec M w = 0
⊢ v = 0
[PROOFSTEP]
refine' not_imp_not.mp (h v) (funext fun i => _)
[GOAL]
case mpr
n : Type u_1
inst✝⁶ : Fintype n
R : Type u_2
M✝ : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M✝
inst✝³ : Module R M✝
A : Type u_4
inst✝² : DecidableEq n
inst✝¹ : CommRing A
inst✝ : IsDomain A
M : Matrix n n A
h : ∀ (x : n → A), x ≠ 0 → ¬vecMul x M = 0
v : n → A
hv : ∀ (w : n → A), v ⬝ᵥ mulVec M w = 0
i : n
⊢ vecMul v M i = OfNat.ofNat 0 i
[PROOFSTEP]
simpa only [dotProduct_mulVec, dotProduct_single, mul_one] using hv (Pi.single i 1)
[GOAL]
n : Type u_1
inst✝² : Fintype n
inst✝¹ : DecidableEq n
S : Type u_2
inst✝ : LinearOrderedCommRing S
A : Matrix n n S
h1 : ∀ (i j : n), i ≠ j → A i j < 0
h2 : ∀ (j : n), 0 < ∑ i : n, A i j
⊢ det A ≠ 0
[PROOFSTEP]
cases isEmpty_or_nonempty n
[GOAL]
case inl
n : Type u_1
inst✝² : Fintype n
inst✝¹ : DecidableEq n
S : Type u_2
inst✝ : LinearOrderedCommRing S
A : Matrix n n S
h1 : ∀ (i j : n), i ≠ j → A i j < 0
h2 : ∀ (j : n), 0 < ∑ i : n, A i j
h✝ : IsEmpty n
⊢ det A ≠ 0
[PROOFSTEP]
simp
[GOAL]
case inr
n : Type u_1
inst✝² : Fintype n
inst✝¹ : DecidableEq n
S : Type u_2
inst✝ : LinearOrderedCommRing S
A : Matrix n n S
h1 : ∀ (i j : n), i ≠ j → A i j < 0
h2 : ∀ (j : n), 0 < ∑ i : n, A i j
h✝ : Nonempty n
⊢ det A ≠ 0
[PROOFSTEP]
contrapose! h2
[GOAL]
case inr
n : Type u_1
inst✝² : Fintype n
inst✝¹ : DecidableEq n
S : Type u_2
inst✝ : LinearOrderedCommRing S
A : Matrix n n S
h1 : ∀ (i j : n), i ≠ j → A i j < 0
h✝ : Nonempty n
h2 : det A = 0
⊢ ∃ j, ∑ i : n, A i j ≤ 0
[PROOFSTEP]
obtain ⟨v, ⟨h_vnz, h_vA⟩⟩ := Matrix.exists_vecMul_eq_zero_iff.mpr h2
[GOAL]
case inr.intro.intro
n : Type u_1
inst✝² : Fintype n
inst✝¹ : DecidableEq n
S : Type u_2
inst✝ : LinearOrderedCommRing S
A : Matrix n n S
h1 : ∀ (i j : n), i ≠ j → A i j < 0
h✝ : Nonempty n
h2 : det A = 0
v : n → S
h_vnz : v ≠ 0
h_vA : vecMul v A = 0
⊢ ∃ j, ∑ i : n, A i j ≤ 0
[PROOFSTEP]
wlog h_sup : 0 < Finset.sup' Finset.univ Finset.univ_nonempty v
[GOAL]
case inr.intro.intro.inr
n : Type u_1
inst✝² : Fintype n
inst✝¹ : DecidableEq n
S : Type u_2
inst✝ : LinearOrderedCommRing S
A : Matrix n n S
h1 : ∀ (i j : n), i ≠ j → A i j < 0
h✝ : Nonempty n
h2 : det A = 0
v : n → S
h_vnz : v ≠ 0
h_vA : vecMul v A = 0
this :
  ∀ {n : Type u_1} [inst : Fintype n] [inst_1 : DecidableEq n] {S : Type u_2} [inst_2 : LinearOrderedCommRing S]
    {A : Matrix n n S},
    (∀ (i j : n), i ≠ j → A i j < 0) →
      ∀ (h : Nonempty n),
        det A = 0 →
          ∀ (v : n → S),
            v ≠ 0 →
              vecMul v A = 0 → 0 < Finset.sup' Finset.univ (_ : Finset.Nonempty Finset.univ) v → ∃ j, ∑ i : n, A i j ≤ 0
h_sup : ¬0 < Finset.sup' Finset.univ (_ : Finset.Nonempty Finset.univ) v
⊢ ∃ j, ∑ i : n, A i j ≤ 0
[PROOFSTEP]
refine this h1 inferInstance h2 (-1 • v) ?_ ?_ ?_
[GOAL]
case inr.intro.intro.inr.refine_1
n : Type u_1
inst✝² : Fintype n
inst✝¹ : DecidableEq n
S : Type u_2
inst✝ : LinearOrderedCommRing S
A : Matrix n n S
h1 : ∀ (i j : n), i ≠ j → A i j < 0
h✝ : Nonempty n
h2 : det A = 0
v : n → S
h_vnz : v ≠ 0
h_vA : vecMul v A = 0
this :
  ∀ {n : Type u_1} [inst : Fintype n] [inst_1 : DecidableEq n] {S : Type u_2} [inst_2 : LinearOrderedCommRing S]
    {A : Matrix n n S},
    (∀ (i j : n), i ≠ j → A i j < 0) →
      ∀ (h : Nonempty n),
        det A = 0 →
          ∀ (v : n → S),
            v ≠ 0 →
              vecMul v A = 0 → 0 < Finset.sup' Finset.univ (_ : Finset.Nonempty Finset.univ) v → ∃ j, ∑ i : n, A i j ≤ 0
h_sup : ¬0 < Finset.sup' Finset.univ (_ : Finset.Nonempty Finset.univ) v
⊢ -1 • v ≠ 0
[PROOFSTEP]
exact smul_ne_zero (by norm_num) h_vnz
[GOAL]
n : Type u_1
inst✝² : Fintype n
inst✝¹ : DecidableEq n
S : Type u_2
inst✝ : LinearOrderedCommRing S
A : Matrix n n S
h1 : ∀ (i j : n), i ≠ j → A i j < 0
h✝ : Nonempty n
h2 : det A = 0
v : n → S
h_vnz : v ≠ 0
h_vA : vecMul v A = 0
this :
  ∀ {n : Type u_1} [inst : Fintype n] [inst_1 : DecidableEq n] {S : Type u_2} [inst_2 : LinearOrderedCommRing S]
    {A : Matrix n n S},
    (∀ (i j : n), i ≠ j → A i j < 0) →
      ∀ (h : Nonempty n),
        det A = 0 →
          ∀ (v : n → S),
            v ≠ 0 →
              vecMul v A = 0 → 0 < Finset.sup' Finset.univ (_ : Finset.Nonempty Finset.univ) v → ∃ j, ∑ i : n, A i j ≤ 0
h_sup : ¬0 < Finset.sup' Finset.univ (_ : Finset.Nonempty Finset.univ) v
⊢ -1 ≠ 0
[PROOFSTEP]
norm_num
[GOAL]
case inr.intro.intro.inr.refine_2
n : Type u_1
inst✝² : Fintype n
inst✝¹ : DecidableEq n
S : Type u_2
inst✝ : LinearOrderedCommRing S
A : Matrix n n S
h1 : ∀ (i j : n), i ≠ j → A i j < 0
h✝ : Nonempty n
h2 : det A = 0
v : n → S
h_vnz : v ≠ 0
h_vA : vecMul v A = 0
this :
  ∀ {n : Type u_1} [inst : Fintype n] [inst_1 : DecidableEq n] {S : Type u_2} [inst_2 : LinearOrderedCommRing S]
    {A : Matrix n n S},
    (∀ (i j : n), i ≠ j → A i j < 0) →
      ∀ (h : Nonempty n),
        det A = 0 →
          ∀ (v : n → S),
            v ≠ 0 →
              vecMul v A = 0 → 0 < Finset.sup' Finset.univ (_ : Finset.Nonempty Finset.univ) v → ∃ j, ∑ i : n, A i j ≤ 0
h_sup : ¬0 < Finset.sup' Finset.univ (_ : Finset.Nonempty Finset.univ) v
⊢ (vecMul (-1 • v) fun i j => A i j) = 0
[PROOFSTEP]
rw [Matrix.vecMul_smul, h_vA, smul_zero]
[GOAL]
case inr.intro.intro.inr.refine_3
n : Type u_1
inst✝² : Fintype n
inst✝¹ : DecidableEq n
S : Type u_2
inst✝ : LinearOrderedCommRing S
A : Matrix n n S
h1 : ∀ (i j : n), i ≠ j → A i j < 0
h✝ : Nonempty n
h2 : det A = 0
v : n → S
h_vnz : v ≠ 0
h_vA : vecMul v A = 0
this :
  ∀ {n : Type u_1} [inst : Fintype n] [inst_1 : DecidableEq n] {S : Type u_2} [inst_2 : LinearOrderedCommRing S]
    {A : Matrix n n S},
    (∀ (i j : n), i ≠ j → A i j < 0) →
      ∀ (h : Nonempty n),
        det A = 0 →
          ∀ (v : n → S),
            v ≠ 0 →
              vecMul v A = 0 → 0 < Finset.sup' Finset.univ (_ : Finset.Nonempty Finset.univ) v → ∃ j, ∑ i : n, A i j ≤ 0
h_sup : ¬0 < Finset.sup' Finset.univ (_ : Finset.Nonempty Finset.univ) v
⊢ 0 < Finset.sup' Finset.univ (_ : Finset.Nonempty Finset.univ) (-1 • v)
[PROOFSTEP]
obtain ⟨i, hi⟩ := Function.ne_iff.mp h_vnz
[GOAL]
case inr.intro.intro.inr.refine_3.intro
n : Type u_1
inst✝² : Fintype n
inst✝¹ : DecidableEq n
S : Type u_2
inst✝ : LinearOrderedCommRing S
A : Matrix n n S
h1 : ∀ (i j : n), i ≠ j → A i j < 0
h✝ : Nonempty n
h2 : det A = 0
v : n → S
h_vnz : v ≠ 0
h_vA : vecMul v A = 0
this :
  ∀ {n : Type u_1} [inst : Fintype n] [inst_1 : DecidableEq n] {S : Type u_2} [inst_2 : LinearOrderedCommRing S]
    {A : Matrix n n S},
    (∀ (i j : n), i ≠ j → A i j < 0) →
      ∀ (h : Nonempty n),
        det A = 0 →
          ∀ (v : n → S),
            v ≠ 0 →
              vecMul v A = 0 → 0 < Finset.sup' Finset.univ (_ : Finset.Nonempty Finset.univ) v → ∃ j, ∑ i : n, A i j ≤ 0
h_sup : ¬0 < Finset.sup' Finset.univ (_ : Finset.Nonempty Finset.univ) v
i : n
hi : v i ≠ OfNat.ofNat 0 i
⊢ 0 < Finset.sup' Finset.univ (_ : Finset.Nonempty Finset.univ) (-1 • v)
[PROOFSTEP]
simp_rw [Finset.lt_sup'_iff, Finset.mem_univ, true_and] at h_sup ⊢
[GOAL]
case inr.intro.intro.inr.refine_3.intro
n : Type u_1
inst✝² : Fintype n
inst✝¹ : DecidableEq n
S : Type u_2
inst✝ : LinearOrderedCommRing S
A : Matrix n n S
h1 : ∀ (i j : n), i ≠ j → A i j < 0
h✝ : Nonempty n
h2 : det A = 0
v : n → S
h_vnz : v ≠ 0
h_vA : vecMul v A = 0
this :
  ∀ {n : Type u_1} [inst : Fintype n] [inst_1 : DecidableEq n] {S : Type u_2} [inst_2 : LinearOrderedCommRing S]
    {A : Matrix n n S},
    (∀ (i j : n), i ≠ j → A i j < 0) →
      ∀ (h : Nonempty n),
        det A = 0 →
          ∀ (v : n → S),
            v ≠ 0 →
              vecMul v A = 0 → 0 < Finset.sup' Finset.univ (_ : Finset.Nonempty Finset.univ) v → ∃ j, ∑ i : n, A i j ≤ 0
i : n
hi : v i ≠ OfNat.ofNat 0 i
h_sup : ¬∃ b, 0 < v b
⊢ ∃ b, 0 < (-1 • v) b
[PROOFSTEP]
simp_rw [not_exists, not_lt] at h_sup
[GOAL]
case inr.intro.intro.inr.refine_3.intro
n : Type u_1
inst✝² : Fintype n
inst✝¹ : DecidableEq n
S : Type u_2
inst✝ : LinearOrderedCommRing S
A : Matrix n n S
h1 : ∀ (i j : n), i ≠ j → A i j < 0
h✝ : Nonempty n
h2 : det A = 0
v : n → S
h_vnz : v ≠ 0
h_vA : vecMul v A = 0
this :
  ∀ {n : Type u_1} [inst : Fintype n] [inst_1 : DecidableEq n] {S : Type u_2} [inst_2 : LinearOrderedCommRing S]
    {A : Matrix n n S},
    (∀ (i j : n), i ≠ j → A i j < 0) →
      ∀ (h : Nonempty n),
        det A = 0 →
          ∀ (v : n → S),
            v ≠ 0 →
              vecMul v A = 0 → 0 < Finset.sup' Finset.univ (_ : Finset.Nonempty Finset.univ) v → ∃ j, ∑ i : n, A i j ≤ 0
i : n
hi : v i ≠ OfNat.ofNat 0 i
h_sup : ∀ (x : n), v x ≤ 0
⊢ ∃ b, 0 < (-1 • v) b
[PROOFSTEP]
refine ⟨i, ?_⟩
[GOAL]
case inr.intro.intro.inr.refine_3.intro
n : Type u_1
inst✝² : Fintype n
inst✝¹ : DecidableEq n
S : Type u_2
inst✝ : LinearOrderedCommRing S
A : Matrix n n S
h1 : ∀ (i j : n), i ≠ j → A i j < 0
h✝ : Nonempty n
h2 : det A = 0
v : n → S
h_vnz : v ≠ 0
h_vA : vecMul v A = 0
this :
  ∀ {n : Type u_1} [inst : Fintype n] [inst_1 : DecidableEq n] {S : Type u_2} [inst_2 : LinearOrderedCommRing S]
    {A : Matrix n n S},
    (∀ (i j : n), i ≠ j → A i j < 0) →
      ∀ (h : Nonempty n),
        det A = 0 →
          ∀ (v : n → S),
            v ≠ 0 →
              vecMul v A = 0 → 0 < Finset.sup' Finset.univ (_ : Finset.Nonempty Finset.univ) v → ∃ j, ∑ i : n, A i j ≤ 0
i : n
hi : v i ≠ OfNat.ofNat 0 i
h_sup : ∀ (x : n), v x ≤ 0
⊢ 0 < (-1 • v) i
[PROOFSTEP]
rw [Pi.smul_apply, neg_smul, one_smul, Left.neg_pos_iff]
[GOAL]
case inr.intro.intro.inr.refine_3.intro
n : Type u_1
inst✝² : Fintype n
inst✝¹ : DecidableEq n
S : Type u_2
inst✝ : LinearOrderedCommRing S
A : Matrix n n S
h1 : ∀ (i j : n), i ≠ j → A i j < 0
h✝ : Nonempty n
h2 : det A = 0
v : n → S
h_vnz : v ≠ 0
h_vA : vecMul v A = 0
this :
  ∀ {n : Type u_1} [inst : Fintype n] [inst_1 : DecidableEq n] {S : Type u_2} [inst_2 : LinearOrderedCommRing S]
    {A : Matrix n n S},
    (∀ (i j : n), i ≠ j → A i j < 0) →
      ∀ (h : Nonempty n),
        det A = 0 →
          ∀ (v : n → S),
            v ≠ 0 →
              vecMul v A = 0 → 0 < Finset.sup' Finset.univ (_ : Finset.Nonempty Finset.univ) v → ∃ j, ∑ i : n, A i j ≤ 0
i : n
hi : v i ≠ OfNat.ofNat 0 i
h_sup : ∀ (x : n), v x ≤ 0
⊢ v i < 0
[PROOFSTEP]
refine Ne.lt_of_le hi (h_sup i)
[GOAL]
n✝ : Type u_1
inst✝³ : Fintype n✝
n : Type u_1
inst✝² : Fintype n
inst✝¹ : DecidableEq n
S : Type u_2
inst✝ : LinearOrderedCommRing S
A : Matrix n n S
h1 : ∀ (i j : n), i ≠ j → A i j < 0
h✝ : Nonempty n
h2 : det A = 0
v : n → S
h_vnz : v ≠ 0
h_vA : vecMul v A = 0
h_sup : 0 < Finset.sup' Finset.univ (_ : Finset.Nonempty Finset.univ) v
⊢ ∃ j, ∑ i : n, A i j ≤ 0
[PROOFSTEP]
obtain ⟨j₀, -, h_j₀⟩ := Finset.exists_mem_eq_sup' Finset.univ_nonempty v
[GOAL]
case intro.intro
n✝ : Type u_1
inst✝³ : Fintype n✝
n : Type u_1
inst✝² : Fintype n
inst✝¹ : DecidableEq n
S : Type u_2
inst✝ : LinearOrderedCommRing S
A : Matrix n n S
h1 : ∀ (i j : n), i ≠ j → A i j < 0
h✝ : Nonempty n
h2 : det A = 0
v : n → S
h_vnz : v ≠ 0
h_vA : vecMul v A = 0
h_sup : 0 < Finset.sup' Finset.univ (_ : Finset.Nonempty Finset.univ) v
j₀ : n
h_j₀ : Finset.sup' Finset.univ (_ : Finset.Nonempty Finset.univ) v = v j₀
⊢ ∃ j, ∑ i : n, A i j ≤ 0
[PROOFSTEP]
refine ⟨j₀, ?_⟩
[GOAL]
case intro.intro
n✝ : Type u_1
inst✝³ : Fintype n✝
n : Type u_1
inst✝² : Fintype n
inst✝¹ : DecidableEq n
S : Type u_2
inst✝ : LinearOrderedCommRing S
A : Matrix n n S
h1 : ∀ (i j : n), i ≠ j → A i j < 0
h✝ : Nonempty n
h2 : det A = 0
v : n → S
h_vnz : v ≠ 0
h_vA : vecMul v A = 0
h_sup : 0 < Finset.sup' Finset.univ (_ : Finset.Nonempty Finset.univ) v
j₀ : n
h_j₀ : Finset.sup' Finset.univ (_ : Finset.Nonempty Finset.univ) v = v j₀
⊢ ∑ i : n, A i j₀ ≤ 0
[PROOFSTEP]
rw [← mul_le_mul_left (h_j₀ ▸ h_sup), Finset.mul_sum, mul_zero]
[GOAL]
case intro.intro
n✝ : Type u_1
inst✝³ : Fintype n✝
n : Type u_1
inst✝² : Fintype n
inst✝¹ : DecidableEq n
S : Type u_2
inst✝ : LinearOrderedCommRing S
A : Matrix n n S
h1 : ∀ (i j : n), i ≠ j → A i j < 0
h✝ : Nonempty n
h2 : det A = 0
v : n → S
h_vnz : v ≠ 0
h_vA : vecMul v A = 0
h_sup : 0 < Finset.sup' Finset.univ (_ : Finset.Nonempty Finset.univ) v
j₀ : n
h_j₀ : Finset.sup' Finset.univ (_ : Finset.Nonempty Finset.univ) v = v j₀
⊢ ∑ x : n, v j₀ * A x j₀ ≤ 0
[PROOFSTEP]
rw [show 0 = ∑ i, v i * A i j₀ from (congrFun h_vA j₀).symm]
[GOAL]
case intro.intro
n✝ : Type u_1
inst✝³ : Fintype n✝
n : Type u_1
inst✝² : Fintype n
inst✝¹ : DecidableEq n
S : Type u_2
inst✝ : LinearOrderedCommRing S
A : Matrix n n S
h1 : ∀ (i j : n), i ≠ j → A i j < 0
h✝ : Nonempty n
h2 : det A = 0
v : n → S
h_vnz : v ≠ 0
h_vA : vecMul v A = 0
h_sup : 0 < Finset.sup' Finset.univ (_ : Finset.Nonempty Finset.univ) v
j₀ : n
h_j₀ : Finset.sup' Finset.univ (_ : Finset.Nonempty Finset.univ) v = v j₀
⊢ ∑ x : n, v j₀ * A x j₀ ≤ ∑ i : n, v i * A i j₀
[PROOFSTEP]
refine Finset.sum_le_sum (fun i hi => ?_)
[GOAL]
case intro.intro
n✝ : Type u_1
inst✝³ : Fintype n✝
n : Type u_1
inst✝² : Fintype n
inst✝¹ : DecidableEq n
S : Type u_2
inst✝ : LinearOrderedCommRing S
A : Matrix n n S
h1 : ∀ (i j : n), i ≠ j → A i j < 0
h✝ : Nonempty n
h2 : det A = 0
v : n → S
h_vnz : v ≠ 0
h_vA : vecMul v A = 0
h_sup : 0 < Finset.sup' Finset.univ (_ : Finset.Nonempty Finset.univ) v
j₀ : n
h_j₀ : Finset.sup' Finset.univ (_ : Finset.Nonempty Finset.univ) v = v j₀
i : n
hi : i ∈ Finset.univ
⊢ v j₀ * A i j₀ ≤ v i * A i j₀
[PROOFSTEP]
by_cases h : i = j₀
[GOAL]
case pos
n✝ : Type u_1
inst✝³ : Fintype n✝
n : Type u_1
inst✝² : Fintype n
inst✝¹ : DecidableEq n
S : Type u_2
inst✝ : LinearOrderedCommRing S
A : Matrix n n S
h1 : ∀ (i j : n), i ≠ j → A i j < 0
h✝ : Nonempty n
h2 : det A = 0
v : n → S
h_vnz : v ≠ 0
h_vA : vecMul v A = 0
h_sup : 0 < Finset.sup' Finset.univ (_ : Finset.Nonempty Finset.univ) v
j₀ : n
h_j₀ : Finset.sup' Finset.univ (_ : Finset.Nonempty Finset.univ) v = v j₀
i : n
hi : i ∈ Finset.univ
h : i = j₀
⊢ v j₀ * A i j₀ ≤ v i * A i j₀
[PROOFSTEP]
rw [h]
[GOAL]
case neg
n✝ : Type u_1
inst✝³ : Fintype n✝
n : Type u_1
inst✝² : Fintype n
inst✝¹ : DecidableEq n
S : Type u_2
inst✝ : LinearOrderedCommRing S
A : Matrix n n S
h1 : ∀ (i j : n), i ≠ j → A i j < 0
h✝ : Nonempty n
h2 : det A = 0
v : n → S
h_vnz : v ≠ 0
h_vA : vecMul v A = 0
h_sup : 0 < Finset.sup' Finset.univ (_ : Finset.Nonempty Finset.univ) v
j₀ : n
h_j₀ : Finset.sup' Finset.univ (_ : Finset.Nonempty Finset.univ) v = v j₀
i : n
hi : i ∈ Finset.univ
h : ¬i = j₀
⊢ v j₀ * A i j₀ ≤ v i * A i j₀
[PROOFSTEP]
exact (mul_le_mul_right_of_neg (h1 i j₀ h)).mpr (h_j₀ ▸ Finset.le_sup' v hi)
[GOAL]
n : Type u_1
inst✝² : Fintype n
inst✝¹ : DecidableEq n
S : Type u_2
inst✝ : LinearOrderedCommRing S
A : Matrix n n S
h1 : ∀ (i j : n), i ≠ j → A i j < 0
h2 : ∀ (i : n), 0 < ∑ j : n, A i j
⊢ det A ≠ 0
[PROOFSTEP]
rw [← Matrix.det_transpose]
[GOAL]
n : Type u_1
inst✝² : Fintype n
inst✝¹ : DecidableEq n
S : Type u_2
inst✝ : LinearOrderedCommRing S
A : Matrix n n S
h1 : ∀ (i j : n), i ≠ j → A i j < 0
h2 : ∀ (i : n), 0 < ∑ j : n, A i j
⊢ det Aᵀ ≠ 0
[PROOFSTEP]
refine det_ne_zero_of_sum_col_pos ?_ ?_
[GOAL]
case refine_1
n : Type u_1
inst✝² : Fintype n
inst✝¹ : DecidableEq n
S : Type u_2
inst✝ : LinearOrderedCommRing S
A : Matrix n n S
h1 : ∀ (i j : n), i ≠ j → A i j < 0
h2 : ∀ (i : n), 0 < ∑ j : n, A i j
⊢ ∀ (i j : n), i ≠ j → Aᵀ i j < 0
[PROOFSTEP]
simp_rw [Matrix.transpose_apply]
[GOAL]
case refine_1
n : Type u_1
inst✝² : Fintype n
inst✝¹ : DecidableEq n
S : Type u_2
inst✝ : LinearOrderedCommRing S
A : Matrix n n S
h1 : ∀ (i j : n), i ≠ j → A i j < 0
h2 : ∀ (i : n), 0 < ∑ j : n, A i j
⊢ ∀ (i j : n), i ≠ j → A j i < 0
[PROOFSTEP]
exact fun i j h => h1 j i h.symm
[GOAL]
case refine_2
n : Type u_1
inst✝² : Fintype n
inst✝¹ : DecidableEq n
S : Type u_2
inst✝ : LinearOrderedCommRing S
A : Matrix n n S
h1 : ∀ (i j : n), i ≠ j → A i j < 0
h2 : ∀ (i : n), 0 < ∑ j : n, A i j
⊢ ∀ (j : n), 0 < ∑ i : n, Aᵀ i j
[PROOFSTEP]
simp_rw [Matrix.transpose_apply]
[GOAL]
case refine_2
n : Type u_1
inst✝² : Fintype n
inst✝¹ : DecidableEq n
S : Type u_2
inst✝ : LinearOrderedCommRing S
A : Matrix n n S
h1 : ∀ (i j : n), i ≠ j → A i j < 0
h2 : ∀ (i : n), 0 < ∑ j : n, A i j
⊢ ∀ (j : n), 0 < ∑ x : n, A j x
[PROOFSTEP]
exact h2


[GOAL]
F : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ : C(X, Y)
f g : Homotopy f₀ f₁
h : (fun f => f.toFun) f = (fun f => f.toFun) g
⊢ f = g
[PROOFSTEP]
obtain ⟨⟨_, _⟩, _⟩ := f
[GOAL]
case mk.mk
F : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ : C(X, Y)
g : Homotopy f₀ f₁
toFun✝ : ↑I × X → Y
continuous_toFun✝ : Continuous toFun✝
map_zero_left✝ : ∀ (x : X), ContinuousMap.toFun (ContinuousMap.mk toFun✝) (0, x) = ↑f₀ x
map_one_left✝ : ∀ (x : X), ContinuousMap.toFun (ContinuousMap.mk toFun✝) (1, x) = ↑f₁ x
h :
  (fun f => f.toFun)
      { toContinuousMap := ContinuousMap.mk toFun✝, map_zero_left := map_zero_left✝, map_one_left := map_one_left✝ } =
    (fun f => f.toFun) g
⊢ { toContinuousMap := ContinuousMap.mk toFun✝, map_zero_left := map_zero_left✝, map_one_left := map_one_left✝ } = g
[PROOFSTEP]
obtain ⟨⟨_, _⟩, _⟩ := g
[GOAL]
case mk.mk.mk.mk
F : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ : C(X, Y)
toFun✝¹ : ↑I × X → Y
continuous_toFun✝¹ : Continuous toFun✝¹
map_zero_left✝¹ : ∀ (x : X), ContinuousMap.toFun (ContinuousMap.mk toFun✝¹) (0, x) = ↑f₀ x
map_one_left✝¹ : ∀ (x : X), ContinuousMap.toFun (ContinuousMap.mk toFun✝¹) (1, x) = ↑f₁ x
toFun✝ : ↑I × X → Y
continuous_toFun✝ : Continuous toFun✝
map_zero_left✝ : ∀ (x : X), ContinuousMap.toFun (ContinuousMap.mk toFun✝) (0, x) = ↑f₀ x
map_one_left✝ : ∀ (x : X), ContinuousMap.toFun (ContinuousMap.mk toFun✝) (1, x) = ↑f₁ x
h :
  (fun f => f.toFun)
      { toContinuousMap := ContinuousMap.mk toFun✝¹, map_zero_left := map_zero_left✝¹,
        map_one_left := map_one_left✝¹ } =
    (fun f => f.toFun)
      { toContinuousMap := ContinuousMap.mk toFun✝, map_zero_left := map_zero_left✝, map_one_left := map_one_left✝ }
⊢ { toContinuousMap := ContinuousMap.mk toFun✝¹, map_zero_left := map_zero_left✝¹, map_one_left := map_one_left✝¹ } =
    { toContinuousMap := ContinuousMap.mk toFun✝, map_zero_left := map_zero_left✝, map_one_left := map_one_left✝ }
[PROOFSTEP]
congr
[GOAL]
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ : C(X, Y)
F : Homotopy f₀ f₁
t : ℝ
ht : t ≤ 0
x : X
⊢ ↑(↑(extend F) t) x = ↑f₀ x
[PROOFSTEP]
rw [← F.apply_zero]
[GOAL]
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ : C(X, Y)
F : Homotopy f₀ f₁
t : ℝ
ht : t ≤ 0
x : X
⊢ ↑(↑(extend F) t) x = ↑F (0, x)
[PROOFSTEP]
exact ContinuousMap.congr_fun (Set.IccExtend_of_le_left (zero_le_one' ℝ) F.curry ht) x
[GOAL]
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ : C(X, Y)
F : Homotopy f₀ f₁
t : ℝ
ht : 1 ≤ t
x : X
⊢ ↑(↑(extend F) t) x = ↑f₁ x
[PROOFSTEP]
rw [← F.apply_one]
[GOAL]
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ : C(X, Y)
F : Homotopy f₀ f₁
t : ℝ
ht : 1 ≤ t
x : X
⊢ ↑(↑(extend F) t) x = ↑F (1, x)
[PROOFSTEP]
exact ContinuousMap.congr_fun (Set.IccExtend_of_right_le (zero_le_one' ℝ) F.curry ht) x
[GOAL]
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ : C(X, Y)
F : Homotopy f₀ f₁
⊢ ∀ (x : X), ContinuousMap.toFun (ContinuousMap.mk fun x => ↑F (σ x.fst, x.snd)) (0, x) = ↑f₁ x
[PROOFSTEP]
norm_num
[GOAL]
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ : C(X, Y)
F : Homotopy f₀ f₁
⊢ ∀ (x : X), ContinuousMap.toFun (ContinuousMap.mk fun x => ↑F (σ x.fst, x.snd)) (1, x) = ↑f₀ x
[PROOFSTEP]
norm_num
[GOAL]
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ : C(X, Y)
F : Homotopy f₀ f₁
⊢ symm (symm F) = F
[PROOFSTEP]
ext
[GOAL]
case h
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ : C(X, Y)
F : Homotopy f₀ f₁
x✝ : ↑I × X
⊢ ↑(symm (symm F)) x✝ = ↑F x✝
[PROOFSTEP]
simp
[GOAL]
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ f₂ : C(X, Y)
F : Homotopy f₀ f₁
G : Homotopy f₁ f₂
⊢ Continuous fun x =>
    if ↑x.fst ≤ 1 / 2 then ↑(↑(extend F) (2 * ↑x.fst)) x.snd else ↑(↑(extend G) (2 * ↑x.fst - 1)) x.snd
[PROOFSTEP]
refine'
  continuous_if_le (continuous_induced_dom.comp continuous_fst) continuous_const
    (F.continuous.comp (by continuity)).continuousOn (G.continuous.comp (by continuity)).continuousOn _
[GOAL]
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ f₂ : C(X, Y)
F : Homotopy f₀ f₁
G : Homotopy f₁ f₂
⊢ Continuous fun x => (Set.projIcc 0 1 extend.proof_1 (2 * ↑x.fst), x.snd)
[PROOFSTEP]
continuity
[GOAL]
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ f₂ : C(X, Y)
F : Homotopy f₀ f₁
G : Homotopy f₁ f₂
⊢ Continuous fun x => (Set.projIcc 0 1 extend.proof_1 (2 * ↑x.fst - 1), x.snd)
[PROOFSTEP]
continuity
[GOAL]
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ f₂ : C(X, Y)
F : Homotopy f₀ f₁
G : Homotopy f₁ f₂
⊢ ∀ (x : ↑I × X), ↑x.fst = 1 / 2 → ↑(↑(extend F) (2 * ↑x.fst)) x.snd = ↑(↑(extend G) (2 * ↑x.fst - 1)) x.snd
[PROOFSTEP]
rintro x hx
[GOAL]
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ f₂ : C(X, Y)
F : Homotopy f₀ f₁
G : Homotopy f₁ f₂
x : ↑I × X
hx : ↑x.fst = 1 / 2
⊢ ↑(↑(extend F) (2 * ↑x.fst)) x.snd = ↑(↑(extend G) (2 * ↑x.fst - 1)) x.snd
[PROOFSTEP]
rw [hx]
[GOAL]
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ f₂ : C(X, Y)
F : Homotopy f₀ f₁
G : Homotopy f₁ f₂
x : ↑I × X
hx : ↑x.fst = 1 / 2
⊢ ↑(↑(extend F) (2 * (1 / 2))) x.snd = ↑(↑(extend G) (2 * (1 / 2) - 1)) x.snd
[PROOFSTEP]
norm_num
[GOAL]
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ f₂ : C(X, Y)
F : Homotopy f₀ f₁
G : Homotopy f₁ f₂
x : X
⊢ ContinuousMap.toFun
      (ContinuousMap.mk fun x =>
        if ↑x.fst ≤ 1 / 2 then ↑(↑(extend F) (2 * ↑x.fst)) x.snd else ↑(↑(extend G) (2 * ↑x.fst - 1)) x.snd)
      (0, x) =
    ↑f₀ x
[PROOFSTEP]
norm_num
[GOAL]
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ f₂ : C(X, Y)
F : Homotopy f₀ f₁
G : Homotopy f₁ f₂
x : X
⊢ ContinuousMap.toFun
      (ContinuousMap.mk fun x =>
        if ↑x.fst ≤ 1 / 2 then ↑(↑(extend F) (2 * ↑x.fst)) x.snd else ↑(↑(extend G) (2 * ↑x.fst - 1)) x.snd)
      (1, x) =
    ↑f₂ x
[PROOFSTEP]
norm_num
[GOAL]
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ f₂ : C(X, Y)
F : Homotopy f₀ f₁
G : Homotopy f₁ f₂
x : ↑I × X
⊢ (if ↑x.fst ≤ 1 / 2 then ↑(↑(extend F) (2 * ↑x.fst)) x.snd else ↑(↑(extend G) (2 * ↑x.fst - 1)) x.snd) =
    if h : ↑x.fst ≤ 1 / 2 then ↑F ({ val := 2 * ↑x.fst, property := (_ : 2 * ↑x.fst ∈ I) }, x.snd)
    else ↑G ({ val := 2 * ↑x.fst - 1, property := (_ : 2 * ↑x.fst - 1 ∈ I) }, x.snd)
[PROOFSTEP]
split_ifs
[GOAL]
case pos
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ f₂ : C(X, Y)
F : Homotopy f₀ f₁
G : Homotopy f₁ f₂
x : ↑I × X
h✝ : ↑x.fst ≤ 1 / 2
⊢ ↑(↑(extend F) (2 * ↑x.fst)) x.snd = ↑F ({ val := 2 * ↑x.fst, property := (_ : 2 * ↑x.fst ∈ I) }, x.snd)
[PROOFSTEP]
rw [extend, ContinuousMap.coe_IccExtend, Set.IccExtend_of_mem]
[GOAL]
case pos
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ f₂ : C(X, Y)
F : Homotopy f₀ f₁
G : Homotopy f₁ f₂
x : ↑I × X
h✝ : ↑x.fst ≤ 1 / 2
⊢ ↑(↑(curry F) { val := 2 * ↑x.fst, property := ?pos.hx✝ }) x.snd =
    ↑F ({ val := 2 * ↑x.fst, property := (_ : 2 * ↑x.fst ∈ I) }, x.snd)
case pos.hx
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ f₂ : C(X, Y)
F : Homotopy f₀ f₁
G : Homotopy f₁ f₂
x : ↑I × X
h✝ : ↑x.fst ≤ 1 / 2
⊢ 2 * ↑x.fst ∈ Set.Icc 0 1
[PROOFSTEP]
rfl
[GOAL]
case neg
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ f₂ : C(X, Y)
F : Homotopy f₀ f₁
G : Homotopy f₁ f₂
x : ↑I × X
h✝ : ¬↑x.fst ≤ 1 / 2
⊢ ↑(↑(extend G) (2 * ↑x.fst - 1)) x.snd = ↑G ({ val := 2 * ↑x.fst - 1, property := (_ : 2 * ↑x.fst - 1 ∈ I) }, x.snd)
[PROOFSTEP]
rw [extend, ContinuousMap.coe_IccExtend, Set.IccExtend_of_mem]
[GOAL]
case neg
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ f₂ : C(X, Y)
F : Homotopy f₀ f₁
G : Homotopy f₁ f₂
x : ↑I × X
h✝ : ¬↑x.fst ≤ 1 / 2
⊢ ↑(↑(curry G) { val := 2 * ↑x.fst - 1, property := ?neg.hx✝ }) x.snd =
    ↑G ({ val := 2 * ↑x.fst - 1, property := (_ : 2 * ↑x.fst - 1 ∈ I) }, x.snd)
case neg.hx
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ f₂ : C(X, Y)
F : Homotopy f₀ f₁
G : Homotopy f₁ f₂
x : ↑I × X
h✝ : ¬↑x.fst ≤ 1 / 2
⊢ 2 * ↑x.fst - 1 ∈ Set.Icc 0 1
[PROOFSTEP]
rfl
[GOAL]
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ f₂ : C(X, Y)
F : Homotopy f₀ f₁
G : Homotopy f₁ f₂
⊢ symm (trans F G) = trans (symm G) (symm F)
[PROOFSTEP]
ext ⟨t, _⟩
[GOAL]
case h.mk
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ f₂ : C(X, Y)
F : Homotopy f₀ f₁
G : Homotopy f₁ f₂
t : ↑I
snd✝ : X
⊢ ↑(symm (trans F G)) (t, snd✝) = ↑(trans (symm G) (symm F)) (t, snd✝)
[PROOFSTEP]
rw [trans_apply, symm_apply, trans_apply]
[GOAL]
case h.mk
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ f₂ : C(X, Y)
F : Homotopy f₀ f₁
G : Homotopy f₁ f₂
t : ↑I
snd✝ : X
⊢ (if h : ↑(σ (t, snd✝).fst, (t, snd✝).snd).fst ≤ 1 / 2 then
      ↑F
        ({ val := 2 * ↑(σ (t, snd✝).fst, (t, snd✝).snd).fst,
            property := (_ : 2 * ↑(σ (t, snd✝).fst, (t, snd✝).snd).fst ∈ I) },
          (σ (t, snd✝).fst, (t, snd✝).snd).snd)
    else
      ↑G
        ({ val := 2 * ↑(σ (t, snd✝).fst, (t, snd✝).snd).fst - 1,
            property := (_ : 2 * ↑(σ (t, snd✝).fst, (t, snd✝).snd).fst - 1 ∈ I) },
          (σ (t, snd✝).fst, (t, snd✝).snd).snd)) =
    if h : ↑(t, snd✝).fst ≤ 1 / 2 then
      ↑(symm G) ({ val := 2 * ↑(t, snd✝).fst, property := (_ : 2 * ↑(t, snd✝).fst ∈ I) }, (t, snd✝).snd)
    else ↑(symm F) ({ val := 2 * ↑(t, snd✝).fst - 1, property := (_ : 2 * ↑(t, snd✝).fst - 1 ∈ I) }, (t, snd✝).snd)
[PROOFSTEP]
simp only [coe_symm_eq, symm_apply]
[GOAL]
case h.mk
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ f₂ : C(X, Y)
F : Homotopy f₀ f₁
G : Homotopy f₁ f₂
t : ↑I
snd✝ : X
⊢ (if h : 1 - ↑t ≤ 1 / 2 then ↑F ({ val := 2 * (1 - ↑t), property := (_ : (fun x => x ∈ I) (2 * (1 - ↑t))) }, snd✝)
    else ↑G ({ val := 2 * (1 - ↑t) - 1, property := (_ : (fun x => x ∈ I) (2 * (1 - ↑t) - 1)) }, snd✝)) =
    if h : ↑t ≤ 1 / 2 then ↑G (σ { val := 2 * ↑t, property := (_ : 2 * ↑(t, snd✝).fst ∈ I) }, snd✝)
    else ↑F (σ { val := 2 * ↑t - 1, property := (_ : 2 * ↑(t, snd✝).fst - 1 ∈ I) }, snd✝)
[PROOFSTEP]
split_ifs with h₁ h₂ h₂
[GOAL]
case pos
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ f₂ : C(X, Y)
F : Homotopy f₀ f₁
G : Homotopy f₁ f₂
t : ↑I
snd✝ : X
h₁ : 1 - ↑t ≤ 1 / 2
h₂ : ↑t ≤ 1 / 2
⊢ ↑F ({ val := 2 * (1 - ↑t), property := (_ : (fun x => x ∈ I) (2 * (1 - ↑t))) }, snd✝) =
    ↑G (σ { val := 2 * ↑t, property := (_ : 2 * ↑(t, snd✝).fst ∈ I) }, snd✝)
[PROOFSTEP]
have ht : (t : ℝ) = 1 / 2 := by linarith
[GOAL]
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ f₂ : C(X, Y)
F : Homotopy f₀ f₁
G : Homotopy f₁ f₂
t : ↑I
snd✝ : X
h₁ : 1 - ↑t ≤ 1 / 2
h₂ : ↑t ≤ 1 / 2
⊢ ↑t = 1 / 2
[PROOFSTEP]
linarith
[GOAL]
case pos
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ f₂ : C(X, Y)
F : Homotopy f₀ f₁
G : Homotopy f₁ f₂
t : ↑I
snd✝ : X
h₁ : 1 - ↑t ≤ 1 / 2
h₂ : ↑t ≤ 1 / 2
ht : ↑t = 1 / 2
⊢ ↑F ({ val := 2 * (1 - ↑t), property := (_ : (fun x => x ∈ I) (2 * (1 - ↑t))) }, snd✝) =
    ↑G (σ { val := 2 * ↑t, property := (_ : 2 * ↑(t, snd✝).fst ∈ I) }, snd✝)
[PROOFSTEP]
simp only [ht]
[GOAL]
case pos
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ f₂ : C(X, Y)
F : Homotopy f₀ f₁
G : Homotopy f₁ f₂
t : ↑I
snd✝ : X
h₁ : 1 - ↑t ≤ 1 / 2
h₂ : ↑t ≤ 1 / 2
ht : ↑t = 1 / 2
⊢ ↑F ({ val := 2 * (1 - 1 / 2), property := (_ : (fun x => x ∈ I) (2 * (1 - 1 / 2))) }, snd✝) =
    ↑G (σ { val := 2 * (1 / 2), property := (_ : (fun x => x ∈ I) (2 * (1 / 2))) }, snd✝)
[PROOFSTEP]
norm_num
[GOAL]
case neg
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ f₂ : C(X, Y)
F : Homotopy f₀ f₁
G : Homotopy f₁ f₂
t : ↑I
snd✝ : X
h₁ : 1 - ↑t ≤ 1 / 2
h₂ : ¬↑t ≤ 1 / 2
⊢ ↑F ({ val := 2 * (1 - ↑t), property := (_ : (fun x => x ∈ I) (2 * (1 - ↑t))) }, snd✝) =
    ↑F (σ { val := 2 * ↑t - 1, property := (_ : 2 * ↑(t, snd✝).fst - 1 ∈ I) }, snd✝)
[PROOFSTEP]
congr 2
[GOAL]
case neg.h.e_6.h.e_fst
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ f₂ : C(X, Y)
F : Homotopy f₀ f₁
G : Homotopy f₁ f₂
t : ↑I
snd✝ : X
h₁ : 1 - ↑t ≤ 1 / 2
h₂ : ¬↑t ≤ 1 / 2
⊢ { val := 2 * (1 - ↑t), property := (_ : (fun x => x ∈ I) (2 * (1 - ↑t))) } =
    σ { val := 2 * ↑t - 1, property := (_ : 2 * ↑(t, snd✝).fst - 1 ∈ I) }
[PROOFSTEP]
apply Subtype.ext
[GOAL]
case neg.h.e_6.h.e_fst.a
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ f₂ : C(X, Y)
F : Homotopy f₀ f₁
G : Homotopy f₁ f₂
t : ↑I
snd✝ : X
h₁ : 1 - ↑t ≤ 1 / 2
h₂ : ¬↑t ≤ 1 / 2
⊢ ↑{ val := 2 * (1 - ↑t), property := (_ : (fun x => x ∈ I) (2 * (1 - ↑t))) } =
    ↑(σ { val := 2 * ↑t - 1, property := (_ : 2 * ↑(t, snd✝).fst - 1 ∈ I) })
[PROOFSTEP]
simp only [coe_symm_eq]
[GOAL]
case neg.h.e_6.h.e_fst.a
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ f₂ : C(X, Y)
F : Homotopy f₀ f₁
G : Homotopy f₁ f₂
t : ↑I
snd✝ : X
h₁ : 1 - ↑t ≤ 1 / 2
h₂ : ¬↑t ≤ 1 / 2
⊢ 2 * (1 - ↑t) = 1 - (2 * ↑t - 1)
[PROOFSTEP]
linarith
[GOAL]
case pos
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ f₂ : C(X, Y)
F : Homotopy f₀ f₁
G : Homotopy f₁ f₂
t : ↑I
snd✝ : X
h₁ : ¬1 - ↑t ≤ 1 / 2
h₂ : ↑t ≤ 1 / 2
⊢ ↑G ({ val := 2 * (1 - ↑t) - 1, property := (_ : (fun x => x ∈ I) (2 * (1 - ↑t) - 1)) }, snd✝) =
    ↑G (σ { val := 2 * ↑t, property := (_ : 2 * ↑(t, snd✝).fst ∈ I) }, snd✝)
[PROOFSTEP]
congr 2
[GOAL]
case pos.h.e_6.h.e_fst
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ f₂ : C(X, Y)
F : Homotopy f₀ f₁
G : Homotopy f₁ f₂
t : ↑I
snd✝ : X
h₁ : ¬1 - ↑t ≤ 1 / 2
h₂ : ↑t ≤ 1 / 2
⊢ { val := 2 * (1 - ↑t) - 1, property := (_ : (fun x => x ∈ I) (2 * (1 - ↑t) - 1)) } =
    σ { val := 2 * ↑t, property := (_ : 2 * ↑(t, snd✝).fst ∈ I) }
[PROOFSTEP]
apply Subtype.ext
[GOAL]
case pos.h.e_6.h.e_fst.a
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ f₂ : C(X, Y)
F : Homotopy f₀ f₁
G : Homotopy f₁ f₂
t : ↑I
snd✝ : X
h₁ : ¬1 - ↑t ≤ 1 / 2
h₂ : ↑t ≤ 1 / 2
⊢ ↑{ val := 2 * (1 - ↑t) - 1, property := (_ : (fun x => x ∈ I) (2 * (1 - ↑t) - 1)) } =
    ↑(σ { val := 2 * ↑t, property := (_ : 2 * ↑(t, snd✝).fst ∈ I) })
[PROOFSTEP]
simp only [coe_symm_eq]
[GOAL]
case pos.h.e_6.h.e_fst.a
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ f₂ : C(X, Y)
F : Homotopy f₀ f₁
G : Homotopy f₁ f₂
t : ↑I
snd✝ : X
h₁ : ¬1 - ↑t ≤ 1 / 2
h₂ : ↑t ≤ 1 / 2
⊢ 2 * (1 - ↑t) - 1 = 1 - 2 * ↑t
[PROOFSTEP]
linarith
[GOAL]
case neg
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ f₂ : C(X, Y)
F : Homotopy f₀ f₁
G : Homotopy f₁ f₂
t : ↑I
snd✝ : X
h₁ : ¬1 - ↑t ≤ 1 / 2
h₂ : ¬↑t ≤ 1 / 2
⊢ ↑G ({ val := 2 * (1 - ↑t) - 1, property := (_ : (fun x => x ∈ I) (2 * (1 - ↑t) - 1)) }, snd✝) =
    ↑F (σ { val := 2 * ↑t - 1, property := (_ : 2 * ↑(t, snd✝).fst - 1 ∈ I) }, snd✝)
[PROOFSTEP]
exfalso
[GOAL]
case neg.h
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ f₂ : C(X, Y)
F : Homotopy f₀ f₁
G : Homotopy f₁ f₂
t : ↑I
snd✝ : X
h₁ : ¬1 - ↑t ≤ 1 / 2
h₂ : ¬↑t ≤ 1 / 2
⊢ False
[PROOFSTEP]
linarith
[GOAL]
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ g₀ g₁ : C(X, Y)
F : Homotopy f₀ f₁
h₀ : f₀ = g₀
h₁ : f₁ = g₁
⊢ ∀ (x : X), ContinuousMap.toFun (ContinuousMap.mk ↑F) (0, x) = ↑g₀ x
[PROOFSTEP]
simp [← h₀]
[GOAL]
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ g₀ g₁ : C(X, Y)
F : Homotopy f₀ f₁
h₀ : f₀ = g₀
h₁ : f₁ = g₁
⊢ ∀ (x : X), ContinuousMap.toFun (ContinuousMap.mk ↑F) (1, x) = ↑g₁ x
[PROOFSTEP]
simp [← h₁]
[GOAL]
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ : C(X, Y)
g₀ g₁ : C(Y, Z)
F : Homotopy f₀ f₁
G : Homotopy g₀ g₁
⊢ ∀ (x : X), ContinuousMap.toFun (ContinuousMap.mk fun x => ↑G (x.fst, ↑F x)) (0, x) = ↑(comp g₀ f₀) x
[PROOFSTEP]
simp
[GOAL]
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ : C(X, Y)
g₀ g₁ : C(Y, Z)
F : Homotopy f₀ f₁
G : Homotopy g₀ g₁
⊢ ∀ (x : X), ContinuousMap.toFun (ContinuousMap.mk fun x => ↑G (x.fst, ↑F x)) (1, x) = ↑(comp g₁ f₁) x
[PROOFSTEP]
simp
[GOAL]
F : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
⊢ ∀ {x y : C(X, Y)}, Homotopic x y → Homotopic y x
[PROOFSTEP]
apply symm
[GOAL]
F : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
⊢ ∀ {x y z : C(X, Y)}, Homotopic x y → Homotopic y z → Homotopic x z
[PROOFSTEP]
apply trans
[GOAL]
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
P : C(X, Y) → Prop
f₀ f₁ f₂ : C(X, Y)
F : HomotopyWith f₀ f₁ P
G : HomotopyWith f₁ f₂ P
src✝ : Homotopy f₀ f₂ := Homotopy.trans F.toHomotopy G.toHomotopy
t : ↑I
⊢ P
    (ContinuousMap.mk fun x =>
      ContinuousMap.toFun
        { toContinuousMap := src✝.toContinuousMap,
            map_zero_left := (_ : ∀ (x : X), ContinuousMap.toFun src✝.toContinuousMap (0, x) = ↑f₀ x),
            map_one_left := (_ : ∀ (x : X), ContinuousMap.toFun src✝.toContinuousMap (1, x) = ↑f₂ x) }.toContinuousMap
        (t, x))
[PROOFSTEP]
simp only [Homotopy.trans]
[GOAL]
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
P : C(X, Y) → Prop
f₀ f₁ f₂ : C(X, Y)
F : HomotopyWith f₀ f₁ P
G : HomotopyWith f₁ f₂ P
src✝ : Homotopy f₀ f₂ := Homotopy.trans F.toHomotopy G.toHomotopy
t : ↑I
⊢ P
    (ContinuousMap.mk fun x =>
      if ↑t ≤ 1 / 2 then ↑(↑(Homotopy.extend F.toHomotopy) (2 * ↑t)) x
      else ↑(↑(Homotopy.extend G.toHomotopy) (2 * ↑t - 1)) x)
[PROOFSTEP]
change P ⟨fun _ => ite ((t : ℝ) ≤ _) _ _, _⟩
[GOAL]
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
P : C(X, Y) → Prop
f₀ f₁ f₂ : C(X, Y)
F : HomotopyWith f₀ f₁ P
G : HomotopyWith f₁ f₂ P
src✝ : Homotopy f₀ f₂ := Homotopy.trans F.toHomotopy G.toHomotopy
t : ↑I
⊢ P
    (ContinuousMap.mk fun x =>
      if ↑t ≤ 1 / 2 then ↑(↑(Homotopy.extend F.toHomotopy) (2 * ↑t)) x
      else ↑(↑(Homotopy.extend G.toHomotopy) (2 * ↑t - 1)) x)
[PROOFSTEP]
split_ifs
[GOAL]
case pos
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
P : C(X, Y) → Prop
f₀ f₁ f₂ : C(X, Y)
F : HomotopyWith f₀ f₁ P
G : HomotopyWith f₁ f₂ P
src✝ : Homotopy f₀ f₂ := Homotopy.trans F.toHomotopy G.toHomotopy
t : ↑I
h✝ : ↑t ≤ 1 / 2
⊢ P (ContinuousMap.mk fun x => ↑(↑(Homotopy.extend F.toHomotopy) (2 * ↑t)) x)
[PROOFSTEP]
exact F.extendProp _
[GOAL]
case neg
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
P : C(X, Y) → Prop
f₀ f₁ f₂ : C(X, Y)
F : HomotopyWith f₀ f₁ P
G : HomotopyWith f₁ f₂ P
src✝ : Homotopy f₀ f₂ := Homotopy.trans F.toHomotopy G.toHomotopy
t : ↑I
h✝ : ¬↑t ≤ 1 / 2
⊢ P (ContinuousMap.mk fun x => ↑(↑(Homotopy.extend G.toHomotopy) (2 * ↑t - 1)) x)
[PROOFSTEP]
exact G.extendProp _
[GOAL]
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ f₂ : C(X, Y)
S : Set X
F : HomotopyRel f₀ f₁ S
G : HomotopyRel f₁ f₂ S
src✝ : Homotopy f₀ f₂ := Homotopy.trans F.toHomotopy G.toHomotopy
t : ↑I
x : X
hx : x ∈ S
⊢ ↑(mk fun x =>
            ContinuousMap.toFun
              { toContinuousMap := src✝.toContinuousMap,
                  map_zero_left := (_ : ∀ (x : X), ContinuousMap.toFun src✝.toContinuousMap (0, x) = ↑f₀ x),
                  map_one_left :=
                    (_ : ∀ (x : X), ContinuousMap.toFun src✝.toContinuousMap (1, x) = ↑f₂ x) }.toContinuousMap
              (t, x))
        x =
      ↑f₀ x ∧
    ↑(mk fun x =>
            ContinuousMap.toFun
              { toContinuousMap := src✝.toContinuousMap,
                  map_zero_left := (_ : ∀ (x : X), ContinuousMap.toFun src✝.toContinuousMap (0, x) = ↑f₀ x),
                  map_one_left :=
                    (_ : ∀ (x : X), ContinuousMap.toFun src✝.toContinuousMap (1, x) = ↑f₂ x) }.toContinuousMap
              (t, x))
        x =
      ↑f₂ x
[PROOFSTEP]
simp only [Homotopy.trans]
[GOAL]
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ f₂ : C(X, Y)
S : Set X
F : HomotopyRel f₀ f₁ S
G : HomotopyRel f₁ f₂ S
src✝ : Homotopy f₀ f₂ := Homotopy.trans F.toHomotopy G.toHomotopy
t : ↑I
x : X
hx : x ∈ S
⊢ ↑(mk fun x =>
            if ↑t ≤ 1 / 2 then ↑(↑(Homotopy.extend F.toHomotopy) (2 * ↑t)) x
            else ↑(↑(Homotopy.extend G.toHomotopy) (2 * ↑t - 1)) x)
        x =
      ↑f₀ x ∧
    ↑(mk fun x =>
            if ↑t ≤ 1 / 2 then ↑(↑(Homotopy.extend F.toHomotopy) (2 * ↑t)) x
            else ↑(↑(Homotopy.extend G.toHomotopy) (2 * ↑t - 1)) x)
        x =
      ↑f₂ x
[PROOFSTEP]
change (⟨fun _ => ite ((t : ℝ) ≤ _) _ _, _⟩ : C(X, Y)) _ = _ ∧ _ = _
[GOAL]
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ f₂ : C(X, Y)
S : Set X
F : HomotopyRel f₀ f₁ S
G : HomotopyRel f₁ f₂ S
src✝ : Homotopy f₀ f₂ := Homotopy.trans F.toHomotopy G.toHomotopy
t : ↑I
x : X
hx : x ∈ S
⊢ ↑(mk fun x =>
            if ↑t ≤ 1 / 2 then ↑(↑(Homotopy.extend F.toHomotopy) (2 * ↑t)) x
            else ↑(↑(Homotopy.extend G.toHomotopy) (2 * ↑t - 1)) x)
        x =
      ↑f₀ x ∧
    ↑(mk fun x =>
            if ↑t ≤ 1 / 2 then ↑(↑(Homotopy.extend F.toHomotopy) (2 * ↑t)) x
            else ↑(↑(Homotopy.extend G.toHomotopy) (2 * ↑t - 1)) x)
        x =
      ↑f₂ x
[PROOFSTEP]
split_ifs
[GOAL]
case pos
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ f₂ : C(X, Y)
S : Set X
F : HomotopyRel f₀ f₁ S
G : HomotopyRel f₁ f₂ S
src✝ : Homotopy f₀ f₂ := Homotopy.trans F.toHomotopy G.toHomotopy
t : ↑I
x : X
hx : x ∈ S
h✝ : ↑t ≤ 1 / 2
⊢ ↑(mk fun x => ↑(↑(Homotopy.extend F.toHomotopy) (2 * ↑t)) x) x = ↑f₀ x ∧
    ↑(mk fun x => ↑(↑(Homotopy.extend F.toHomotopy) (2 * ↑t)) x) x = ↑f₂ x
[PROOFSTEP]
simp [(HomotopyWith.extendProp F (2 * t) x hx).1, F.fst_eq_snd hx, G.fst_eq_snd hx]
[GOAL]
case neg
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀ f₁ f₂ : C(X, Y)
S : Set X
F : HomotopyRel f₀ f₁ S
G : HomotopyRel f₁ f₂ S
src✝ : Homotopy f₀ f₂ := Homotopy.trans F.toHomotopy G.toHomotopy
t : ↑I
x : X
hx : x ∈ S
h✝ : ¬↑t ≤ 1 / 2
⊢ ↑(mk fun x => ↑(↑(Homotopy.extend G.toHomotopy) (2 * ↑t - 1)) x) x = ↑f₀ x ∧
    ↑(mk fun x => ↑(↑(Homotopy.extend G.toHomotopy) (2 * ↑t - 1)) x) x = ↑f₂ x
[PROOFSTEP]
simp [(HomotopyWith.extendProp G (2 * t - 1) x hx).1, F.fst_eq_snd hx, G.fst_eq_snd hx]
[GOAL]
F✝ : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
f₀✝ f₁✝ f₂ : C(X, Y)
S : Set X
f₀ f₁ g₀ g₁ : C(X, Y)
F : HomotopyRel f₀ f₁ S
h₀ : f₀ = g₀
h₁ : f₁ = g₁
t : ↑I
x : X
hx : x ∈ S
⊢ ↑(mk fun x => ContinuousMap.toFun (Homotopy.cast F.toHomotopy h₀ h₁).toContinuousMap (t, x)) x = ↑g₀ x ∧
    ↑(mk fun x => ContinuousMap.toFun (Homotopy.cast F.toHomotopy h₀ h₁).toContinuousMap (t, x)) x = ↑g₁ x
[PROOFSTEP]
simpa only [← h₀, ← h₁] using F.prop t x hx
[GOAL]
F : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
S : Set X
⊢ ∀ {x y : C(X, Y)}, HomotopicRel x y S → HomotopicRel y x S
[PROOFSTEP]
apply symm
[GOAL]
F : Type u_1
X : Type u
Y : Type v
Z : Type w
Z' : Type x
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : TopologicalSpace Z'
S : Set X
⊢ ∀ {x y z : C(X, Y)}, HomotopicRel x y S → HomotopicRel y z S → HomotopicRel x z S
[PROOFSTEP]
apply trans


[GOAL]
C : Type u
inst✝ : Category.{v, u} C
a✝ b✝ c✝ d✝ : LocallyDiscrete C
f : a✝ ⟶ b✝
g : b✝ ⟶ c✝
h : c✝ ⟶ d✝
⊢ (f ≫ g) ≫ h = f ≫ g ≫ h
[PROOFSTEP]
apply Discrete.ext
[GOAL]
case as
C : Type u
inst✝ : Category.{v, u} C
a✝ b✝ c✝ d✝ : LocallyDiscrete C
f : a✝ ⟶ b✝
g : b✝ ⟶ c✝
h : c✝ ⟶ d✝
⊢ ((f ≫ g) ≫ h).as = (f ≫ g ≫ h).as
[PROOFSTEP]
change (f.as ≫ g.as) ≫ h.as = f.as ≫ (g.as ≫ h.as)
[GOAL]
case as
C : Type u
inst✝ : Category.{v, u} C
a✝ b✝ c✝ d✝ : LocallyDiscrete C
f : a✝ ⟶ b✝
g : b✝ ⟶ c✝
h : c✝ ⟶ d✝
⊢ (f.as ≫ g.as) ≫ h.as = f.as ≫ g.as ≫ h.as
[PROOFSTEP]
rw [Category.assoc]
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
a✝ b✝ : LocallyDiscrete C
f : a✝ ⟶ b✝
⊢ 𝟙 a✝ ≫ f = f
[PROOFSTEP]
apply Discrete.ext
[GOAL]
case as
C : Type u
inst✝ : Category.{v, u} C
a✝ b✝ : LocallyDiscrete C
f : a✝ ⟶ b✝
⊢ (𝟙 a✝ ≫ f).as = f.as
[PROOFSTEP]
change 𝟙 _ ≫ _ = _
[GOAL]
case as
C : Type u
inst✝ : Category.{v, u} C
a✝ b✝ : LocallyDiscrete C
f : a✝ ⟶ b✝
⊢ 𝟙 a✝ ≫ f.as = f.as
[PROOFSTEP]
rw [Category.id_comp]
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
a✝ b✝ : LocallyDiscrete C
f : a✝ ⟶ b✝
⊢ f ≫ 𝟙 b✝ = f
[PROOFSTEP]
apply Discrete.ext
[GOAL]
case as
C : Type u
inst✝ : Category.{v, u} C
a✝ b✝ : LocallyDiscrete C
f : a✝ ⟶ b✝
⊢ (f ≫ 𝟙 b✝).as = f.as
[PROOFSTEP]
change _ ≫ 𝟙 _ = _
[GOAL]
case as
C : Type u
inst✝ : Category.{v, u} C
a✝ b✝ : LocallyDiscrete C
f : a✝ ⟶ b✝
⊢ f.as ≫ 𝟙 b✝ = f.as
[PROOFSTEP]
rw [Category.comp_id]
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
⊢ ∀ {a b : LocallyDiscrete C} (f : a ⟶ b), 𝟙 a ≫ f = f
[PROOFSTEP]
intros
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
a✝ b✝ : LocallyDiscrete C
f✝ : a✝ ⟶ b✝
⊢ 𝟙 a✝ ≫ f✝ = f✝
[PROOFSTEP]
apply Discrete.ext
[GOAL]
case as
C : Type u
inst✝ : Category.{v, u} C
a✝ b✝ : LocallyDiscrete C
f✝ : a✝ ⟶ b✝
⊢ (𝟙 a✝ ≫ f✝).as = f✝.as
[PROOFSTEP]
apply Category.id_comp
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
⊢ ∀ {a b : LocallyDiscrete C} (f : a ⟶ b), f ≫ 𝟙 b = f
[PROOFSTEP]
intros
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
a✝ b✝ : LocallyDiscrete C
f✝ : a✝ ⟶ b✝
⊢ f✝ ≫ 𝟙 b✝ = f✝
[PROOFSTEP]
apply Discrete.ext
[GOAL]
case as
C : Type u
inst✝ : Category.{v, u} C
a✝ b✝ : LocallyDiscrete C
f✝ : a✝ ⟶ b✝
⊢ (f✝ ≫ 𝟙 b✝).as = f✝.as
[PROOFSTEP]
apply Category.comp_id
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
⊢ ∀ {a b c d : LocallyDiscrete C} (f : a ⟶ b) (g : b ⟶ c) (h : c ⟶ d), (f ≫ g) ≫ h = f ≫ g ≫ h
[PROOFSTEP]
intros
[GOAL]
C : Type u
inst✝ : Category.{v, u} C
a✝ b✝ c✝ d✝ : LocallyDiscrete C
f✝ : a✝ ⟶ b✝
g✝ : b✝ ⟶ c✝
h✝ : c✝ ⟶ d✝
⊢ (f✝ ≫ g✝) ≫ h✝ = f✝ ≫ g✝ ≫ h✝
[PROOFSTEP]
apply Discrete.ext
[GOAL]
case as
C : Type u
inst✝ : Category.{v, u} C
a✝ b✝ c✝ d✝ : LocallyDiscrete C
f✝ : a✝ ⟶ b✝
g✝ : b✝ ⟶ c✝
h✝ : c✝ ⟶ d✝
⊢ ((f✝ ≫ g✝) ≫ h✝).as = (f✝ ≫ g✝ ≫ h✝).as
[PROOFSTEP]
apply Category.assoc


[GOAL]
X : TopCat
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
F : Presheaf CommRingCat X
G : SubmonoidPresheaf F
U : (Opens ↑X)ᵒᵖ
⊢ { obj := fun U => CommRingCat.of (Localization (obj G U)),
          map := fun {U V} i =>
            CommRingCat.ofHom
              (IsLocalization.map (Localization (obj G V)) (F.map i)
                (_ : obj G U ≤ Submonoid.comap (F.map i) (obj G V))) }.map
      (𝟙 U) =
    𝟙
      ({ obj := fun U => CommRingCat.of (Localization (obj G U)),
            map := fun {U V} i =>
              CommRingCat.ofHom
                (IsLocalization.map (Localization (obj G V)) (F.map i)
                  (_ : obj G U ≤ Submonoid.comap (F.map i) (obj G V))) }.obj
        U)
[PROOFSTEP]
simp_rw [F.map_id]
[GOAL]
X : TopCat
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
F : Presheaf CommRingCat X
G : SubmonoidPresheaf F
U : (Opens ↑X)ᵒᵖ
⊢ CommRingCat.ofHom
      (IsLocalization.map (Localization (obj G U)) (𝟙 (F.obj U))
        (_ : obj G U ≤ Submonoid.comap (𝟙 (F.obj U)) (obj G U))) =
    𝟙 (CommRingCat.of (Localization (obj G U)))
[PROOFSTEP]
ext x
[GOAL]
case w
X : TopCat
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
F : Presheaf CommRingCat X
G : SubmonoidPresheaf F
U : (Opens ↑X)ᵒᵖ
x : (forget CommRingCat).obj (CommRingCat.of (Localization (obj G U)))
⊢ ↑(CommRingCat.ofHom
          (IsLocalization.map (Localization (obj G U)) (𝟙 (F.obj U))
            (_ : obj G U ≤ Submonoid.comap (𝟙 (F.obj U)) (obj G U))))
      x =
    ↑(𝟙 (CommRingCat.of (Localization (obj G U)))) x
[PROOFSTEP]
exact IsLocalization.map_id (M := G.obj U) (S := Localization (G.obj U)) x
[GOAL]
X : TopCat
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
F : Presheaf CommRingCat X
G : SubmonoidPresheaf F
U V W : (Opens ↑X)ᵒᵖ
i : U ⟶ V
j : V ⟶ W
⊢ { obj := fun U => CommRingCat.of (Localization (obj G U)),
          map := fun {U V} i =>
            CommRingCat.ofHom
              (IsLocalization.map (Localization (obj G V)) (F.map i)
                (_ : obj G U ≤ Submonoid.comap (F.map i) (obj G V))) }.map
      (i ≫ j) =
    { obj := fun U => CommRingCat.of (Localization (obj G U)),
            map := fun {U V} i =>
              CommRingCat.ofHom
                (IsLocalization.map (Localization (obj G V)) (F.map i)
                  (_ : obj G U ≤ Submonoid.comap (F.map i) (obj G V))) }.map
        i ≫
      { obj := fun U => CommRingCat.of (Localization (obj G U)),
            map := fun {U V} i =>
              CommRingCat.ofHom
                (IsLocalization.map (Localization (obj G V)) (F.map i)
                  (_ : obj G U ≤ Submonoid.comap (F.map i) (obj G V))) }.map
        j
[PROOFSTEP]
delta CommRingCat.ofHom CommRingCat.of Bundled.of
[GOAL]
X : TopCat
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
F : Presheaf CommRingCat X
G : SubmonoidPresheaf F
U V W : (Opens ↑X)ᵒᵖ
i : U ⟶ V
j : V ⟶ W
⊢ { obj := fun U => Bundled.mk (Localization (obj G U)),
          map := fun {U V} i =>
            IsLocalization.map (Localization (obj G V)) (F.map i)
              (_ : obj G U ≤ Submonoid.comap (F.map i) (obj G V)) }.map
      (i ≫ j) =
    { obj := fun U => Bundled.mk (Localization (obj G U)),
            map := fun {U V} i =>
              IsLocalization.map (Localization (obj G V)) (F.map i)
                (_ : obj G U ≤ Submonoid.comap (F.map i) (obj G V)) }.map
        i ≫
      { obj := fun U => Bundled.mk (Localization (obj G U)),
            map := fun {U V} i =>
              IsLocalization.map (Localization (obj G V)) (F.map i)
                (_ : obj G U ≤ Submonoid.comap (F.map i) (obj G V)) }.map
        j
[PROOFSTEP]
simp_rw [F.map_comp, CommRingCat.comp_eq_ring_hom_comp]
[GOAL]
X : TopCat
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
F : Presheaf CommRingCat X
G : SubmonoidPresheaf F
U V W : (Opens ↑X)ᵒᵖ
i : U ⟶ V
j : V ⟶ W
⊢ IsLocalization.map (Localization (obj G W)) (RingHom.comp (F.map j) (F.map i))
      (_ : obj G U ≤ Submonoid.comap (RingHom.comp (F.map j) (F.map i)) (obj G W)) =
    RingHom.comp
      (IsLocalization.map (Localization (obj G W)) (F.map j) (_ : obj G V ≤ Submonoid.comap (F.map j) (obj G W)))
      (IsLocalization.map (Localization (obj G V)) (F.map i) (_ : obj G U ≤ Submonoid.comap (F.map i) (obj G V)))
[PROOFSTEP]
rw [IsLocalization.map_comp_map]
[GOAL]
X : TopCat
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
F : Presheaf CommRingCat X
G : SubmonoidPresheaf F
S : (x : ↑X) → Submonoid ↑(stalk F x)
U V : (Opens ↑X)ᵒᵖ
i : U ⟶ V
⊢ (fun U => ⨅ (x : { x // x ∈ U.unop }), Submonoid.comap (germ F x) (S ↑x)) U ≤
    Submonoid.comap (F.map i) ((fun U => ⨅ (x : { x // x ∈ U.unop }), Submonoid.comap (germ F x) (S ↑x)) V)
[PROOFSTEP]
intro s hs
[GOAL]
X : TopCat
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
F : Presheaf CommRingCat X
G : SubmonoidPresheaf F
S : (x : ↑X) → Submonoid ↑(stalk F x)
U V : (Opens ↑X)ᵒᵖ
i : U ⟶ V
s : (forget CommRingCat).obj (F.obj U)
hs : s ∈ (fun U => ⨅ (x : { x // x ∈ U.unop }), Submonoid.comap (germ F x) (S ↑x)) U
⊢ s ∈ Submonoid.comap (F.map i) ((fun U => ⨅ (x : { x // x ∈ U.unop }), Submonoid.comap (germ F x) (S ↑x)) V)
[PROOFSTEP]
simp only [Submonoid.mem_comap, Submonoid.mem_iInf] at hs ⊢
[GOAL]
X : TopCat
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
F : Presheaf CommRingCat X
G : SubmonoidPresheaf F
S : (x : ↑X) → Submonoid ↑(stalk F x)
U V : (Opens ↑X)ᵒᵖ
i : U ⟶ V
s : (forget CommRingCat).obj (F.obj U)
hs : ∀ (i : { x // x ∈ U.unop }), ↑(germ F i) s ∈ S ↑i
⊢ ∀ (i_1 : { x // x ∈ V.unop }), ↑(germ F i_1) (↑(F.map i) s) ∈ S ↑i_1
[PROOFSTEP]
intro x
[GOAL]
X : TopCat
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
F : Presheaf CommRingCat X
G : SubmonoidPresheaf F
S : (x : ↑X) → Submonoid ↑(stalk F x)
U V : (Opens ↑X)ᵒᵖ
i : U ⟶ V
s : (forget CommRingCat).obj (F.obj U)
hs : ∀ (i : { x // x ∈ U.unop }), ↑(germ F i) s ∈ S ↑i
x : { x // x ∈ V.unop }
⊢ ↑(germ F x) (↑(F.map i) s) ∈ S ↑x
[PROOFSTEP]
change (F.map i.unop.op ≫ F.germ x) s ∈ _
[GOAL]
X : TopCat
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
F : Presheaf CommRingCat X
G : SubmonoidPresheaf F
S : (x : ↑X) → Submonoid ↑(stalk F x)
U V : (Opens ↑X)ᵒᵖ
i : U ⟶ V
s : (forget CommRingCat).obj (F.obj U)
hs : ∀ (i : { x // x ∈ U.unop }), ↑(germ F i) s ∈ S ↑i
x : { x // x ∈ V.unop }
⊢ ↑(F.map i.unop.op ≫ germ F x) s ∈ S ↑x
[PROOFSTEP]
rw [F.germ_res]
[GOAL]
X : TopCat
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
F : Presheaf CommRingCat X
G : SubmonoidPresheaf F
S : (x : ↑X) → Submonoid ↑(stalk F x)
U V : (Opens ↑X)ᵒᵖ
i : U ⟶ V
s : (forget CommRingCat).obj (F.obj U)
hs : ∀ (i : { x // x ∈ U.unop }), ↑(germ F i) s ∈ S ↑i
x : { x // x ∈ V.unop }
⊢ ↑(germ F ((fun x => { val := ↑x, property := (_ : ↑x ∈ ↑U.unop) }) x)) s ∈ S ↑x
[PROOFSTEP]
exact hs _
[GOAL]
X : TopCat
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
F✝ : Presheaf CommRingCat X
G : SubmonoidPresheaf F✝
F : Sheaf CommRingCat X
⊢ Mono (toTotalQuotientPresheaf (Sheaf.presheaf F))
[PROOFSTEP]
suffices : ∀ (U : (Opens ↑X)ᵒᵖ), Mono (F.presheaf.toTotalQuotientPresheaf.app U)
[GOAL]
X : TopCat
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
F✝ : Presheaf CommRingCat X
G : SubmonoidPresheaf F✝
F : Sheaf CommRingCat X
this : ∀ (U : (Opens ↑X)ᵒᵖ), Mono (NatTrans.app (toTotalQuotientPresheaf (Sheaf.presheaf F)) U)
⊢ Mono (toTotalQuotientPresheaf (Sheaf.presheaf F))
[PROOFSTEP]
apply NatTrans.mono_of_mono_app
[GOAL]
case this
X : TopCat
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
F✝ : Presheaf CommRingCat X
G : SubmonoidPresheaf F✝
F : Sheaf CommRingCat X
⊢ ∀ (U : (Opens ↑X)ᵒᵖ), Mono (NatTrans.app (toTotalQuotientPresheaf (Sheaf.presheaf F)) U)
[PROOFSTEP]
intro U
[GOAL]
case this
X : TopCat
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
F✝ : Presheaf CommRingCat X
G : SubmonoidPresheaf F✝
F : Sheaf CommRingCat X
U : (Opens ↑X)ᵒᵖ
⊢ Mono (NatTrans.app (toTotalQuotientPresheaf (Sheaf.presheaf F)) U)
[PROOFSTEP]
apply ConcreteCategory.mono_of_injective
[GOAL]
case this.i
X : TopCat
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
F✝ : Presheaf CommRingCat X
G : SubmonoidPresheaf F✝
F : Sheaf CommRingCat X
U : (Opens ↑X)ᵒᵖ
⊢ Function.Injective ↑(NatTrans.app (toTotalQuotientPresheaf (Sheaf.presheaf F)) U)
[PROOFSTEP]
dsimp [toTotalQuotientPresheaf, CommRingCat.ofHom]
  -- Porting note : this is a hack to make the `refine` below works
[GOAL]
case this.i
X : TopCat
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
F✝ : Presheaf CommRingCat X
G : SubmonoidPresheaf F✝
F : Sheaf CommRingCat X
U : (Opens ↑X)ᵒᵖ
⊢ Function.Injective
    ↑(algebraMap (↑((Sheaf.presheaf F).obj U))
        (Localization
          (⨅ (x : { x // x ∈ U.unop }), Submonoid.comap (germ (Sheaf.presheaf F) x) (↑(stalk (Sheaf.presheaf F) ↑x))⁰)))
[PROOFSTEP]
set m := _
[GOAL]
case this.i
X : TopCat
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
F✝ : Presheaf CommRingCat X
G : SubmonoidPresheaf F✝
F : Sheaf CommRingCat X
U : (Opens ↑X)ᵒᵖ
m : ?m.65485 := ?m.65486
⊢ Function.Injective
    ↑(algebraMap (↑((Sheaf.presheaf F).obj U))
        (Localization
          (⨅ (x : { x // x ∈ U.unop }), Submonoid.comap (germ (Sheaf.presheaf F) x) (↑(stalk (Sheaf.presheaf F) ↑x))⁰)))
[PROOFSTEP]
change Function.Injective (algebraMap _ (Localization m))
[GOAL]
case this.i
X : TopCat
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
F✝ : Presheaf CommRingCat X
G : SubmonoidPresheaf F✝
F : Sheaf CommRingCat X
U : (Opens ↑X)ᵒᵖ
m : Submonoid ((forget CommRingCat).obj ((Sheaf.presheaf F).obj U)) :=
  ⨅ (x : { x // x ∈ U.unop }), Submonoid.comap (germ (Sheaf.presheaf F) x) (↑(stalk (Sheaf.presheaf F) ↑x))⁰
⊢ Function.Injective ↑(algebraMap ((forget CommRingCat).obj ((Sheaf.presheaf F).obj U)) (Localization m))
[PROOFSTEP]
change Function.Injective (algebraMap (F.presheaf.obj U) _)
[GOAL]
case this.i
X : TopCat
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
F✝ : Presheaf CommRingCat X
G : SubmonoidPresheaf F✝
F : Sheaf CommRingCat X
U : (Opens ↑X)ᵒᵖ
m : Submonoid ((forget CommRingCat).obj ((Sheaf.presheaf F).obj U)) :=
  ⨅ (x : { x // x ∈ U.unop }), Submonoid.comap (germ (Sheaf.presheaf F) x) (↑(stalk (Sheaf.presheaf F) ↑x))⁰
⊢ Function.Injective ↑(algebraMap (↑((Sheaf.presheaf F).obj U)) (Localization m))
[PROOFSTEP]
haveI : IsLocalization _ (Localization m) := Localization.isLocalization
[GOAL]
case this.i
X : TopCat
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
F✝ : Presheaf CommRingCat X
G : SubmonoidPresheaf F✝
F : Sheaf CommRingCat X
U : (Opens ↑X)ᵒᵖ
m : Submonoid ((forget CommRingCat).obj ((Sheaf.presheaf F).obj U)) :=
  ⨅ (x : { x // x ∈ U.unop }), Submonoid.comap (germ (Sheaf.presheaf F) x) (↑(stalk (Sheaf.presheaf F) ↑x))⁰
this : IsLocalization m (Localization m)
⊢ Function.Injective ↑(algebraMap (↑((Sheaf.presheaf F).obj U)) (Localization m))
[PROOFSTEP]
refine IsLocalization.injective (M := m) (S := Localization m) ?_
[GOAL]
case this.i
X : TopCat
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
F✝ : Presheaf CommRingCat X
G : SubmonoidPresheaf F✝
F : Sheaf CommRingCat X
U : (Opens ↑X)ᵒᵖ
m : Submonoid ((forget CommRingCat).obj ((Sheaf.presheaf F).obj U)) :=
  ⨅ (x : { x // x ∈ U.unop }), Submonoid.comap (germ (Sheaf.presheaf F) x) (↑(stalk (Sheaf.presheaf F) ↑x))⁰
this : IsLocalization m (Localization m)
⊢ m ≤ ((forget CommRingCat).obj ((Sheaf.presheaf F).obj U))⁰
[PROOFSTEP]
intro s hs t e
[GOAL]
case this.i
X : TopCat
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
F✝ : Presheaf CommRingCat X
G : SubmonoidPresheaf F✝
F : Sheaf CommRingCat X
U : (Opens ↑X)ᵒᵖ
m : Submonoid ((forget CommRingCat).obj ((Sheaf.presheaf F).obj U)) :=
  ⨅ (x : { x // x ∈ U.unop }), Submonoid.comap (germ (Sheaf.presheaf F) x) (↑(stalk (Sheaf.presheaf F) ↑x))⁰
this : IsLocalization m (Localization m)
s : (forget CommRingCat).obj ((Sheaf.presheaf F).obj U)
hs : s ∈ m
t : (forget CommRingCat).obj ((Sheaf.presheaf F).obj U)
e : t * s = 0
⊢ t = 0
[PROOFSTEP]
apply section_ext F (unop U)
[GOAL]
case this.i.h
X : TopCat
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
F✝ : Presheaf CommRingCat X
G : SubmonoidPresheaf F✝
F : Sheaf CommRingCat X
U : (Opens ↑X)ᵒᵖ
m : Submonoid ((forget CommRingCat).obj ((Sheaf.presheaf F).obj U)) :=
  ⨅ (x : { x // x ∈ U.unop }), Submonoid.comap (germ (Sheaf.presheaf F) x) (↑(stalk (Sheaf.presheaf F) ↑x))⁰
this : IsLocalization m (Localization m)
s : (forget CommRingCat).obj ((Sheaf.presheaf F).obj U)
hs : s ∈ m
t : (forget CommRingCat).obj ((Sheaf.presheaf F).obj U)
e : t * s = 0
⊢ ∀ (x : { x // x ∈ U.unop }), ↑(germ (Sheaf.presheaf F) x) t = ↑(germ (Sheaf.presheaf F) x) 0
[PROOFSTEP]
intro x
[GOAL]
case this.i.h
X : TopCat
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
F✝ : Presheaf CommRingCat X
G : SubmonoidPresheaf F✝
F : Sheaf CommRingCat X
U : (Opens ↑X)ᵒᵖ
m : Submonoid ((forget CommRingCat).obj ((Sheaf.presheaf F).obj U)) :=
  ⨅ (x : { x // x ∈ U.unop }), Submonoid.comap (germ (Sheaf.presheaf F) x) (↑(stalk (Sheaf.presheaf F) ↑x))⁰
this : IsLocalization m (Localization m)
s : (forget CommRingCat).obj ((Sheaf.presheaf F).obj U)
hs : s ∈ m
t : (forget CommRingCat).obj ((Sheaf.presheaf F).obj U)
e : t * s = 0
x : { x // x ∈ U.unop }
⊢ ↑(germ (Sheaf.presheaf F) x) t = ↑(germ (Sheaf.presheaf F) x) 0
[PROOFSTEP]
rw [map_zero]
[GOAL]
case this.i.h
X : TopCat
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
F✝ : Presheaf CommRingCat X
G : SubmonoidPresheaf F✝
F : Sheaf CommRingCat X
U : (Opens ↑X)ᵒᵖ
m : Submonoid ((forget CommRingCat).obj ((Sheaf.presheaf F).obj U)) :=
  ⨅ (x : { x // x ∈ U.unop }), Submonoid.comap (germ (Sheaf.presheaf F) x) (↑(stalk (Sheaf.presheaf F) ↑x))⁰
this : IsLocalization m (Localization m)
s : (forget CommRingCat).obj ((Sheaf.presheaf F).obj U)
hs : s ∈ m
t : (forget CommRingCat).obj ((Sheaf.presheaf F).obj U)
e : t * s = 0
x : { x // x ∈ U.unop }
⊢ ↑(germ (Sheaf.presheaf F) x) t = 0
[PROOFSTEP]
apply Submonoid.mem_iInf.mp hs x
[GOAL]
case this.i.h.a
X : TopCat
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
F✝ : Presheaf CommRingCat X
G : SubmonoidPresheaf F✝
F : Sheaf CommRingCat X
U : (Opens ↑X)ᵒᵖ
m : Submonoid ((forget CommRingCat).obj ((Sheaf.presheaf F).obj U)) :=
  ⨅ (x : { x // x ∈ U.unop }), Submonoid.comap (germ (Sheaf.presheaf F) x) (↑(stalk (Sheaf.presheaf F) ↑x))⁰
this : IsLocalization m (Localization m)
s : (forget CommRingCat).obj ((Sheaf.presheaf F).obj U)
hs : s ∈ m
t : (forget CommRingCat).obj ((Sheaf.presheaf F).obj U)
e : t * s = 0
x : { x // x ∈ U.unop }
⊢ ↑(germ (Sheaf.presheaf F) x) t * ↑(germ (Sheaf.presheaf F) x) s = 0
[PROOFSTEP]
dsimp
[GOAL]
case this.i.h.a
X : TopCat
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
F✝ : Presheaf CommRingCat X
G : SubmonoidPresheaf F✝
F : Sheaf CommRingCat X
U : (Opens ↑X)ᵒᵖ
m : Submonoid ((forget CommRingCat).obj ((Sheaf.presheaf F).obj U)) :=
  ⨅ (x : { x // x ∈ U.unop }), Submonoid.comap (germ (Sheaf.presheaf F) x) (↑(stalk (Sheaf.presheaf F) ↑x))⁰
this : IsLocalization m (Localization m)
s : (forget CommRingCat).obj ((Sheaf.presheaf F).obj U)
hs : s ∈ m
t : (forget CommRingCat).obj ((Sheaf.presheaf F).obj U)
e : t * s = 0
x : { x // x ∈ U.unop }
⊢ ↑(germ (Sheaf.presheaf F) x) t * ↑(germ (Sheaf.presheaf F) x) s = 0
[PROOFSTEP]
rw [← map_mul, e, map_zero]