[GOAL]
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
m : M
n : N
p : Submodule R M
q : Submodule R N
hm : m ∈ p
hn : n ∈ q
⊢ ↑(↑f ↑{ val := m, property := hm }) n = ↑(↑f m) n
[PROOFSTEP]
rfl
[GOAL]
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
⊢ map₂ f (span R s) (span R t) = span R (image2 (fun m n => ↑(↑f m) n) s t)
[PROOFSTEP]
apply le_antisymm
[GOAL]
case a
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
⊢ map₂ f (span R s) (span R t) ≤ span R (image2 (fun m n => ↑(↑f m) n) s t)
[PROOFSTEP]
rw [map₂_le]
[GOAL]
case a
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
⊢ ∀ (m : M), m ∈ span R s → ∀ (n : N), n ∈ span R t → ↑(↑f m) n ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
[PROOFSTEP]
apply @span_induction' R M _ _ _ s
[GOAL]
case a.Hs
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
⊢ ∀ (x : M), x ∈ s → ∀ (n : N), n ∈ span R t → ↑(↑f x) n ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
case a.H0
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
⊢ ∀ (n : N), n ∈ span R t → ↑(↑f 0) n ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
case a.H1
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
⊢ ∀ (x : M),
    x ∈ span R s →
      ∀ (y : M),
        y ∈ span R s →
          (∀ (n : N), n ∈ span R t → ↑(↑f x) n ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)) →
            (∀ (n : N), n ∈ span R t → ↑(↑f y) n ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)) →
              ∀ (n : N), n ∈ span R t → ↑(↑f (x + y)) n ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
case a.H2
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
⊢ ∀ (a : R) (x : M),
    x ∈ span R s →
      (∀ (n : N), n ∈ span R t → ↑(↑f x) n ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)) →
        ∀ (n : N), n ∈ span R t → ↑(↑f (a • x)) n ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
[PROOFSTEP]
intro a ha
[GOAL]
case a.Hs
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
a : M
ha : a ∈ s
⊢ ∀ (n : N), n ∈ span R t → ↑(↑f a) n ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
case a.H0
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
⊢ ∀ (n : N), n ∈ span R t → ↑(↑f 0) n ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
case a.H1
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
⊢ ∀ (x : M),
    x ∈ span R s →
      ∀ (y : M),
        y ∈ span R s →
          (∀ (n : N), n ∈ span R t → ↑(↑f x) n ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)) →
            (∀ (n : N), n ∈ span R t → ↑(↑f y) n ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)) →
              ∀ (n : N), n ∈ span R t → ↑(↑f (x + y)) n ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
case a.H2
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
⊢ ∀ (a : R) (x : M),
    x ∈ span R s →
      (∀ (n : N), n ∈ span R t → ↑(↑f x) n ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)) →
        ∀ (n : N), n ∈ span R t → ↑(↑f (a • x)) n ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
[PROOFSTEP]
apply @span_induction' R N _ _ _ t
[GOAL]
case a.Hs.Hs
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
a : M
ha : a ∈ s
⊢ ∀ (x : N), x ∈ t → ↑(↑f a) x ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
case a.Hs.H0
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
a : M
ha : a ∈ s
⊢ ↑(↑f a) 0 ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
case a.Hs.H1
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
a : M
ha : a ∈ s
⊢ ∀ (x : N),
    x ∈ span R t →
      ∀ (y : N),
        y ∈ span R t →
          ↑(↑f a) x ∈ span R (image2 (fun m n => ↑(↑f m) n) s t) →
            ↑(↑f a) y ∈ span R (image2 (fun m n => ↑(↑f m) n) s t) →
              ↑(↑f a) (x + y) ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
case a.Hs.H2
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
a : M
ha : a ∈ s
⊢ ∀ (a_1 : R) (x : N),
    x ∈ span R t →
      ↑(↑f a) x ∈ span R (image2 (fun m n => ↑(↑f m) n) s t) →
        ↑(↑f a) (a_1 • x) ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
case a.H0
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
⊢ ∀ (n : N), n ∈ span R t → ↑(↑f 0) n ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
case a.H1
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
⊢ ∀ (x : M),
    x ∈ span R s →
      ∀ (y : M),
        y ∈ span R s →
          (∀ (n : N), n ∈ span R t → ↑(↑f x) n ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)) →
            (∀ (n : N), n ∈ span R t → ↑(↑f y) n ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)) →
              ∀ (n : N), n ∈ span R t → ↑(↑f (x + y)) n ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
case a.H2
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
⊢ ∀ (a : R) (x : M),
    x ∈ span R s →
      (∀ (n : N), n ∈ span R t → ↑(↑f x) n ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)) →
        ∀ (n : N), n ∈ span R t → ↑(↑f (a • x)) n ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
[PROOFSTEP]
intro b hb
[GOAL]
case a.Hs.Hs
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
a : M
ha : a ∈ s
b : N
hb : b ∈ t
⊢ ↑(↑f a) b ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
case a.Hs.H0
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
a : M
ha : a ∈ s
⊢ ↑(↑f a) 0 ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
case a.Hs.H1
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
a : M
ha : a ∈ s
⊢ ∀ (x : N),
    x ∈ span R t →
      ∀ (y : N),
        y ∈ span R t →
          ↑(↑f a) x ∈ span R (image2 (fun m n => ↑(↑f m) n) s t) →
            ↑(↑f a) y ∈ span R (image2 (fun m n => ↑(↑f m) n) s t) →
              ↑(↑f a) (x + y) ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
case a.Hs.H2
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
a : M
ha : a ∈ s
⊢ ∀ (a_1 : R) (x : N),
    x ∈ span R t →
      ↑(↑f a) x ∈ span R (image2 (fun m n => ↑(↑f m) n) s t) →
        ↑(↑f a) (a_1 • x) ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
case a.H0
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
⊢ ∀ (n : N), n ∈ span R t → ↑(↑f 0) n ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
case a.H1
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
⊢ ∀ (x : M),
    x ∈ span R s →
      ∀ (y : M),
        y ∈ span R s →
          (∀ (n : N), n ∈ span R t → ↑(↑f x) n ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)) →
            (∀ (n : N), n ∈ span R t → ↑(↑f y) n ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)) →
              ∀ (n : N), n ∈ span R t → ↑(↑f (x + y)) n ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
case a.H2
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
⊢ ∀ (a : R) (x : M),
    x ∈ span R s →
      (∀ (n : N), n ∈ span R t → ↑(↑f x) n ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)) →
        ∀ (n : N), n ∈ span R t → ↑(↑f (a • x)) n ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
[PROOFSTEP]
exact subset_span ⟨_, _, ‹_›, ‹_›, rfl⟩
[GOAL]
case a.Hs.H0
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
a : M
ha : a ∈ s
⊢ ↑(↑f a) 0 ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
case a.Hs.H1
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
a : M
ha : a ∈ s
⊢ ∀ (x : N),
    x ∈ span R t →
      ∀ (y : N),
        y ∈ span R t →
          ↑(↑f a) x ∈ span R (image2 (fun m n => ↑(↑f m) n) s t) →
            ↑(↑f a) y ∈ span R (image2 (fun m n => ↑(↑f m) n) s t) →
              ↑(↑f a) (x + y) ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
case a.Hs.H2
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
a : M
ha : a ∈ s
⊢ ∀ (a_1 : R) (x : N),
    x ∈ span R t →
      ↑(↑f a) x ∈ span R (image2 (fun m n => ↑(↑f m) n) s t) →
        ↑(↑f a) (a_1 • x) ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
case a.H0
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
⊢ ∀ (n : N), n ∈ span R t → ↑(↑f 0) n ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
case a.H1
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
⊢ ∀ (x : M),
    x ∈ span R s →
      ∀ (y : M),
        y ∈ span R s →
          (∀ (n : N), n ∈ span R t → ↑(↑f x) n ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)) →
            (∀ (n : N), n ∈ span R t → ↑(↑f y) n ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)) →
              ∀ (n : N), n ∈ span R t → ↑(↑f (x + y)) n ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
case a.H2
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
⊢ ∀ (a : R) (x : M),
    x ∈ span R s →
      (∀ (n : N), n ∈ span R t → ↑(↑f x) n ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)) →
        ∀ (n : N), n ∈ span R t → ↑(↑f (a • x)) n ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
[PROOFSTEP]
all_goals intros;
  simp only [*, add_mem, smul_mem, zero_mem, _root_.map_zero, map_add, LinearMap.zero_apply, LinearMap.add_apply,
    LinearMap.smul_apply, SMulHomClass.map_smul]
[GOAL]
case a.Hs.H0
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
a : M
ha : a ∈ s
⊢ ↑(↑f a) 0 ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
[PROOFSTEP]
intros
[GOAL]
case a.Hs.H0
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
a : M
ha : a ∈ s
⊢ ↑(↑f a) 0 ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
[PROOFSTEP]
simp only [*, add_mem, smul_mem, zero_mem, _root_.map_zero, map_add, LinearMap.zero_apply, LinearMap.add_apply,
  LinearMap.smul_apply, SMulHomClass.map_smul]
[GOAL]
case a.Hs.H1
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
a : M
ha : a ∈ s
⊢ ∀ (x : N),
    x ∈ span R t →
      ∀ (y : N),
        y ∈ span R t →
          ↑(↑f a) x ∈ span R (image2 (fun m n => ↑(↑f m) n) s t) →
            ↑(↑f a) y ∈ span R (image2 (fun m n => ↑(↑f m) n) s t) →
              ↑(↑f a) (x + y) ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
[PROOFSTEP]
intros
[GOAL]
case a.Hs.H1
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
a : M
ha : a ∈ s
x✝ : N
hx✝ : x✝ ∈ span R t
y✝ : N
hy✝ : y✝ ∈ span R t
a✝¹ : ↑(↑f a) x✝ ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
a✝ : ↑(↑f a) y✝ ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
⊢ ↑(↑f a) (x✝ + y✝) ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
[PROOFSTEP]
simp only [*, add_mem, smul_mem, zero_mem, _root_.map_zero, map_add, LinearMap.zero_apply, LinearMap.add_apply,
  LinearMap.smul_apply, SMulHomClass.map_smul]
[GOAL]
case a.Hs.H2
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
a : M
ha : a ∈ s
⊢ ∀ (a_1 : R) (x : N),
    x ∈ span R t →
      ↑(↑f a) x ∈ span R (image2 (fun m n => ↑(↑f m) n) s t) →
        ↑(↑f a) (a_1 • x) ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
[PROOFSTEP]
intros
[GOAL]
case a.Hs.H2
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
a : M
ha : a ∈ s
a✝¹ : R
x✝ : N
hx✝ : x✝ ∈ span R t
a✝ : ↑(↑f a) x✝ ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
⊢ ↑(↑f a) (a✝¹ • x✝) ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
[PROOFSTEP]
simp only [*, add_mem, smul_mem, zero_mem, _root_.map_zero, map_add, LinearMap.zero_apply, LinearMap.add_apply,
  LinearMap.smul_apply, SMulHomClass.map_smul]
[GOAL]
case a.H0
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
⊢ ∀ (n : N), n ∈ span R t → ↑(↑f 0) n ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
[PROOFSTEP]
intros
[GOAL]
case a.H0
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
n✝ : N
a✝ : n✝ ∈ span R t
⊢ ↑(↑f 0) n✝ ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
[PROOFSTEP]
simp only [*, add_mem, smul_mem, zero_mem, _root_.map_zero, map_add, LinearMap.zero_apply, LinearMap.add_apply,
  LinearMap.smul_apply, SMulHomClass.map_smul]
[GOAL]
case a.H1
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
⊢ ∀ (x : M),
    x ∈ span R s →
      ∀ (y : M),
        y ∈ span R s →
          (∀ (n : N), n ∈ span R t → ↑(↑f x) n ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)) →
            (∀ (n : N), n ∈ span R t → ↑(↑f y) n ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)) →
              ∀ (n : N), n ∈ span R t → ↑(↑f (x + y)) n ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
[PROOFSTEP]
intros
[GOAL]
case a.H1
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
x✝ : M
hx✝ : x✝ ∈ span R s
y✝ : M
hy✝ : y✝ ∈ span R s
a✝² : ∀ (n : N), n ∈ span R t → ↑(↑f x✝) n ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
a✝¹ : ∀ (n : N), n ∈ span R t → ↑(↑f y✝) n ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
n✝ : N
a✝ : n✝ ∈ span R t
⊢ ↑(↑f (x✝ + y✝)) n✝ ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
[PROOFSTEP]
simp only [*, add_mem, smul_mem, zero_mem, _root_.map_zero, map_add, LinearMap.zero_apply, LinearMap.add_apply,
  LinearMap.smul_apply, SMulHomClass.map_smul]
[GOAL]
case a.H2
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
⊢ ∀ (a : R) (x : M),
    x ∈ span R s →
      (∀ (n : N), n ∈ span R t → ↑(↑f x) n ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)) →
        ∀ (n : N), n ∈ span R t → ↑(↑f (a • x)) n ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
[PROOFSTEP]
intros
[GOAL]
case a.H2
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
a✝² : R
x✝ : M
hx✝ : x✝ ∈ span R s
a✝¹ : ∀ (n : N), n ∈ span R t → ↑(↑f x✝) n ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
n✝ : N
a✝ : n✝ ∈ span R t
⊢ ↑(↑f (a✝² • x✝)) n✝ ∈ span R (image2 (fun m n => ↑(↑f m) n) s t)
[PROOFSTEP]
simp only [*, add_mem, smul_mem, zero_mem, _root_.map_zero, map_add, LinearMap.zero_apply, LinearMap.add_apply,
  LinearMap.smul_apply, SMulHomClass.map_smul]
[GOAL]
case a
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
⊢ span R (image2 (fun m n => ↑(↑f m) n) s t) ≤ map₂ f (span R s) (span R t)
[PROOFSTEP]
rw [span_le]
[GOAL]
case a
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
⊢ image2 (fun m n => ↑(↑f m) n) s t ⊆ ↑(map₂ f (span R s) (span R t))
[PROOFSTEP]
rintro _ ⟨a, b, ha, hb, rfl⟩
[GOAL]
case a.intro.intro.intro.intro
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Set M
t : Set N
a : M
b : N
ha : a ∈ s
hb : b ∈ t
⊢ (fun m n => ↑(↑f m) n) a b ∈ ↑(map₂ f (span R s) (span R t))
[PROOFSTEP]
exact apply_mem_map₂ _ (subset_span ha) (subset_span hb)
[GOAL]
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
p : Submodule R M
m : M
_hm : m ∈ p
n : N
hn : n ∈ ⊥
⊢ ↑(↑f m) n ∈ ⊥
[PROOFSTEP]
rw [Submodule.mem_bot] at hn
[GOAL]
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
p : Submodule R M
m : M
_hm : m ∈ p
n : N
hn : n = 0
⊢ ↑(↑f m) n ∈ ⊥
[PROOFSTEP]
rw [hn, LinearMap.map_zero]
[GOAL]
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
p : Submodule R M
m : M
_hm : m ∈ p
n : N
hn : n = 0
⊢ 0 ∈ ⊥
[PROOFSTEP]
simp only [mem_bot]
[GOAL]
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
q : Submodule R N
m : M
hm : m ∈ ⊥
n : N
hn : n ∈ q
⊢ ↑(↑f m) n ∈ ⊥
[PROOFSTEP]
rw [Submodule.mem_bot] at hm ⊢
[GOAL]
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
q : Submodule R N
m : M
hm : m = 0
n : N
hn : n ∈ q
⊢ ↑(↑f m) n = 0
[PROOFSTEP]
rw [hm, LinearMap.map_zero₂]
[GOAL]
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
p : Submodule R M
q : Submodule R N
⊢ image2 (fun m n => ↑(↑f m) n) ↑p ↑q ⊆ ↑(map₂ f p q)
[PROOFSTEP]
rintro _ ⟨i, j, hi, hj, rfl⟩
[GOAL]
case intro.intro.intro.intro
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
p : Submodule R M
q : Submodule R N
i : M
j : N
hi : i ∈ ↑p
hj : j ∈ ↑q
⊢ (fun m n => ↑(↑f m) n) i j ∈ ↑(map₂ f p q)
[PROOFSTEP]
exact apply_mem_map₂ _ hi hj
[GOAL]
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
p : Submodule R M
q : Submodule R N
⊢ map₂ f p q = span R (image2 (fun m n => ↑(↑f m) n) ↑p ↑q)
[PROOFSTEP]
rw [← map₂_span_span, span_eq, span_eq]
[GOAL]
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
p : Submodule R M
q : Submodule R N
⊢ map₂ (LinearMap.flip f) q p = map₂ f p q
[PROOFSTEP]
rw [map₂_eq_span_image2, map₂_eq_span_image2, Set.image2_swap]
[GOAL]
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
p : Submodule R M
q : Submodule R N
⊢ span R (image2 (fun a b => ↑(↑(LinearMap.flip f) b) a) ↑p ↑q) = span R (image2 (fun m n => ↑(↑f m) n) ↑p ↑q)
[PROOFSTEP]
rfl
[GOAL]
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : ι → Submodule R M
t : Submodule R N
⊢ map₂ f (⨆ (i : ι), s i) t = ⨆ (i : ι), map₂ f (s i) t
[PROOFSTEP]
suffices map₂ f (⨆ i, span R (s i : Set M)) (span R t) = ⨆ i, map₂ f (span R (s i)) (span R t) by
  simpa only [span_eq] using this
[GOAL]
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : ι → Submodule R M
t : Submodule R N
this : map₂ f (⨆ (i : ι), span R ↑(s i)) (span R ↑t) = ⨆ (i : ι), map₂ f (span R ↑(s i)) (span R ↑t)
⊢ map₂ f (⨆ (i : ι), s i) t = ⨆ (i : ι), map₂ f (s i) t
[PROOFSTEP]
simpa only [span_eq] using this
[GOAL]
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : ι → Submodule R M
t : Submodule R N
⊢ map₂ f (⨆ (i : ι), span R ↑(s i)) (span R ↑t) = ⨆ (i : ι), map₂ f (span R ↑(s i)) (span R ↑t)
[PROOFSTEP]
simp_rw [map₂_span_span, ← span_iUnion, map₂_span_span, Set.image2_iUnion_left]
[GOAL]
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Submodule R M
t : ι → Submodule R N
⊢ map₂ f s (⨆ (i : ι), t i) = ⨆ (i : ι), map₂ f s (t i)
[PROOFSTEP]
suffices map₂ f (span R s) (⨆ i, span R (t i : Set N)) = ⨆ i, map₂ f (span R s) (span R (t i)) by
  simpa only [span_eq] using this
[GOAL]
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Submodule R M
t : ι → Submodule R N
this : map₂ f (span R ↑s) (⨆ (i : ι), span R ↑(t i)) = ⨆ (i : ι), map₂ f (span R ↑s) (span R ↑(t i))
⊢ map₂ f s (⨆ (i : ι), t i) = ⨆ (i : ι), map₂ f s (t i)
[PROOFSTEP]
simpa only [span_eq] using this
[GOAL]
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Submodule R M
t : ι → Submodule R N
⊢ map₂ f (span R ↑s) (⨆ (i : ι), span R ↑(t i)) = ⨆ (i : ι), map₂ f (span R ↑s) (span R ↑(t i))
[PROOFSTEP]
simp_rw [map₂_span_span, ← span_iUnion, map₂_span_span, Set.image2_iUnion_right]
[GOAL]
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
m : M
⊢ map₂ f (span R {m}) = map (↑f m)
[PROOFSTEP]
funext
[GOAL]
case h
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
m : M
x✝ : Submodule R N
⊢ map₂ f (span R {m}) x✝ = map (↑f m) x✝
[PROOFSTEP]
rw [map₂_eq_span_image2]
[GOAL]
case h
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
m : M
x✝ : Submodule R N
⊢ span R (image2 (fun m n => ↑(↑f m) n) ↑(span R {m}) ↑x✝) = map (↑f m) x✝
[PROOFSTEP]
apply le_antisymm
[GOAL]
case h.a
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
m : M
x✝ : Submodule R N
⊢ span R (image2 (fun m n => ↑(↑f m) n) ↑(span R {m}) ↑x✝) ≤ map (↑f m) x✝
[PROOFSTEP]
rw [span_le, Set.image2_subset_iff]
[GOAL]
case h.a
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
m : M
x✝ : Submodule R N
⊢ ∀ (x : M), x ∈ ↑(span R {m}) → ∀ (y : N), y ∈ ↑x✝ → ↑(↑f x) y ∈ ↑(map (↑f m) x✝)
[PROOFSTEP]
intro x hx y hy
[GOAL]
case h.a
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
m : M
x✝ : Submodule R N
x : M
hx : x ∈ ↑(span R {m})
y : N
hy : y ∈ ↑x✝
⊢ ↑(↑f x) y ∈ ↑(map (↑f m) x✝)
[PROOFSTEP]
obtain ⟨a, rfl⟩ := mem_span_singleton.1 hx
[GOAL]
case h.a.intro
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
m : M
x✝ : Submodule R N
y : N
hy : y ∈ ↑x✝
a : R
hx : a • m ∈ ↑(span R {m})
⊢ ↑(↑f (a • m)) y ∈ ↑(map (↑f m) x✝)
[PROOFSTEP]
rw [f.map_smul]
[GOAL]
case h.a.intro
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
m : M
x✝ : Submodule R N
y : N
hy : y ∈ ↑x✝
a : R
hx : a • m ∈ ↑(span R {m})
⊢ ↑(a • ↑f m) y ∈ ↑(map (↑f m) x✝)
[PROOFSTEP]
exact smul_mem _ a (mem_map_of_mem hy)
[GOAL]
case h.a
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
m : M
x✝ : Submodule R N
⊢ map (↑f m) x✝ ≤ span R (image2 (fun m n => ↑(↑f m) n) ↑(span R {m}) ↑x✝)
[PROOFSTEP]
rintro _ ⟨n, hn, rfl⟩
[GOAL]
case h.a.intro.intro
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
m : M
x✝ : Submodule R N
n : N
hn : n ∈ ↑x✝
⊢ ↑(↑f m) n ∈ span R (image2 (fun m n => ↑(↑f m) n) ↑(span R {m}) ↑x✝)
[PROOFSTEP]
exact subset_span ⟨m, n, mem_span_singleton_self m, hn, rfl⟩
[GOAL]
ι : Sort uι
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid N
inst✝³ : AddCommMonoid P
inst✝² : Module R M
inst✝¹ : Module R N
inst✝ : Module R P
f : M →ₗ[R] N →ₗ[R] P
s : Submodule R M
n : N
⊢ map₂ f s (span R {n}) = map (↑(LinearMap.flip f) n) s
[PROOFSTEP]
rw [← map₂_span_singleton_eq_map, map₂_flip]


[GOAL]
X : Type u_1
Y : Type u_2
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
f : LocallyConstant X Y
inst✝¹ : Monoid Y
inst✝ : ContinuousMul Y
⊢ ↑1 = 1
[PROOFSTEP]
ext
[GOAL]
case h
X : Type u_1
Y : Type u_2
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
f : LocallyConstant X Y
inst✝¹ : Monoid Y
inst✝ : ContinuousMul Y
a✝ : X
⊢ ↑↑1 a✝ = ↑1 a✝
[PROOFSTEP]
simp
[GOAL]
X : Type u_1
Y : Type u_2
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
f : LocallyConstant X Y
inst✝¹ : Monoid Y
inst✝ : ContinuousMul Y
x y : LocallyConstant X Y
⊢ OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } (x * y) =
    OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } x *
      OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } y
[PROOFSTEP]
ext
[GOAL]
case h
X : Type u_1
Y : Type u_2
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
f : LocallyConstant X Y
inst✝¹ : Monoid Y
inst✝ : ContinuousMul Y
x y : LocallyConstant X Y
a✝ : X
⊢ ↑(OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } (x * y)) a✝ =
    ↑(OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } x *
          OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } y)
      a✝
[PROOFSTEP]
simp
[GOAL]
X : Type u_1
Y : Type u_2
inst✝⁶ : TopologicalSpace X
inst✝⁵ : TopologicalSpace Y
f : LocallyConstant X Y
R : Type u_3
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid Y
inst✝² : Module R Y
inst✝¹ : ContinuousAdd Y
inst✝ : ContinuousConstSMul R Y
x y : LocallyConstant X Y
⊢ ↑(x + y) = ↑x + ↑y
[PROOFSTEP]
ext
[GOAL]
case h
X : Type u_1
Y : Type u_2
inst✝⁶ : TopologicalSpace X
inst✝⁵ : TopologicalSpace Y
f : LocallyConstant X Y
R : Type u_3
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid Y
inst✝² : Module R Y
inst✝¹ : ContinuousAdd Y
inst✝ : ContinuousConstSMul R Y
x y : LocallyConstant X Y
a✝ : X
⊢ ↑↑(x + y) a✝ = ↑(↑x + ↑y) a✝
[PROOFSTEP]
simp
[GOAL]
X : Type u_1
Y : Type u_2
inst✝⁶ : TopologicalSpace X
inst✝⁵ : TopologicalSpace Y
f : LocallyConstant X Y
R : Type u_3
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid Y
inst✝² : Module R Y
inst✝¹ : ContinuousAdd Y
inst✝ : ContinuousConstSMul R Y
x : R
y : LocallyConstant X Y
⊢ AddHom.toFun { toFun := toContinuousMap, map_add' := (_ : ∀ (x y : LocallyConstant X Y), ↑(x + y) = ↑x + ↑y) }
      (x • y) =
    ↑(RingHom.id R) x •
      AddHom.toFun { toFun := toContinuousMap, map_add' := (_ : ∀ (x y : LocallyConstant X Y), ↑(x + y) = ↑x + ↑y) } y
[PROOFSTEP]
ext
[GOAL]
case h
X : Type u_1
Y : Type u_2
inst✝⁶ : TopologicalSpace X
inst✝⁵ : TopologicalSpace Y
f : LocallyConstant X Y
R : Type u_3
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid Y
inst✝² : Module R Y
inst✝¹ : ContinuousAdd Y
inst✝ : ContinuousConstSMul R Y
x : R
y : LocallyConstant X Y
a✝ : X
⊢ ↑(AddHom.toFun { toFun := toContinuousMap, map_add' := (_ : ∀ (x y : LocallyConstant X Y), ↑(x + y) = ↑x + ↑y) }
          (x • y))
      a✝ =
    ↑(↑(RingHom.id R) x •
          AddHom.toFun { toFun := toContinuousMap, map_add' := (_ : ∀ (x y : LocallyConstant X Y), ↑(x + y) = ↑x + ↑y) }
            y)
      a✝
[PROOFSTEP]
simp
[GOAL]
X : Type u_1
Y : Type u_2
inst✝⁵ : TopologicalSpace X
inst✝⁴ : TopologicalSpace Y
f : LocallyConstant X Y
R : Type u_3
inst✝³ : CommSemiring R
inst✝² : Semiring Y
inst✝¹ : Algebra R Y
inst✝ : TopologicalSemiring Y
⊢ ↑1 = 1
[PROOFSTEP]
ext
[GOAL]
case h
X : Type u_1
Y : Type u_2
inst✝⁵ : TopologicalSpace X
inst✝⁴ : TopologicalSpace Y
f : LocallyConstant X Y
R : Type u_3
inst✝³ : CommSemiring R
inst✝² : Semiring Y
inst✝¹ : Algebra R Y
inst✝ : TopologicalSemiring Y
a✝ : X
⊢ ↑↑1 a✝ = ↑1 a✝
[PROOFSTEP]
simp
[GOAL]
X : Type u_1
Y : Type u_2
inst✝⁵ : TopologicalSpace X
inst✝⁴ : TopologicalSpace Y
f : LocallyConstant X Y
R : Type u_3
inst✝³ : CommSemiring R
inst✝² : Semiring Y
inst✝¹ : Algebra R Y
inst✝ : TopologicalSemiring Y
x y : LocallyConstant X Y
⊢ OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } (x * y) =
    OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } x *
      OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } y
[PROOFSTEP]
ext
[GOAL]
case h
X : Type u_1
Y : Type u_2
inst✝⁵ : TopologicalSpace X
inst✝⁴ : TopologicalSpace Y
f : LocallyConstant X Y
R : Type u_3
inst✝³ : CommSemiring R
inst✝² : Semiring Y
inst✝¹ : Algebra R Y
inst✝ : TopologicalSemiring Y
x y : LocallyConstant X Y
a✝ : X
⊢ ↑(OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } (x * y)) a✝ =
    ↑(OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } x *
          OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } y)
      a✝
[PROOFSTEP]
simp
[GOAL]
X : Type u_1
Y : Type u_2
inst✝⁵ : TopologicalSpace X
inst✝⁴ : TopologicalSpace Y
f : LocallyConstant X Y
R : Type u_3
inst✝³ : CommSemiring R
inst✝² : Semiring Y
inst✝¹ : Algebra R Y
inst✝ : TopologicalSemiring Y
⊢ OneHom.toFun
      (↑{ toOneHom := { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) },
          map_mul' :=
            (_ :
              ∀ (x y : LocallyConstant X Y),
                OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } (x * y) =
                  OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } x *
                    OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } y) })
      0 =
    0
[PROOFSTEP]
ext
[GOAL]
case h
X : Type u_1
Y : Type u_2
inst✝⁵ : TopologicalSpace X
inst✝⁴ : TopologicalSpace Y
f : LocallyConstant X Y
R : Type u_3
inst✝³ : CommSemiring R
inst✝² : Semiring Y
inst✝¹ : Algebra R Y
inst✝ : TopologicalSemiring Y
a✝ : X
⊢ ↑(OneHom.toFun
          (↑{ toOneHom := { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) },
              map_mul' :=
                (_ :
                  ∀ (x y : LocallyConstant X Y),
                    OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } (x * y) =
                      OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } x *
                        OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } y) })
          0)
      a✝ =
    ↑0 a✝
[PROOFSTEP]
simp
[GOAL]
X : Type u_1
Y : Type u_2
inst✝⁵ : TopologicalSpace X
inst✝⁴ : TopologicalSpace Y
f : LocallyConstant X Y
R : Type u_3
inst✝³ : CommSemiring R
inst✝² : Semiring Y
inst✝¹ : Algebra R Y
inst✝ : TopologicalSemiring Y
x y : LocallyConstant X Y
⊢ OneHom.toFun
      (↑{ toOneHom := { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) },
          map_mul' :=
            (_ :
              ∀ (x y : LocallyConstant X Y),
                OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } (x * y) =
                  OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } x *
                    OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } y) })
      (x + y) =
    OneHom.toFun
        (↑{ toOneHom := { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) },
            map_mul' :=
              (_ :
                ∀ (x y : LocallyConstant X Y),
                  OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } (x * y) =
                    OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } x *
                      OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } y) })
        x +
      OneHom.toFun
        (↑{ toOneHom := { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) },
            map_mul' :=
              (_ :
                ∀ (x y : LocallyConstant X Y),
                  OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } (x * y) =
                    OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } x *
                      OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } y) })
        y
[PROOFSTEP]
ext
[GOAL]
case h
X : Type u_1
Y : Type u_2
inst✝⁵ : TopologicalSpace X
inst✝⁴ : TopologicalSpace Y
f : LocallyConstant X Y
R : Type u_3
inst✝³ : CommSemiring R
inst✝² : Semiring Y
inst✝¹ : Algebra R Y
inst✝ : TopologicalSemiring Y
x y : LocallyConstant X Y
a✝ : X
⊢ ↑(OneHom.toFun
          (↑{ toOneHom := { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) },
              map_mul' :=
                (_ :
                  ∀ (x y : LocallyConstant X Y),
                    OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } (x * y) =
                      OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } x *
                        OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } y) })
          (x + y))
      a✝ =
    ↑(OneHom.toFun
            (↑{ toOneHom := { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) },
                map_mul' :=
                  (_ :
                    ∀ (x y : LocallyConstant X Y),
                      OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } (x * y) =
                        OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } x *
                          OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } y) })
            x +
          OneHom.toFun
            (↑{ toOneHom := { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) },
                map_mul' :=
                  (_ :
                    ∀ (x y : LocallyConstant X Y),
                      OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } (x * y) =
                        OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } x *
                          OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } y) })
            y)
      a✝
[PROOFSTEP]
simp
[GOAL]
X : Type u_1
Y : Type u_2
inst✝⁵ : TopologicalSpace X
inst✝⁴ : TopologicalSpace Y
f : LocallyConstant X Y
R : Type u_3
inst✝³ : CommSemiring R
inst✝² : Semiring Y
inst✝¹ : Algebra R Y
inst✝ : TopologicalSemiring Y
r : R
⊢ OneHom.toFun
      (↑↑{
            toMonoidHom :=
              { toOneHom := { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) },
                map_mul' :=
                  (_ :
                    ∀ (x y : LocallyConstant X Y),
                      OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } (x * y) =
                        OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } x *
                          OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } y) },
            map_zero' :=
              (_ :
                OneHom.toFun
                    (↑{ toOneHom := { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) },
                        map_mul' :=
                          (_ :
                            ∀ (x y : LocallyConstant X Y),
                              OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } (x * y) =
                                OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } x *
                                  OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } y) })
                    0 =
                  0),
            map_add' :=
              (_ :
                ∀ (x y : LocallyConstant X Y),
                  OneHom.toFun
                      (↑{ toOneHom := { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) },
                          map_mul' :=
                            (_ :
                              ∀ (x y : LocallyConstant X Y),
                                OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } (x * y) =
                                  OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } x *
                                    OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } y) })
                      (x + y) =
                    OneHom.toFun
                        (↑{ toOneHom := { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) },
                            map_mul' :=
                              (_ :
                                ∀ (x y : LocallyConstant X Y),
                                  OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } (x * y) =
                                    OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } x *
                                      OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } y) })
                        x +
                      OneHom.toFun
                        (↑{ toOneHom := { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) },
                            map_mul' :=
                              (_ :
                                ∀ (x y : LocallyConstant X Y),
                                  OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } (x * y) =
                                    OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } x *
                                      OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } y) })
                        y) })
      (↑(algebraMap R (LocallyConstant X Y)) r) =
    ↑(algebraMap R C(X, Y)) r
[PROOFSTEP]
ext x
[GOAL]
case h
X : Type u_1
Y : Type u_2
inst✝⁵ : TopologicalSpace X
inst✝⁴ : TopologicalSpace Y
f : LocallyConstant X Y
R : Type u_3
inst✝³ : CommSemiring R
inst✝² : Semiring Y
inst✝¹ : Algebra R Y
inst✝ : TopologicalSemiring Y
r : R
x : X
⊢ ↑(OneHom.toFun
          (↑↑{
                toMonoidHom :=
                  { toOneHom := { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) },
                    map_mul' :=
                      (_ :
                        ∀ (x y : LocallyConstant X Y),
                          OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } (x * y) =
                            OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } x *
                              OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } y) },
                map_zero' :=
                  (_ :
                    OneHom.toFun
                        (↑{ toOneHom := { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) },
                            map_mul' :=
                              (_ :
                                ∀ (x y : LocallyConstant X Y),
                                  OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } (x * y) =
                                    OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } x *
                                      OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } y) })
                        0 =
                      0),
                map_add' :=
                  (_ :
                    ∀ (x y : LocallyConstant X Y),
                      OneHom.toFun
                          (↑{ toOneHom := { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) },
                              map_mul' :=
                                (_ :
                                  ∀ (x y : LocallyConstant X Y),
                                    OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } (x * y) =
                                      OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } x *
                                        OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } y) })
                          (x + y) =
                        OneHom.toFun
                            (↑{ toOneHom := { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) },
                                map_mul' :=
                                  (_ :
                                    ∀ (x y : LocallyConstant X Y),
                                      OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } (x * y) =
                                        OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } x *
                                          OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } y) })
                            x +
                          OneHom.toFun
                            (↑{ toOneHom := { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) },
                                map_mul' :=
                                  (_ :
                                    ∀ (x y : LocallyConstant X Y),
                                      OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } (x * y) =
                                        OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } x *
                                          OneHom.toFun { toFun := toContinuousMap, map_one' := (_ : ↑1 = 1) } y) })
                            y) })
          (↑(algebraMap R (LocallyConstant X Y)) r))
      x =
    ↑(↑(algebraMap R C(X, Y)) r) x
[PROOFSTEP]
simp [Algebra.smul_def]


[GOAL]
C : Type u₁
inst✝³ : Category.{v₁, u₁} C
D : Type u₂
inst✝² : Category.{v₂, u₂} D
G : C ⥤ D
X : C
inst✝¹ : HasTerminal C
inst✝ : PreservesLimit (Functor.empty C) G
F : Discrete PEmpty ⥤ D
⊢ HasLimit F
[PROOFSTEP]
haveI := HasLimit.mk ⟨_, isLimitOfHasTerminalOfPreservesLimit G⟩
[GOAL]
C : Type u₁
inst✝³ : Category.{v₁, u₁} C
D : Type u₂
inst✝² : Category.{v₂, u₂} D
G : C ⥤ D
X : C
inst✝¹ : HasTerminal C
inst✝ : PreservesLimit (Functor.empty C) G
F : Discrete PEmpty ⥤ D
this : HasLimit (Functor.empty D)
⊢ HasLimit F
[PROOFSTEP]
apply hasLimitOfIso F.uniqueFromEmpty.symm
[GOAL]
C : Type u₁
inst✝³ : Category.{v₁, u₁} C
D : Type u₂
inst✝² : Category.{v₂, u₂} D
G : C ⥤ D
X : C
inst✝¹ : HasTerminal C
inst✝ : HasTerminal D
i : IsIso (terminalComparison G)
⊢ PreservesLimit (Functor.empty C) G
[PROOFSTEP]
apply preservesLimitOfPreservesLimitCone terminalIsTerminal
[GOAL]
C : Type u₁
inst✝³ : Category.{v₁, u₁} C
D : Type u₂
inst✝² : Category.{v₂, u₂} D
G : C ⥤ D
X : C
inst✝¹ : HasTerminal C
inst✝ : HasTerminal D
i : IsIso (terminalComparison G)
⊢ IsLimit (G.mapCone (asEmptyCone (⊤_ C)))
[PROOFSTEP]
apply (isLimitMapConeEmptyConeEquiv _ _).symm _
[GOAL]
C : Type u₁
inst✝³ : Category.{v₁, u₁} C
D : Type u₂
inst✝² : Category.{v₂, u₂} D
G : C ⥤ D
X : C
inst✝¹ : HasTerminal C
inst✝ : HasTerminal D
i : IsIso (terminalComparison G)
⊢ IsTerminal (G.obj (⊤_ C))
[PROOFSTEP]
exact @IsLimit.ofPointIso _ _ _ _ _ _ _ (limit.isLimit (Functor.empty.{0} D)) i
[GOAL]
C : Type u₁
inst✝³ : Category.{v₁, u₁} C
D : Type u₂
inst✝² : Category.{v₂, u₂} D
G : C ⥤ D
X : C
inst✝¹ : HasTerminal C
inst✝ : HasTerminal D
f : G.obj (⊤_ C) ⟶ ⊤_ D
i : IsIso f
⊢ PreservesLimit (Functor.empty C) G
[PROOFSTEP]
rw [Subsingleton.elim f (terminalComparison G)] at i
[GOAL]
C : Type u₁
inst✝³ : Category.{v₁, u₁} C
D : Type u₂
inst✝² : Category.{v₂, u₂} D
G : C ⥤ D
X : C
inst✝¹ : HasTerminal C
inst✝ : HasTerminal D
f : G.obj (⊤_ C) ⟶ ⊤_ D
i : IsIso (terminalComparison G)
⊢ PreservesLimit (Functor.empty C) G
[PROOFSTEP]
exact PreservesTerminal.ofIsoComparison G
[GOAL]
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
D : Type u₂
inst✝³ : Category.{v₂, u₂} D
G : C ⥤ D
X : C
inst✝² : HasTerminal C
inst✝¹ : HasTerminal D
inst✝ : PreservesLimit (Functor.empty C) G
⊢ IsIso (terminalComparison G)
[PROOFSTEP]
rw [← PreservesTerminal.iso_hom]
[GOAL]
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
D : Type u₂
inst✝³ : Category.{v₂, u₂} D
G : C ⥤ D
X : C
inst✝² : HasTerminal C
inst✝¹ : HasTerminal D
inst✝ : PreservesLimit (Functor.empty C) G
⊢ IsIso (PreservesTerminal.iso G).hom
[PROOFSTEP]
infer_instance
[GOAL]
C : Type u₁
inst✝³ : Category.{v₁, u₁} C
D : Type u₂
inst✝² : Category.{v₂, u₂} D
G : C ⥤ D
X : C
inst✝¹ : HasInitial C
inst✝ : PreservesColimit (Functor.empty C) G
F : Discrete PEmpty ⥤ D
⊢ HasColimit F
[PROOFSTEP]
haveI := HasColimit.mk ⟨_, isColimitOfHasInitialOfPreservesColimit G⟩
[GOAL]
C : Type u₁
inst✝³ : Category.{v₁, u₁} C
D : Type u₂
inst✝² : Category.{v₂, u₂} D
G : C ⥤ D
X : C
inst✝¹ : HasInitial C
inst✝ : PreservesColimit (Functor.empty C) G
F : Discrete PEmpty ⥤ D
this : HasColimit (Functor.empty D)
⊢ HasColimit F
[PROOFSTEP]
apply hasColimitOfIso F.uniqueFromEmpty
[GOAL]
C : Type u₁
inst✝³ : Category.{v₁, u₁} C
D : Type u₂
inst✝² : Category.{v₂, u₂} D
G : C ⥤ D
X : C
inst✝¹ : HasInitial C
inst✝ : HasInitial D
i : IsIso (initialComparison G)
⊢ PreservesColimit (Functor.empty C) G
[PROOFSTEP]
apply preservesColimitOfPreservesColimitCocone initialIsInitial
[GOAL]
C : Type u₁
inst✝³ : Category.{v₁, u₁} C
D : Type u₂
inst✝² : Category.{v₂, u₂} D
G : C ⥤ D
X : C
inst✝¹ : HasInitial C
inst✝ : HasInitial D
i : IsIso (initialComparison G)
⊢ IsColimit (G.mapCocone (asEmptyCocone (⊥_ C)))
[PROOFSTEP]
apply (isColimitMapCoconeEmptyCoconeEquiv _ _).symm _
[GOAL]
C : Type u₁
inst✝³ : Category.{v₁, u₁} C
D : Type u₂
inst✝² : Category.{v₂, u₂} D
G : C ⥤ D
X : C
inst✝¹ : HasInitial C
inst✝ : HasInitial D
i : IsIso (initialComparison G)
⊢ IsInitial (G.obj (⊥_ C))
[PROOFSTEP]
exact @IsColimit.ofPointIso _ _ _ _ _ _ _ (colimit.isColimit (Functor.empty.{0} D)) i
[GOAL]
C : Type u₁
inst✝³ : Category.{v₁, u₁} C
D : Type u₂
inst✝² : Category.{v₂, u₂} D
G : C ⥤ D
X : C
inst✝¹ : HasInitial C
inst✝ : HasInitial D
f : ⊥_ D ⟶ G.obj (⊥_ C)
i : IsIso f
⊢ PreservesColimit (Functor.empty C) G
[PROOFSTEP]
rw [Subsingleton.elim f (initialComparison G)] at i
[GOAL]
C : Type u₁
inst✝³ : Category.{v₁, u₁} C
D : Type u₂
inst✝² : Category.{v₂, u₂} D
G : C ⥤ D
X : C
inst✝¹ : HasInitial C
inst✝ : HasInitial D
f : ⊥_ D ⟶ G.obj (⊥_ C)
i : IsIso (initialComparison G)
⊢ PreservesColimit (Functor.empty C) G
[PROOFSTEP]
exact PreservesInitial.ofIsoComparison G
[GOAL]
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
D : Type u₂
inst✝³ : Category.{v₂, u₂} D
G : C ⥤ D
X : C
inst✝² : HasInitial C
inst✝¹ : HasInitial D
inst✝ : PreservesColimit (Functor.empty C) G
⊢ IsIso (initialComparison G)
[PROOFSTEP]
rw [← PreservesInitial.iso_hom]
[GOAL]
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
D : Type u₂
inst✝³ : Category.{v₂, u₂} D
G : C ⥤ D
X : C
inst✝² : HasInitial C
inst✝¹ : HasInitial D
inst✝ : PreservesColimit (Functor.empty C) G
⊢ IsIso (PreservesInitial.iso G).inv
[PROOFSTEP]
infer_instance


[GOAL]
α : Type u_1
inst✝ : TopologicalSpace α
⊢ OrdConnected (range Real.toEReal)
[PROOFSTEP]
rw [range_coe_eq_Ioo]
[GOAL]
α : Type u_1
inst✝ : TopologicalSpace α
⊢ OrdConnected (Ioo ⊥ ⊤)
[PROOFSTEP]
exact ordConnected_Ioo
[GOAL]
α : Type u_1
inst✝ : TopologicalSpace α
⊢ IsOpen (range Real.toEReal)
[PROOFSTEP]
simp only [range_coe_eq_Ioo, isOpen_Ioo]
[GOAL]
α : Type u_1
inst✝ : TopologicalSpace α
a : EReal
ha : a ≠ ⊤
h'a : a ≠ ⊥
⊢ Tendsto toReal (𝓝 a) (𝓝 (toReal a))
[PROOFSTEP]
lift a to ℝ using ⟨ha, h'a⟩
[GOAL]
case intro
α : Type u_1
inst✝ : TopologicalSpace α
a : ℝ
ha : ↑a ≠ ⊤
h'a : ↑a ≠ ⊥
⊢ Tendsto toReal (𝓝 ↑a) (𝓝 (toReal ↑a))
[PROOFSTEP]
rw [nhds_coe, tendsto_map'_iff]
[GOAL]
case intro
α : Type u_1
inst✝ : TopologicalSpace α
a : ℝ
ha : ↑a ≠ ⊤
h'a : ↑a ≠ ⊥
⊢ Tendsto (toReal ∘ Real.toEReal) (𝓝 a) (𝓝 (toReal ↑a))
[PROOFSTEP]
exact tendsto_id
[GOAL]
α : Type u_1
inst✝ : TopologicalSpace α
⊢ OrdConnected (range ENNReal.toEReal)
[PROOFSTEP]
rw [range_coe_ennreal]
[GOAL]
α : Type u_1
inst✝ : TopologicalSpace α
⊢ OrdConnected (Ici 0)
[PROOFSTEP]
exact ordConnected_Ici
[GOAL]
α : Type u_1
inst✝ : TopologicalSpace α
⊢ IsClosed (range ENNReal.toEReal)
[PROOFSTEP]
rw [range_coe_ennreal]
[GOAL]
α : Type u_1
inst✝ : TopologicalSpace α
⊢ IsClosed (Ici 0)
[PROOFSTEP]
exact isClosed_Ici
[GOAL]
α : Type u_1
inst✝ : TopologicalSpace α
⊢ ⨅ (l : EReal) (_ : l < ⊤), 𝓟 (Ioi l) = ⨅ (a : EReal) (_ : a ≠ ⊤), 𝓟 (Ioi a)
[PROOFSTEP]
simp only [lt_top_iff_ne_top]
[GOAL]
α : Type u_1
inst✝ : TopologicalSpace α
⊢ HasBasis (𝓝 ⊤) (fun x => True) fun x => Ioi ↑x
[PROOFSTEP]
refine nhds_top_basis.to_hasBasis (fun x hx => ?_) fun _ _ ↦ ⟨_, coe_lt_top _, Subset.rfl⟩
[GOAL]
α : Type u_1
inst✝ : TopologicalSpace α
x : EReal
hx : x < ⊤
⊢ ∃ i', True ∧ Ioi ↑i' ⊆ Ioi x
[PROOFSTEP]
rcases exists_rat_btwn_of_lt hx with ⟨y, hxy, -⟩
[GOAL]
case intro.intro
α : Type u_1
inst✝ : TopologicalSpace α
x : EReal
hx : x < ⊤
y : ℚ
hxy : x < ↑↑y
⊢ ∃ i', True ∧ Ioi ↑i' ⊆ Ioi x
[PROOFSTEP]
exact ⟨_, trivial, Ioi_subset_Ioi hxy.le⟩
[GOAL]
α : Type u_1
inst✝ : TopologicalSpace α
s : Set EReal
⊢ (∃ i, True ∧ Ioi ↑i ⊆ s) ↔ ∃ y, Ioi ↑y ⊆ s
[PROOFSTEP]
simp only [true_and]
[GOAL]
α✝ : Type u_1
inst✝ : TopologicalSpace α✝
α : Type u_2
m : α → EReal
f : Filter α
⊢ (∀ (i : ℝ), True → ∀ᶠ (x : α) in f, m x ∈ Ioi ↑i) ↔ ∀ (x : ℝ), ∀ᶠ (a : α) in f, ↑x < m a
[PROOFSTEP]
simp only [true_implies, mem_Ioi]
[GOAL]
α : Type u_1
inst✝ : TopologicalSpace α
⊢ ⨅ (l : EReal) (_ : ⊥ < l), 𝓟 (Iio l) = ⨅ (a : EReal) (_ : a ≠ ⊥), 𝓟 (Iio a)
[PROOFSTEP]
simp only [bot_lt_iff_ne_bot]
[GOAL]
α : Type u_1
inst✝ : TopologicalSpace α
⊢ HasBasis (𝓝 ⊥) (fun x => True) fun x => Iio ↑x
[PROOFSTEP]
refine nhds_bot_basis.to_hasBasis (fun x hx => ?_) fun _ _ ↦ ⟨_, bot_lt_coe _, Subset.rfl⟩
[GOAL]
α : Type u_1
inst✝ : TopologicalSpace α
x : EReal
hx : ⊥ < x
⊢ ∃ i', True ∧ Iio ↑i' ⊆ Iio x
[PROOFSTEP]
rcases exists_rat_btwn_of_lt hx with ⟨y, -, hxy⟩
[GOAL]
case intro.intro
α : Type u_1
inst✝ : TopologicalSpace α
x : EReal
hx : ⊥ < x
y : ℚ
hxy : ↑↑y < x
⊢ ∃ i', True ∧ Iio ↑i' ⊆ Iio x
[PROOFSTEP]
exact ⟨_, trivial, Iio_subset_Iio hxy.le⟩
[GOAL]
α : Type u_1
inst✝ : TopologicalSpace α
s : Set EReal
⊢ (∃ i, True ∧ Iio ↑i ⊆ s) ↔ ∃ y, Iio ↑y ⊆ s
[PROOFSTEP]
simp only [true_and]
[GOAL]
α✝ : Type u_1
inst✝ : TopologicalSpace α✝
α : Type u_2
m : α → EReal
f : Filter α
⊢ (∀ (i : ℝ), True → ∀ᶠ (x : α) in f, m x ∈ Iio ↑i) ↔ ∀ (x : ℝ), ∀ᶠ (a : α) in f, m a < ↑x
[PROOFSTEP]
simp only [true_implies, mem_Iio]
[GOAL]
α : Type u_1
inst✝ : TopologicalSpace α
a b : ℝ
⊢ ContinuousAt (fun p => p.fst + p.snd) (↑a, ↑b)
[PROOFSTEP]
simp only [ContinuousAt, nhds_coe_coe, ← coe_add, tendsto_map'_iff, (· ∘ ·), tendsto_coe, tendsto_add]
[GOAL]
α : Type u_1
inst✝ : TopologicalSpace α
a : ℝ
⊢ ContinuousAt (fun p => p.fst + p.snd) (⊤, ↑a)
[PROOFSTEP]
simp only [ContinuousAt, tendsto_nhds_top_iff_real, top_add_coe]
[GOAL]
α : Type u_1
inst✝ : TopologicalSpace α
a : ℝ
⊢ ∀ (x : ℝ), ∀ᶠ (a : EReal × EReal) in 𝓝 (⊤, ↑a), ↑x < a.fst + a.snd
[PROOFSTEP]
refine fun r ↦
  ((lt_mem_nhds (coe_lt_top (r - (a - 1)))).prod_nhds (lt_mem_nhds <| EReal.coe_lt_coe_iff.2 <| sub_one_lt _)).mono
    fun _ h ↦ ?_
[GOAL]
α : Type u_1
inst✝ : TopologicalSpace α
a r : ℝ
x✝ : EReal × EReal
h : ↑(r - (a - 1)) < x✝.fst ∧ ↑(a - 1) < x✝.snd
⊢ ↑r < x✝.fst + x✝.snd
[PROOFSTEP]
simpa only [← coe_add, sub_add_cancel] using add_lt_add h.1 h.2
[GOAL]
α : Type u_1
inst✝ : TopologicalSpace α
a : ℝ
⊢ ContinuousAt (fun p => p.fst + p.snd) (↑a, ⊤)
[PROOFSTEP]
simpa only [add_comm, (· ∘ ·), ContinuousAt, Prod.swap] using
  Tendsto.comp (continuousAt_add_top_coe a) (continuous_swap.tendsto ((a : EReal), ⊤))
[GOAL]
α : Type u_1
inst✝ : TopologicalSpace α
⊢ ContinuousAt (fun p => p.fst + p.snd) (⊤, ⊤)
[PROOFSTEP]
simp only [ContinuousAt, tendsto_nhds_top_iff_real, top_add_top]
[GOAL]
α : Type u_1
inst✝ : TopologicalSpace α
⊢ ∀ (x : ℝ), ∀ᶠ (a : EReal × EReal) in 𝓝 (⊤, ⊤), ↑x < a.fst + a.snd
[PROOFSTEP]
refine fun r ↦ ((lt_mem_nhds (coe_lt_top 0)).prod_nhds (lt_mem_nhds <| coe_lt_top r)).mono fun _ h ↦ ?_
[GOAL]
α : Type u_1
inst✝ : TopologicalSpace α
r : ℝ
x✝ : EReal × EReal
h : ↑0 < x✝.fst ∧ ↑r < x✝.snd
⊢ ↑r < x✝.fst + x✝.snd
[PROOFSTEP]
simpa only [coe_zero, zero_add] using add_lt_add h.1 h.2
[GOAL]
α : Type u_1
inst✝ : TopologicalSpace α
a : ℝ
⊢ ContinuousAt (fun p => p.fst + p.snd) (⊥, ↑a)
[PROOFSTEP]
simp only [ContinuousAt, tendsto_nhds_bot_iff_real, bot_add]
[GOAL]
α : Type u_1
inst✝ : TopologicalSpace α
a : ℝ
⊢ ∀ (x : ℝ), ∀ᶠ (a : EReal × EReal) in 𝓝 (⊥, ↑a), a.fst + a.snd < ↑x
[PROOFSTEP]
refine fun r ↦
  ((gt_mem_nhds (bot_lt_coe (r - (a + 1)))).prod_nhds (gt_mem_nhds <| EReal.coe_lt_coe_iff.2 <| lt_add_one _)).mono
    fun _ h ↦ ?_
[GOAL]
α : Type u_1
inst✝ : TopologicalSpace α
a r : ℝ
x✝ : EReal × EReal
h : x✝.fst < ↑(r - (a + 1)) ∧ x✝.snd < ↑(a + 1)
⊢ x✝.fst + x✝.snd < ↑r
[PROOFSTEP]
simpa only [← coe_add, sub_add_cancel] using add_lt_add h.1 h.2
[GOAL]
α : Type u_1
inst✝ : TopologicalSpace α
a : ℝ
⊢ ContinuousAt (fun p => p.fst + p.snd) (↑a, ⊥)
[PROOFSTEP]
simpa only [add_comm, (· ∘ ·), ContinuousAt, Prod.swap] using
  Tendsto.comp (continuousAt_add_bot_coe a) (continuous_swap.tendsto ((a : EReal), ⊥))
[GOAL]
α : Type u_1
inst✝ : TopologicalSpace α
⊢ ContinuousAt (fun p => p.fst + p.snd) (⊥, ⊥)
[PROOFSTEP]
simp only [ContinuousAt, tendsto_nhds_bot_iff_real, bot_add]
[GOAL]
α : Type u_1
inst✝ : TopologicalSpace α
⊢ ∀ (x : ℝ), ∀ᶠ (a : EReal × EReal) in 𝓝 (⊥, ⊥), a.fst + a.snd < ↑x
[PROOFSTEP]
refine fun r ↦ ((gt_mem_nhds (bot_lt_coe 0)).prod_nhds (gt_mem_nhds <| bot_lt_coe r)).mono fun _ h ↦ ?_
[GOAL]
α : Type u_1
inst✝ : TopologicalSpace α
r : ℝ
x✝ : EReal × EReal
h : x✝.fst < ↑0 ∧ x✝.snd < ↑r
⊢ x✝.fst + x✝.snd < ↑r
[PROOFSTEP]
simpa only [coe_zero, zero_add] using add_lt_add h.1 h.2
[GOAL]
α : Type u_1
inst✝ : TopologicalSpace α
p : EReal × EReal
h : p.fst ≠ ⊤ ∨ p.snd ≠ ⊥
h' : p.fst ≠ ⊥ ∨ p.snd ≠ ⊤
⊢ ContinuousAt (fun p => p.fst + p.snd) p
[PROOFSTEP]
rcases p with ⟨x, y⟩
[GOAL]
case mk
α : Type u_1
inst✝ : TopologicalSpace α
x y : EReal
h : (x, y).fst ≠ ⊤ ∨ (x, y).snd ≠ ⊥
h' : (x, y).fst ≠ ⊥ ∨ (x, y).snd ≠ ⊤
⊢ ContinuousAt (fun p => p.fst + p.snd) (x, y)
[PROOFSTEP]
induction x using EReal.rec
[GOAL]
case mk.h_bot
α : Type u_1
inst✝ : TopologicalSpace α
y : EReal
h : (⊥, y).fst ≠ ⊤ ∨ (⊥, y).snd ≠ ⊥
h' : (⊥, y).fst ≠ ⊥ ∨ (⊥, y).snd ≠ ⊤
⊢ ContinuousAt (fun p => p.fst + p.snd) (⊥, y)
[PROOFSTEP]
induction y using EReal.rec
[GOAL]
case mk.h_real
α : Type u_1
inst✝ : TopologicalSpace α
y : EReal
a✝ : ℝ
h : (↑a✝, y).fst ≠ ⊤ ∨ (↑a✝, y).snd ≠ ⊥
h' : (↑a✝, y).fst ≠ ⊥ ∨ (↑a✝, y).snd ≠ ⊤
⊢ ContinuousAt (fun p => p.fst + p.snd) (↑a✝, y)
[PROOFSTEP]
induction y using EReal.rec
[GOAL]
case mk.h_top
α : Type u_1
inst✝ : TopologicalSpace α
y : EReal
h : (⊤, y).fst ≠ ⊤ ∨ (⊤, y).snd ≠ ⊥
h' : (⊤, y).fst ≠ ⊥ ∨ (⊤, y).snd ≠ ⊤
⊢ ContinuousAt (fun p => p.fst + p.snd) (⊤, y)
[PROOFSTEP]
induction y using EReal.rec
[GOAL]
case mk.h_bot.h_bot
α : Type u_1
inst✝ : TopologicalSpace α
h : (⊥, ⊥).fst ≠ ⊤ ∨ (⊥, ⊥).snd ≠ ⊥
h' : (⊥, ⊥).fst ≠ ⊥ ∨ (⊥, ⊥).snd ≠ ⊤
⊢ ContinuousAt (fun p => p.fst + p.snd) (⊥, ⊥)
[PROOFSTEP]
exact continuousAt_add_bot_bot
[GOAL]
case mk.h_bot.h_real
α : Type u_1
inst✝ : TopologicalSpace α
a✝ : ℝ
h : (⊥, ↑a✝).fst ≠ ⊤ ∨ (⊥, ↑a✝).snd ≠ ⊥
h' : (⊥, ↑a✝).fst ≠ ⊥ ∨ (⊥, ↑a✝).snd ≠ ⊤
⊢ ContinuousAt (fun p => p.fst + p.snd) (⊥, ↑a✝)
[PROOFSTEP]
exact continuousAt_add_bot_coe _
[GOAL]
case mk.h_bot.h_top
α : Type u_1
inst✝ : TopologicalSpace α
h : (⊥, ⊤).fst ≠ ⊤ ∨ (⊥, ⊤).snd ≠ ⊥
h' : (⊥, ⊤).fst ≠ ⊥ ∨ (⊥, ⊤).snd ≠ ⊤
⊢ ContinuousAt (fun p => p.fst + p.snd) (⊥, ⊤)
[PROOFSTEP]
simp at h'
[GOAL]
case mk.h_real.h_bot
α : Type u_1
inst✝ : TopologicalSpace α
a✝ : ℝ
h : (↑a✝, ⊥).fst ≠ ⊤ ∨ (↑a✝, ⊥).snd ≠ ⊥
h' : (↑a✝, ⊥).fst ≠ ⊥ ∨ (↑a✝, ⊥).snd ≠ ⊤
⊢ ContinuousAt (fun p => p.fst + p.snd) (↑a✝, ⊥)
[PROOFSTEP]
exact continuousAt_add_coe_bot _
[GOAL]
case mk.h_real.h_real
α : Type u_1
inst✝ : TopologicalSpace α
a✝¹ a✝ : ℝ
h : (↑a✝¹, ↑a✝).fst ≠ ⊤ ∨ (↑a✝¹, ↑a✝).snd ≠ ⊥
h' : (↑a✝¹, ↑a✝).fst ≠ ⊥ ∨ (↑a✝¹, ↑a✝).snd ≠ ⊤
⊢ ContinuousAt (fun p => p.fst + p.snd) (↑a✝¹, ↑a✝)
[PROOFSTEP]
exact continuousAt_add_coe_coe _ _
[GOAL]
case mk.h_real.h_top
α : Type u_1
inst✝ : TopologicalSpace α
a✝ : ℝ
h : (↑a✝, ⊤).fst ≠ ⊤ ∨ (↑a✝, ⊤).snd ≠ ⊥
h' : (↑a✝, ⊤).fst ≠ ⊥ ∨ (↑a✝, ⊤).snd ≠ ⊤
⊢ ContinuousAt (fun p => p.fst + p.snd) (↑a✝, ⊤)
[PROOFSTEP]
exact continuousAt_add_coe_top _
[GOAL]
case mk.h_top.h_bot
α : Type u_1
inst✝ : TopologicalSpace α
h : (⊤, ⊥).fst ≠ ⊤ ∨ (⊤, ⊥).snd ≠ ⊥
h' : (⊤, ⊥).fst ≠ ⊥ ∨ (⊤, ⊥).snd ≠ ⊤
⊢ ContinuousAt (fun p => p.fst + p.snd) (⊤, ⊥)
[PROOFSTEP]
simp at h
[GOAL]
case mk.h_top.h_real
α : Type u_1
inst✝ : TopologicalSpace α
a✝ : ℝ
h : (⊤, ↑a✝).fst ≠ ⊤ ∨ (⊤, ↑a✝).snd ≠ ⊥
h' : (⊤, ↑a✝).fst ≠ ⊥ ∨ (⊤, ↑a✝).snd ≠ ⊤
⊢ ContinuousAt (fun p => p.fst + p.snd) (⊤, ↑a✝)
[PROOFSTEP]
exact continuousAt_add_top_coe _
[GOAL]
case mk.h_top.h_top
α : Type u_1
inst✝ : TopologicalSpace α
h : (⊤, ⊤).fst ≠ ⊤ ∨ (⊤, ⊤).snd ≠ ⊥
h' : (⊤, ⊤).fst ≠ ⊥ ∨ (⊤, ⊤).snd ≠ ⊤
⊢ ContinuousAt (fun p => p.fst + p.snd) (⊤, ⊤)
[PROOFSTEP]
exact continuousAt_add_top_top