[GOAL]
J✝ : Type
inst✝⁴ : SmallCategory J✝
inst✝³ : FinCategory J✝
k : Type v
inst✝² : Field k
J : Type
inst✝¹ : Fintype J
Z : J → ModuleCat k
inst✝ : ∀ (j : J), FiniteDimensional k ↑(Z j)
⊢ FiniteDimensional k ↑(ModuleCat.of k ((j : J) → ↑(Z j)))
[PROOFSTEP]
unfold ModuleCat.of
[GOAL]
J✝ : Type
inst✝⁴ : SmallCategory J✝
inst✝³ : FinCategory J✝
k : Type v
inst✝² : Field k
J : Type
inst✝¹ : Fintype J
Z : J → ModuleCat k
inst✝ : ∀ (j : J), FiniteDimensional k ↑(Z j)
⊢ FiniteDimensional k ↑(ModuleCat.mk ((j : J) → ↑(Z j)))
[PROOFSTEP]
infer_instance
[GOAL]
J✝ : Type
inst✝⁴ : SmallCategory J✝
inst✝³ : FinCategory J✝
k : Type v
inst✝² : Field k
J : Type
inst✝¹ : Fintype J
Z : J → ModuleCat k
inst✝ : ∀ (j : J), FiniteDimensional k ↑(Z j)
this : FiniteDimensional k ↑(ModuleCat.of k ((j : J) → ↑(Z j)))
⊢ Mono (ModuleCat.piIsoPi fun j => Z j).hom
[PROOFSTEP]
infer_instance
[GOAL]
J : Type
inst✝² : SmallCategory J
inst✝¹ : FinCategory J
k : Type v
inst✝ : Field k
F : J ⥤ FGModuleCat k
⊢ ∀ (j : J), FiniteDimensional k ↑((F ⋙ forget₂ (FGModuleCat k) (ModuleCat k)).obj j)
[PROOFSTEP]
intro j
[GOAL]
J : Type
inst✝² : SmallCategory J
inst✝¹ : FinCategory J
k : Type v
inst✝ : Field k
F : J ⥤ FGModuleCat k
j : J
⊢ FiniteDimensional k ↑((F ⋙ forget₂ (FGModuleCat k) (ModuleCat k)).obj j)
[PROOFSTEP]
change FiniteDimensional k (F.obj j)
[GOAL]
J : Type
inst✝² : SmallCategory J
inst✝¹ : FinCategory J
k : Type v
inst✝ : Field k
F : J ⥤ FGModuleCat k
j : J
⊢ FiniteDimensional k ↑(F.obj j)
[PROOFSTEP]
infer_instance


[GOAL]
α✝ : Type u
β : Type v
α : Type u_1
inst✝ : Sup α
sup_comm : ∀ (a b : α), a ⊔ b = b ⊔ a
sup_assoc : ∀ (a b c : α), a ⊔ b ⊔ c = a ⊔ (b ⊔ c)
sup_idem : ∀ (a : α), a ⊔ a = a
a b c : α
hab : a ≤ b
hbc : b ≤ c
⊢ a ≤ c
[PROOFSTEP]
show a ⊔ c = c
[GOAL]
α✝ : Type u
β : Type v
α : Type u_1
inst✝ : Sup α
sup_comm : ∀ (a b : α), a ⊔ b = b ⊔ a
sup_assoc : ∀ (a b c : α), a ⊔ b ⊔ c = a ⊔ (b ⊔ c)
sup_idem : ∀ (a : α), a ⊔ a = a
a b c : α
hab : a ≤ b
hbc : b ≤ c
⊢ a ⊔ c = c
[PROOFSTEP]
rw [← hbc, ← sup_assoc, hab]
[GOAL]
α✝ : Type u
β : Type v
α : Type u_1
inst✝ : Sup α
sup_comm : ∀ (a b : α), a ⊔ b = b ⊔ a
sup_assoc : ∀ (a b c : α), a ⊔ b ⊔ c = a ⊔ (b ⊔ c)
sup_idem : ∀ (a : α), a ⊔ a = a
a b : α
hab : a ≤ b
hba : b ≤ a
⊢ a = b
[PROOFSTEP]
rwa [← hba, sup_comm]
[GOAL]
α✝ : Type u
β : Type v
α : Type u_1
inst✝ : Sup α
sup_comm : ∀ (a b : α), a ⊔ b = b ⊔ a
sup_assoc : ∀ (a b c : α), a ⊔ b ⊔ c = a ⊔ (b ⊔ c)
sup_idem : ∀ (a : α), a ⊔ a = a
a b : α
⊢ a ⊔ (a ⊔ b) = a ⊔ b
[PROOFSTEP]
rw [← sup_assoc, sup_idem]
[GOAL]
α✝ : Type u
β : Type v
α : Type u_1
inst✝ : Sup α
sup_comm : ∀ (a b : α), a ⊔ b = b ⊔ a
sup_assoc : ∀ (a b c : α), a ⊔ b ⊔ c = a ⊔ (b ⊔ c)
sup_idem : ∀ (a : α), a ⊔ a = a
a b : α
⊢ b ⊔ (a ⊔ b) = a ⊔ b
[PROOFSTEP]
rw [sup_comm, sup_assoc, sup_idem]
[GOAL]
α✝ : Type u
β : Type v
α : Type u_1
inst✝ : Sup α
sup_comm : ∀ (a b : α), a ⊔ b = b ⊔ a
sup_assoc : ∀ (a b c : α), a ⊔ b ⊔ c = a ⊔ (b ⊔ c)
sup_idem : ∀ (a : α), a ⊔ a = a
a b c : α
hac : a ≤ c
hbc : b ≤ c
⊢ a ⊔ b ≤ c
[PROOFSTEP]
show (a ⊔ b) ⊔ c = c
[GOAL]
α✝ : Type u
β : Type v
α : Type u_1
inst✝ : Sup α
sup_comm : ∀ (a b : α), a ⊔ b = b ⊔ a
sup_assoc : ∀ (a b c : α), a ⊔ b ⊔ c = a ⊔ (b ⊔ c)
sup_idem : ∀ (a : α), a ⊔ a = a
a b c : α
hac : a ≤ c
hbc : b ≤ c
⊢ a ⊔ b ⊔ c = c
[PROOFSTEP]
rwa [sup_assoc, hbc]
[GOAL]
α : Type u
β : Type v
inst✝ : SemilatticeSup α
a b c d : α
⊢ a ⊔ b ≤ a ∧ a ≤ a ⊔ b ↔ b ≤ a
[PROOFSTEP]
simp [le_rfl]
[GOAL]
α : Type u
β : Type v
inst✝ : SemilatticeSup α
a b c d : α
⊢ a ⊔ b ≤ b ∧ b ≤ a ⊔ b ↔ a ≤ b
[PROOFSTEP]
simp [le_rfl]
[GOAL]
α : Type u
β : Type v
inst✝ : SemilatticeSup α
a b c d : α
⊢ a ≤ b ↔ ∃ c, b = a ⊔ c
[PROOFSTEP]
constructor
[GOAL]
case mp
α : Type u
β : Type v
inst✝ : SemilatticeSup α
a b c d : α
⊢ a ≤ b → ∃ c, b = a ⊔ c
[PROOFSTEP]
intro h
[GOAL]
case mp
α : Type u
β : Type v
inst✝ : SemilatticeSup α
a b c d : α
h : a ≤ b
⊢ ∃ c, b = a ⊔ c
[PROOFSTEP]
exact ⟨b, (sup_eq_right.mpr h).symm⟩
[GOAL]
case mpr
α : Type u
β : Type v
inst✝ : SemilatticeSup α
a b c d : α
⊢ (∃ c, b = a ⊔ c) → a ≤ b
[PROOFSTEP]
rintro ⟨c, rfl : _ = _ ⊔ _⟩
[GOAL]
case mpr.intro
α : Type u
β : Type v
inst✝ : SemilatticeSup α
a c✝ d c : α
⊢ a ≤ a ⊔ c
[PROOFSTEP]
exact le_sup_left
[GOAL]
α : Type u
β : Type v
inst✝ : SemilatticeSup α
a b c d : α
⊢ a ⊔ a = a
[PROOFSTEP]
simp
[GOAL]
α : Type u
β : Type v
inst✝ : SemilatticeSup α
a b c d : α
⊢ a ⊔ b = b ⊔ a
[PROOFSTEP]
apply le_antisymm
[GOAL]
case a
α : Type u
β : Type v
inst✝ : SemilatticeSup α
a b c d : α
⊢ a ⊔ b ≤ b ⊔ a
[PROOFSTEP]
simp
[GOAL]
case a
α : Type u
β : Type v
inst✝ : SemilatticeSup α
a b c d : α
⊢ b ⊔ a ≤ a ⊔ b
[PROOFSTEP]
simp
[GOAL]
α : Type u
β : Type v
inst✝ : SemilatticeSup α
a b c d x : α
⊢ a ⊔ b ⊔ c ≤ x ↔ a ⊔ (b ⊔ c) ≤ x
[PROOFSTEP]
simp only [sup_le_iff]
[GOAL]
α : Type u
β : Type v
inst✝ : SemilatticeSup α
a b c d x : α
⊢ (a ≤ x ∧ b ≤ x) ∧ c ≤ x ↔ a ≤ x ∧ b ≤ x ∧ c ≤ x
[PROOFSTEP]
rw [and_assoc]
[GOAL]
α : Type u
β : Type v
inst✝ : SemilatticeSup α
a✝ b✝ c✝ d a b c : α
⊢ a ⊔ b ⊔ c = c ⊔ b ⊔ a
[PROOFSTEP]
rw [sup_comm, @sup_comm _ _ a, sup_assoc]
[GOAL]
α : Type u
β : Type v
inst✝ : SemilatticeSup α
a b c d : α
⊢ a ⊔ (a ⊔ b) = a ⊔ b
[PROOFSTEP]
simp
[GOAL]
α : Type u
β : Type v
inst✝ : SemilatticeSup α
a b c d : α
⊢ a ⊔ b ⊔ b = a ⊔ b
[PROOFSTEP]
simp
[GOAL]
α : Type u
β : Type v
inst✝ : SemilatticeSup α
a✝ b✝ c✝ d a b c : α
⊢ a ⊔ (b ⊔ c) = b ⊔ (a ⊔ c)
[PROOFSTEP]
rw [← sup_assoc, ← sup_assoc, @sup_comm α _ a]
[GOAL]
α : Type u
β : Type v
inst✝ : SemilatticeSup α
a✝ b✝ c✝ d a b c : α
⊢ a ⊔ b ⊔ c = a ⊔ c ⊔ b
[PROOFSTEP]
rw [sup_assoc, sup_assoc, @sup_comm _ _ b]
[GOAL]
α : Type u
β : Type v
inst✝ : SemilatticeSup α
a✝ b✝ c✝ d✝ a b c d : α
⊢ a ⊔ b ⊔ (c ⊔ d) = a ⊔ c ⊔ (b ⊔ d)
[PROOFSTEP]
rw [sup_assoc, sup_left_comm b, ← sup_assoc]
[GOAL]
α : Type u
β : Type v
inst✝ : SemilatticeSup α
a✝ b✝ c✝ d a b c : α
⊢ a ⊔ (b ⊔ c) = a ⊔ b ⊔ (a ⊔ c)
[PROOFSTEP]
rw [sup_sup_sup_comm, sup_idem]
[GOAL]
α : Type u
β : Type v
inst✝ : SemilatticeSup α
a✝ b✝ c✝ d a b c : α
⊢ a ⊔ b ⊔ c = a ⊔ c ⊔ (b ⊔ c)
[PROOFSTEP]
rw [sup_sup_sup_comm, sup_idem]
[GOAL]
α✝ : Type u
β : Type v
inst✝ : SemilatticeSup α✝
a b c✝ d : α✝
α : Type u_1
A B : SemilatticeSup α
H : ∀ (x y : α), x ≤ y ↔ x ≤ y
x y c : α
⊢ x ⊔ y ≤ c ↔ x ⊔ y ≤ c
[PROOFSTEP]
simp only [sup_le_iff]
[GOAL]
α✝ : Type u
β : Type v
inst✝ : SemilatticeSup α✝
a b c✝ d : α✝
α : Type u_1
A B : SemilatticeSup α
H : ∀ (x y : α), x ≤ y ↔ x ≤ y
x y c : α
⊢ x ⊔ y ≤ c ↔ x ≤ c ∧ y ≤ c
[PROOFSTEP]
rw [← H, @sup_le_iff α A, H, H]
[GOAL]
α✝ : Type u
β : Type v
inst✝ : SemilatticeSup α✝
a b c d : α✝
α : Type u_1
A B : SemilatticeSup α
H : ∀ (x y : α), x ≤ y ↔ x ≤ y
⊢ A = B
[PROOFSTEP]
have ss : A.toSup = B.toSup := by ext; apply SemilatticeSup.ext_sup H
[GOAL]
α✝ : Type u
β : Type v
inst✝ : SemilatticeSup α✝
a b c d : α✝
α : Type u_1
A B : SemilatticeSup α
H : ∀ (x y : α), x ≤ y ↔ x ≤ y
⊢ toSup = toSup
[PROOFSTEP]
ext
[GOAL]
case sup.h.h
α✝ : Type u
β : Type v
inst✝ : SemilatticeSup α✝
a b c d : α✝
α : Type u_1
A B : SemilatticeSup α
H : ∀ (x y : α), x ≤ y ↔ x ≤ y
x✝¹ x✝ : α
⊢ x✝¹ ⊔ x✝ = x✝¹ ⊔ x✝
[PROOFSTEP]
apply SemilatticeSup.ext_sup H
[GOAL]
α✝ : Type u
β : Type v
inst✝ : SemilatticeSup α✝
a b c d : α✝
α : Type u_1
A B : SemilatticeSup α
H : ∀ (x y : α), x ≤ y ↔ x ≤ y
ss : toSup = toSup
⊢ A = B
[PROOFSTEP]
cases A
[GOAL]
case mk
α✝ : Type u
β : Type v
inst✝ : SemilatticeSup α✝
a b c d : α✝
α : Type u_1
B : SemilatticeSup α
toSup✝ : Sup α
toPartialOrder✝ : PartialOrder α
le_sup_left✝ : ∀ (a b : α), a ≤ a ⊔ b
le_sup_right✝ : ∀ (a b : α), b ≤ a ⊔ b
sup_le✝ : ∀ (a b c : α), a ≤ c → b ≤ c → a ⊔ b ≤ c
H : ∀ (x y : α), x ≤ y ↔ x ≤ y
ss : toSup = toSup
⊢ mk le_sup_left✝ le_sup_right✝ sup_le✝ = B
[PROOFSTEP]
cases B
[GOAL]
case mk.mk
α✝ : Type u
β : Type v
inst✝ : SemilatticeSup α✝
a b c d : α✝
α : Type u_1
toSup✝¹ : Sup α
toPartialOrder✝¹ : PartialOrder α
le_sup_left✝¹ : ∀ (a b : α), a ≤ a ⊔ b
le_sup_right✝¹ : ∀ (a b : α), b ≤ a ⊔ b
sup_le✝¹ : ∀ (a b c : α), a ≤ c → b ≤ c → a ⊔ b ≤ c
toSup✝ : Sup α
toPartialOrder✝ : PartialOrder α
le_sup_left✝ : ∀ (a b : α), a ≤ a ⊔ b
le_sup_right✝ : ∀ (a b : α), b ≤ a ⊔ b
sup_le✝ : ∀ (a b c : α), a ≤ c → b ≤ c → a ⊔ b ≤ c
H : ∀ (x y : α), x ≤ y ↔ x ≤ y
ss : toSup = toSup
⊢ mk le_sup_left✝¹ le_sup_right✝¹ sup_le✝¹ = mk le_sup_left✝ le_sup_right✝ sup_le✝
[PROOFSTEP]
cases PartialOrder.ext H
[GOAL]
case mk.mk.refl
α✝ : Type u
β : Type v
inst✝ : SemilatticeSup α✝
a b c d : α✝
α : Type u_1
toSup✝¹ : Sup α
toPartialOrder✝ : PartialOrder α
le_sup_left✝¹ : ∀ (a b : α), a ≤ a ⊔ b
le_sup_right✝¹ : ∀ (a b : α), b ≤ a ⊔ b
sup_le✝¹ : ∀ (a b c : α), a ≤ c → b ≤ c → a ⊔ b ≤ c
toSup✝ : Sup α
le_sup_left✝ : ∀ (a b : α), a ≤ a ⊔ b
le_sup_right✝ : ∀ (a b : α), b ≤ a ⊔ b
sup_le✝ : ∀ (a b c : α), a ≤ c → b ≤ c → a ⊔ b ≤ c
H : ∀ (x y : α), x ≤ y ↔ x ≤ y
ss : toSup = toSup
⊢ mk le_sup_left✝¹ le_sup_right✝¹ sup_le✝¹ = mk le_sup_left✝ le_sup_right✝ sup_le✝
[PROOFSTEP]
congr
[GOAL]
α : Type u
β : Type v
inst✝ : SemilatticeInf α
a b c d : α
⊢ a ⊓ b ≤ a ∧ a ≤ a ⊓ b ↔ a ≤ b
[PROOFSTEP]
simp [le_rfl]
[GOAL]
α : Type u
β : Type v
inst✝ : SemilatticeInf α
a b c d : α
⊢ a ⊓ b ≤ b ∧ b ≤ a ⊓ b ↔ b ≤ a
[PROOFSTEP]
simp [le_rfl]
[GOAL]
α✝ : Type u
β : Type v
inst✝ : SemilatticeInf α✝
a b c✝ d : α✝
α : Type u_1
A B : SemilatticeInf α
H : ∀ (x y : α), x ≤ y ↔ x ≤ y
x y c : α
⊢ c ≤ x ⊓ y ↔ c ≤ x ⊓ y
[PROOFSTEP]
simp only [le_inf_iff]
[GOAL]
α✝ : Type u
β : Type v
inst✝ : SemilatticeInf α✝
a b c✝ d : α✝
α : Type u_1
A B : SemilatticeInf α
H : ∀ (x y : α), x ≤ y ↔ x ≤ y
x y c : α
⊢ c ≤ x ⊓ y ↔ c ≤ x ∧ c ≤ y
[PROOFSTEP]
rw [← H, @le_inf_iff α A, H, H]
[GOAL]
α✝ : Type u
β : Type v
inst✝ : SemilatticeInf α✝
a b c d : α✝
α : Type u_1
A B : SemilatticeInf α
H : ∀ (x y : α), x ≤ y ↔ x ≤ y
⊢ A = B
[PROOFSTEP]
have ss : A.toInf = B.toInf := by ext; apply SemilatticeInf.ext_inf H
[GOAL]
α✝ : Type u
β : Type v
inst✝ : SemilatticeInf α✝
a b c d : α✝
α : Type u_1
A B : SemilatticeInf α
H : ∀ (x y : α), x ≤ y ↔ x ≤ y
⊢ toInf = toInf
[PROOFSTEP]
ext
[GOAL]
case inf.h.h
α✝ : Type u
β : Type v
inst✝ : SemilatticeInf α✝
a b c d : α✝
α : Type u_1
A B : SemilatticeInf α
H : ∀ (x y : α), x ≤ y ↔ x ≤ y
x✝¹ x✝ : α
⊢ x✝¹ ⊓ x✝ = x✝¹ ⊓ x✝
[PROOFSTEP]
apply SemilatticeInf.ext_inf H
[GOAL]
α✝ : Type u
β : Type v
inst✝ : SemilatticeInf α✝
a b c d : α✝
α : Type u_1
A B : SemilatticeInf α
H : ∀ (x y : α), x ≤ y ↔ x ≤ y
ss : toInf = toInf
⊢ A = B
[PROOFSTEP]
cases A
[GOAL]
case mk
α✝ : Type u
β : Type v
inst✝ : SemilatticeInf α✝
a b c d : α✝
α : Type u_1
B : SemilatticeInf α
toInf✝ : Inf α
toPartialOrder✝ : PartialOrder α
inf_le_left✝ : ∀ (a b : α), a ⊓ b ≤ a
inf_le_right✝ : ∀ (a b : α), a ⊓ b ≤ b
le_inf✝ : ∀ (a b c : α), a ≤ b → a ≤ c → a ≤ b ⊓ c
H : ∀ (x y : α), x ≤ y ↔ x ≤ y
ss : toInf = toInf
⊢ mk inf_le_left✝ inf_le_right✝ le_inf✝ = B
[PROOFSTEP]
cases B
[GOAL]
case mk.mk
α✝ : Type u
β : Type v
inst✝ : SemilatticeInf α✝
a b c d : α✝
α : Type u_1
toInf✝¹ : Inf α
toPartialOrder✝¹ : PartialOrder α
inf_le_left✝¹ : ∀ (a b : α), a ⊓ b ≤ a
inf_le_right✝¹ : ∀ (a b : α), a ⊓ b ≤ b
le_inf✝¹ : ∀ (a b c : α), a ≤ b → a ≤ c → a ≤ b ⊓ c
toInf✝ : Inf α
toPartialOrder✝ : PartialOrder α
inf_le_left✝ : ∀ (a b : α), a ⊓ b ≤ a
inf_le_right✝ : ∀ (a b : α), a ⊓ b ≤ b
le_inf✝ : ∀ (a b c : α), a ≤ b → a ≤ c → a ≤ b ⊓ c
H : ∀ (x y : α), x ≤ y ↔ x ≤ y
ss : toInf = toInf
⊢ mk inf_le_left✝¹ inf_le_right✝¹ le_inf✝¹ = mk inf_le_left✝ inf_le_right✝ le_inf✝
[PROOFSTEP]
cases PartialOrder.ext H
[GOAL]
case mk.mk.refl
α✝ : Type u
β : Type v
inst✝ : SemilatticeInf α✝
a b c d : α✝
α : Type u_1
toInf✝¹ : Inf α
toPartialOrder✝ : PartialOrder α
inf_le_left✝¹ : ∀ (a b : α), a ⊓ b ≤ a
inf_le_right✝¹ : ∀ (a b : α), a ⊓ b ≤ b
le_inf✝¹ : ∀ (a b c : α), a ≤ b → a ≤ c → a ≤ b ⊓ c
toInf✝ : Inf α
inf_le_left✝ : ∀ (a b : α), a ⊓ b ≤ a
inf_le_right✝ : ∀ (a b : α), a ⊓ b ≤ b
le_inf✝ : ∀ (a b c : α), a ≤ b → a ≤ c → a ≤ b ⊓ c
H : ∀ (x y : α), x ≤ y ↔ x ≤ y
ss : toInf = toInf
⊢ mk inf_le_left✝¹ inf_le_right✝¹ le_inf✝¹ = mk inf_le_left✝ inf_le_right✝ le_inf✝
[PROOFSTEP]
congr
[GOAL]
α✝ : Type u
β : Type v
α : Type u_1
inst✝ : Inf α
inf_comm : ∀ (a b : α), a ⊓ b = b ⊓ a
inf_assoc : ∀ (a b c : α), a ⊓ b ⊓ c = a ⊓ (b ⊓ c)
inf_idem : ∀ (a : α), a ⊓ a = a
⊢ SemilatticeInf α
[PROOFSTEP]
haveI : SemilatticeSup αᵒᵈ := SemilatticeSup.mk' inf_comm inf_assoc inf_idem
[GOAL]
α✝ : Type u
β : Type v
α : Type u_1
inst✝ : Inf α
inf_comm : ∀ (a b : α), a ⊓ b = b ⊓ a
inf_assoc : ∀ (a b c : α), a ⊓ b ⊓ c = a ⊓ (b ⊓ c)
inf_idem : ∀ (a : α), a ⊓ a = a
this : SemilatticeSup αᵒᵈ
⊢ SemilatticeInf α
[PROOFSTEP]
haveI i := OrderDual.semilatticeInf αᵒᵈ
[GOAL]
α✝ : Type u
β : Type v
α : Type u_1
inst✝ : Inf α
inf_comm : ∀ (a b : α), a ⊓ b = b ⊓ a
inf_assoc : ∀ (a b c : α), a ⊓ b ⊓ c = a ⊓ (b ⊓ c)
inf_idem : ∀ (a : α), a ⊓ a = a
this : SemilatticeSup αᵒᵈ
i : SemilatticeInf αᵒᵈᵒᵈ
⊢ SemilatticeInf α
[PROOFSTEP]
exact i
[GOAL]
α✝ : Type u
β : Type v
α : Type u_1
inst✝¹ : Sup α
inst✝ : Inf α
sup_comm : ∀ (a b : α), a ⊔ b = b ⊔ a
sup_assoc : ∀ (a b c : α), a ⊔ b ⊔ c = a ⊔ (b ⊔ c)
sup_idem : ∀ (a : α), a ⊔ a = a
inf_comm : ∀ (a b : α), a ⊓ b = b ⊓ a
inf_assoc : ∀ (a b c : α), a ⊓ b ⊓ c = a ⊓ (b ⊓ c)
inf_idem : ∀ (a : α), a ⊓ a = a
sup_inf_self : ∀ (a b : α), a ⊔ a ⊓ b = a
inf_sup_self : ∀ (a b : α), a ⊓ (a ⊔ b) = a
a b : α
h : a ⊔ b = b
⊢ b ⊓ a = a
[PROOFSTEP]
rw [← h, inf_comm, inf_sup_self]
[GOAL]
α✝ : Type u
β : Type v
α : Type u_1
inst✝¹ : Sup α
inst✝ : Inf α
sup_comm : ∀ (a b : α), a ⊔ b = b ⊔ a
sup_assoc : ∀ (a b c : α), a ⊔ b ⊔ c = a ⊔ (b ⊔ c)
sup_idem : ∀ (a : α), a ⊔ a = a
inf_comm : ∀ (a b : α), a ⊓ b = b ⊓ a
inf_assoc : ∀ (a b c : α), a ⊓ b ⊓ c = a ⊓ (b ⊓ c)
inf_idem : ∀ (a : α), a ⊓ a = a
sup_inf_self : ∀ (a b : α), a ⊔ a ⊓ b = a
inf_sup_self : ∀ (a b : α), a ⊓ (a ⊔ b) = a
a b : α
h : b ⊓ a = a
⊢ a ⊔ b = b
[PROOFSTEP]
rw [← h, sup_comm, sup_inf_self]
[GOAL]
α✝ : Type u
β : Type v
α : Type u_1
inst✝¹ : Sup α
inst✝ : Inf α
sup_comm : ∀ (a b : α), a ⊔ b = b ⊔ a
sup_assoc : ∀ (a b c : α), a ⊔ b ⊔ c = a ⊔ (b ⊔ c)
inf_comm : ∀ (a b : α), a ⊓ b = b ⊓ a
inf_assoc : ∀ (a b c : α), a ⊓ b ⊓ c = a ⊓ (b ⊓ c)
sup_inf_self : ∀ (a b : α), a ⊔ a ⊓ b = a
inf_sup_self : ∀ (a b : α), a ⊓ (a ⊔ b) = a
b : α
⊢ b ⊔ b = b ⊔ b ⊓ (b ⊔ b)
[PROOFSTEP]
rw [inf_sup_self]
[GOAL]
α✝ : Type u
β : Type v
α : Type u_1
inst✝¹ : Sup α
inst✝ : Inf α
sup_comm : ∀ (a b : α), a ⊔ b = b ⊔ a
sup_assoc : ∀ (a b c : α), a ⊔ b ⊔ c = a ⊔ (b ⊔ c)
inf_comm : ∀ (a b : α), a ⊓ b = b ⊓ a
inf_assoc : ∀ (a b c : α), a ⊓ b ⊓ c = a ⊓ (b ⊓ c)
sup_inf_self : ∀ (a b : α), a ⊔ a ⊓ b = a
inf_sup_self : ∀ (a b : α), a ⊓ (a ⊔ b) = a
b : α
⊢ b ⊔ b ⊓ (b ⊔ b) = b
[PROOFSTEP]
rw [sup_inf_self]
[GOAL]
α✝ : Type u
β : Type v
α : Type u_1
inst✝¹ : Sup α
inst✝ : Inf α
sup_comm : ∀ (a b : α), a ⊔ b = b ⊔ a
sup_assoc : ∀ (a b c : α), a ⊔ b ⊔ c = a ⊔ (b ⊔ c)
inf_comm : ∀ (a b : α), a ⊓ b = b ⊓ a
inf_assoc : ∀ (a b c : α), a ⊓ b ⊓ c = a ⊓ (b ⊓ c)
sup_inf_self : ∀ (a b : α), a ⊔ a ⊓ b = a
inf_sup_self : ∀ (a b : α), a ⊓ (a ⊔ b) = a
sup_idem : ∀ (b : α), b ⊔ b = b
b : α
⊢ b ⊓ b = b ⊓ (b ⊔ b ⊓ b)
[PROOFSTEP]
rw [sup_inf_self]
[GOAL]
α✝ : Type u
β : Type v
α : Type u_1
inst✝¹ : Sup α
inst✝ : Inf α
sup_comm : ∀ (a b : α), a ⊔ b = b ⊔ a
sup_assoc : ∀ (a b c : α), a ⊔ b ⊔ c = a ⊔ (b ⊔ c)
inf_comm : ∀ (a b : α), a ⊓ b = b ⊓ a
inf_assoc : ∀ (a b c : α), a ⊓ b ⊓ c = a ⊓ (b ⊓ c)
sup_inf_self : ∀ (a b : α), a ⊔ a ⊓ b = a
inf_sup_self : ∀ (a b : α), a ⊓ (a ⊔ b) = a
sup_idem : ∀ (b : α), b ⊔ b = b
b : α
⊢ b ⊓ (b ⊔ b ⊓ b) = b
[PROOFSTEP]
rw [inf_sup_self]
[GOAL]
α✝ : Type u
β : Type v
α : Type u_1
inst✝¹ : Sup α
inst✝ : Inf α
sup_comm : ∀ (a b : α), a ⊔ b = b ⊔ a
sup_assoc : ∀ (a b c : α), a ⊔ b ⊔ c = a ⊔ (b ⊔ c)
inf_comm : ∀ (a b : α), a ⊓ b = b ⊓ a
inf_assoc : ∀ (a b c : α), a ⊓ b ⊓ c = a ⊓ (b ⊓ c)
sup_inf_self : ∀ (a b : α), a ⊔ a ⊓ b = a
inf_sup_self : ∀ (a b : α), a ⊓ (a ⊔ b) = a
sup_idem : ∀ (b : α), b ⊔ b = b
inf_idem : ∀ (b : α), b ⊓ b = b
semilatt_inf_inst : SemilatticeInf α := SemilatticeInf.mk' inf_comm inf_assoc inf_idem
semilatt_sup_inst : SemilatticeSup α := SemilatticeSup.mk' sup_comm sup_assoc sup_idem
partial_order_eq : SemilatticeSup.toPartialOrder = SemilatticeInf.toPartialOrder
a b : α
⊢ a ⊓ b ≤ a
[PROOFSTEP]
rw [partial_order_eq]
[GOAL]
α✝ : Type u
β : Type v
α : Type u_1
inst✝¹ : Sup α
inst✝ : Inf α
sup_comm : ∀ (a b : α), a ⊔ b = b ⊔ a
sup_assoc : ∀ (a b c : α), a ⊔ b ⊔ c = a ⊔ (b ⊔ c)
inf_comm : ∀ (a b : α), a ⊓ b = b ⊓ a
inf_assoc : ∀ (a b c : α), a ⊓ b ⊓ c = a ⊓ (b ⊓ c)
sup_inf_self : ∀ (a b : α), a ⊔ a ⊓ b = a
inf_sup_self : ∀ (a b : α), a ⊓ (a ⊔ b) = a
sup_idem : ∀ (b : α), b ⊔ b = b
inf_idem : ∀ (b : α), b ⊓ b = b
semilatt_inf_inst : SemilatticeInf α := SemilatticeInf.mk' inf_comm inf_assoc inf_idem
semilatt_sup_inst : SemilatticeSup α := SemilatticeSup.mk' sup_comm sup_assoc sup_idem
partial_order_eq : SemilatticeSup.toPartialOrder = SemilatticeInf.toPartialOrder
a b : α
⊢ a ⊓ b ≤ a
[PROOFSTEP]
apply inf_le_left
[GOAL]
α✝ : Type u
β : Type v
α : Type u_1
inst✝¹ : Sup α
inst✝ : Inf α
sup_comm : ∀ (a b : α), a ⊔ b = b ⊔ a
sup_assoc : ∀ (a b c : α), a ⊔ b ⊔ c = a ⊔ (b ⊔ c)
inf_comm : ∀ (a b : α), a ⊓ b = b ⊓ a
inf_assoc : ∀ (a b c : α), a ⊓ b ⊓ c = a ⊓ (b ⊓ c)
sup_inf_self : ∀ (a b : α), a ⊔ a ⊓ b = a
inf_sup_self : ∀ (a b : α), a ⊓ (a ⊔ b) = a
sup_idem : ∀ (b : α), b ⊔ b = b
inf_idem : ∀ (b : α), b ⊓ b = b
semilatt_inf_inst : SemilatticeInf α := SemilatticeInf.mk' inf_comm inf_assoc inf_idem
semilatt_sup_inst : SemilatticeSup α := SemilatticeSup.mk' sup_comm sup_assoc sup_idem
partial_order_eq : SemilatticeSup.toPartialOrder = SemilatticeInf.toPartialOrder
a b : α
⊢ a ⊓ b ≤ b
[PROOFSTEP]
rw [partial_order_eq]
[GOAL]
α✝ : Type u
β : Type v
α : Type u_1
inst✝¹ : Sup α
inst✝ : Inf α
sup_comm : ∀ (a b : α), a ⊔ b = b ⊔ a
sup_assoc : ∀ (a b c : α), a ⊔ b ⊔ c = a ⊔ (b ⊔ c)
inf_comm : ∀ (a b : α), a ⊓ b = b ⊓ a
inf_assoc : ∀ (a b c : α), a ⊓ b ⊓ c = a ⊓ (b ⊓ c)
sup_inf_self : ∀ (a b : α), a ⊔ a ⊓ b = a
inf_sup_self : ∀ (a b : α), a ⊓ (a ⊔ b) = a
sup_idem : ∀ (b : α), b ⊔ b = b
inf_idem : ∀ (b : α), b ⊓ b = b
semilatt_inf_inst : SemilatticeInf α := SemilatticeInf.mk' inf_comm inf_assoc inf_idem
semilatt_sup_inst : SemilatticeSup α := SemilatticeSup.mk' sup_comm sup_assoc sup_idem
partial_order_eq : SemilatticeSup.toPartialOrder = SemilatticeInf.toPartialOrder
a b : α
⊢ a ⊓ b ≤ b
[PROOFSTEP]
apply inf_le_right
[GOAL]
α✝ : Type u
β : Type v
α : Type u_1
inst✝¹ : Sup α
inst✝ : Inf α
sup_comm : ∀ (a b : α), a ⊔ b = b ⊔ a
sup_assoc : ∀ (a b c : α), a ⊔ b ⊔ c = a ⊔ (b ⊔ c)
inf_comm : ∀ (a b : α), a ⊓ b = b ⊓ a
inf_assoc : ∀ (a b c : α), a ⊓ b ⊓ c = a ⊓ (b ⊓ c)
sup_inf_self : ∀ (a b : α), a ⊔ a ⊓ b = a
inf_sup_self : ∀ (a b : α), a ⊓ (a ⊔ b) = a
sup_idem : ∀ (b : α), b ⊔ b = b
inf_idem : ∀ (b : α), b ⊓ b = b
semilatt_inf_inst : SemilatticeInf α := SemilatticeInf.mk' inf_comm inf_assoc inf_idem
semilatt_sup_inst : SemilatticeSup α := SemilatticeSup.mk' sup_comm sup_assoc sup_idem
partial_order_eq : SemilatticeSup.toPartialOrder = SemilatticeInf.toPartialOrder
a b c : α
⊢ a ≤ b → a ≤ c → a ≤ b ⊓ c
[PROOFSTEP]
rw [partial_order_eq]
[GOAL]
α✝ : Type u
β : Type v
α : Type u_1
inst✝¹ : Sup α
inst✝ : Inf α
sup_comm : ∀ (a b : α), a ⊔ b = b ⊔ a
sup_assoc : ∀ (a b c : α), a ⊔ b ⊔ c = a ⊔ (b ⊔ c)
inf_comm : ∀ (a b : α), a ⊓ b = b ⊓ a
inf_assoc : ∀ (a b c : α), a ⊓ b ⊓ c = a ⊓ (b ⊓ c)
sup_inf_self : ∀ (a b : α), a ⊔ a ⊓ b = a
inf_sup_self : ∀ (a b : α), a ⊓ (a ⊔ b) = a
sup_idem : ∀ (b : α), b ⊔ b = b
inf_idem : ∀ (b : α), b ⊓ b = b
semilatt_inf_inst : SemilatticeInf α := SemilatticeInf.mk' inf_comm inf_assoc inf_idem
semilatt_sup_inst : SemilatticeSup α := SemilatticeSup.mk' sup_comm sup_assoc sup_idem
partial_order_eq : SemilatticeSup.toPartialOrder = SemilatticeInf.toPartialOrder
a b c : α
⊢ a ≤ b → a ≤ c → a ≤ b ⊓ c
[PROOFSTEP]
apply le_inf
[GOAL]
α : Type u
β : Type v
inst✝ : Lattice α
a b c d : α
⊢ a ⊔ b ≤ a ⊓ b ↔ a = b
[PROOFSTEP]
simp [le_antisymm_iff, and_comm]
[GOAL]
α : Type u
β : Type v
inst✝ : Lattice α
a b c d : α
⊢ a ⊓ b = a ⊔ b ↔ a = b
[PROOFSTEP]
rw [← inf_le_sup.ge_iff_eq, sup_le_inf]
[GOAL]
α : Type u
β : Type v
inst✝ : Lattice α
a b c d : α
⊢ a ⊓ b < a ⊔ b ↔ a ≠ b
[PROOFSTEP]
rw [inf_le_sup.lt_iff_ne, Ne.def, inf_eq_sup]
[GOAL]
α : Type u
β : Type v
inst✝ : Lattice α
a b c d : α
⊢ a ⊓ b = c ∧ a ⊔ b = c ↔ a = c ∧ b = c
[PROOFSTEP]
refine' ⟨fun h ↦ _, _⟩
[GOAL]
case refine'_1
α : Type u
β : Type v
inst✝ : Lattice α
a b c d : α
h : a ⊓ b = c ∧ a ⊔ b = c
⊢ a = c ∧ b = c
case refine'_2 α : Type u β : Type v inst✝ : Lattice α a b c d : α ⊢ a = c ∧ b = c → a ⊓ b = c ∧ a ⊔ b = c
[PROOFSTEP]
{ obtain rfl := sup_eq_inf.1 (h.2.trans h.1.symm)
  simpa using h
}
[GOAL]
case refine'_1
α : Type u
β : Type v
inst✝ : Lattice α
a b c d : α
h : a ⊓ b = c ∧ a ⊔ b = c
⊢ a = c ∧ b = c
[PROOFSTEP]
obtain rfl := sup_eq_inf.1 (h.2.trans h.1.symm)
[GOAL]
case refine'_1
α : Type u
β : Type v
inst✝ : Lattice α
a c d : α
h : a ⊓ a = c ∧ a ⊔ a = c
⊢ a = c ∧ a = c
[PROOFSTEP]
simpa using h
[GOAL]
case refine'_2
α : Type u
β : Type v
inst✝ : Lattice α
a b c d : α
⊢ a = c ∧ b = c → a ⊓ b = c ∧ a ⊔ b = c
[PROOFSTEP]
{ rintro ⟨rfl, rfl⟩
  exact ⟨inf_idem, sup_idem⟩
}
[GOAL]
case refine'_2
α : Type u
β : Type v
inst✝ : Lattice α
a b c d : α
⊢ a = c ∧ b = c → a ⊓ b = c ∧ a ⊔ b = c
[PROOFSTEP]
rintro ⟨rfl, rfl⟩
[GOAL]
case refine'_2.intro
α : Type u
β : Type v
inst✝ : Lattice α
b d : α
⊢ b ⊓ b = b ∧ b ⊔ b = b
[PROOFSTEP]
exact ⟨inf_idem, sup_idem⟩
[GOAL]
α : Type u
β : Type v
inst✝ : Lattice α
a b c d : α
⊢ a ⊓ (a ⊔ b) = a
[PROOFSTEP]
simp
[GOAL]
α : Type u
β : Type v
inst✝ : Lattice α
a b c d : α
⊢ a ⊔ a ⊓ b = a
[PROOFSTEP]
simp
[GOAL]
α : Type u
β : Type v
inst✝ : Lattice α
a b c d : α
⊢ a ⊔ b = b ↔ a ⊓ b = a
[PROOFSTEP]
rw [sup_eq_right, ← inf_eq_left]
[GOAL]
α✝ : Type u
β : Type v
inst✝ : Lattice α✝
a b c d : α✝
α : Type u_1
A B : Lattice α
H : ∀ (x y : α), x ≤ y ↔ x ≤ y
⊢ A = B
[PROOFSTEP]
cases A
[GOAL]
case mk
α✝ : Type u
β : Type v
inst✝ : Lattice α✝
a b c d : α✝
α : Type u_1
B : Lattice α
toSemilatticeSup✝ : SemilatticeSup α
toInf✝ : Inf α
inf_le_left✝ : ∀ (a b : α), a ⊓ b ≤ a
inf_le_right✝ : ∀ (a b : α), a ⊓ b ≤ b
le_inf✝ : ∀ (a b c : α), a ≤ b → a ≤ c → a ≤ b ⊓ c
H : ∀ (x y : α), x ≤ y ↔ x ≤ y
⊢ mk inf_le_left✝ inf_le_right✝ le_inf✝ = B
[PROOFSTEP]
cases B
[GOAL]
case mk.mk
α✝ : Type u
β : Type v
inst✝ : Lattice α✝
a b c d : α✝
α : Type u_1
toSemilatticeSup✝¹ : SemilatticeSup α
toInf✝¹ : Inf α
inf_le_left✝¹ : ∀ (a b : α), a ⊓ b ≤ a
inf_le_right✝¹ : ∀ (a b : α), a ⊓ b ≤ b
le_inf✝¹ : ∀ (a b c : α), a ≤ b → a ≤ c → a ≤ b ⊓ c
toSemilatticeSup✝ : SemilatticeSup α
toInf✝ : Inf α
inf_le_left✝ : ∀ (a b : α), a ⊓ b ≤ a
inf_le_right✝ : ∀ (a b : α), a ⊓ b ≤ b
le_inf✝ : ∀ (a b c : α), a ≤ b → a ≤ c → a ≤ b ⊓ c
H : ∀ (x y : α), x ≤ y ↔ x ≤ y
⊢ mk inf_le_left✝¹ inf_le_right✝¹ le_inf✝¹ = mk inf_le_left✝ inf_le_right✝ le_inf✝
[PROOFSTEP]
cases SemilatticeSup.ext H
[GOAL]
case mk.mk.refl
α✝ : Type u
β : Type v
inst✝ : Lattice α✝
a b c d : α✝
α : Type u_1
toSemilatticeSup✝ : SemilatticeSup α
toInf✝¹ : Inf α
inf_le_left✝¹ : ∀ (a b : α), a ⊓ b ≤ a
inf_le_right✝¹ : ∀ (a b : α), a ⊓ b ≤ b
le_inf✝¹ : ∀ (a b c : α), a ≤ b → a ≤ c → a ≤ b ⊓ c
toInf✝ : Inf α
inf_le_left✝ : ∀ (a b : α), a ⊓ b ≤ a
inf_le_right✝ : ∀ (a b : α), a ⊓ b ≤ b
le_inf✝ : ∀ (a b c : α), a ≤ b → a ≤ c → a ≤ b ⊓ c
H : ∀ (x y : α), x ≤ y ↔ x ≤ y
⊢ mk inf_le_left✝¹ inf_le_right✝¹ le_inf✝¹ = mk inf_le_left✝ inf_le_right✝ le_inf✝
[PROOFSTEP]
cases SemilatticeInf.ext H
[GOAL]
case mk.mk.refl.refl
α✝ : Type u
β : Type v
inst✝ : Lattice α✝
a b c d : α✝
α : Type u_1
toSemilatticeSup✝ : SemilatticeSup α
toInf✝ : Inf α
inf_le_left✝¹ : ∀ (a b : α), a ⊓ b ≤ a
inf_le_right✝¹ : ∀ (a b : α), a ⊓ b ≤ b
le_inf✝¹ : ∀ (a b c : α), a ≤ b → a ≤ c → a ≤ b ⊓ c
inf_le_left✝ : ∀ (a b : α), a ⊓ b ≤ a
inf_le_right✝ : ∀ (a b : α), a ⊓ b ≤ b
le_inf✝ : ∀ (a b c : α), a ≤ b → a ≤ c → a ≤ b ⊓ c
H : ∀ (x y : α), x ≤ y ↔ x ≤ y
⊢ mk inf_le_left✝¹ inf_le_right✝¹ le_inf✝¹ = mk inf_le_left✝ inf_le_right✝ le_inf✝
[PROOFSTEP]
congr
[GOAL]
α : Type u
β : Type v
inst✝ : DistribLattice α
x y z : α
⊢ y ⊓ z ⊔ x = (y ⊔ x) ⊓ (z ⊔ x)
[PROOFSTEP]
simp only [sup_inf_left, fun y : α => @sup_comm α _ y x, eq_self_iff_true]
[GOAL]
α : Type u
β : Type v
inst✝ : DistribLattice α
x y z : α
⊢ x ⊓ (y ⊔ z) = x ⊓ (x ⊔ z) ⊓ (y ⊔ z)
[PROOFSTEP]
rw [inf_sup_self]
[GOAL]
α : Type u
β : Type v
inst✝ : DistribLattice α
x y z : α
⊢ x ⊓ (x ⊔ z) ⊓ (y ⊔ z) = x ⊓ (x ⊓ y ⊔ z)
[PROOFSTEP]
simp only [inf_assoc, sup_inf_right, eq_self_iff_true]
[GOAL]
α : Type u
β : Type v
inst✝ : DistribLattice α
x y z : α
⊢ x ⊓ (x ⊓ y ⊔ z) = (x ⊔ x ⊓ y) ⊓ (x ⊓ y ⊔ z)
[PROOFSTEP]
rw [sup_inf_self]
[GOAL]
α : Type u
β : Type v
inst✝ : DistribLattice α
x y z : α
⊢ (x ⊔ x ⊓ y) ⊓ (x ⊓ y ⊔ z) = (x ⊓ y ⊔ x) ⊓ (x ⊓ y ⊔ z)
[PROOFSTEP]
rw [sup_comm]
[GOAL]
α : Type u
β : Type v
inst✝ : DistribLattice α
x y z : α
⊢ (x ⊓ y ⊔ x) ⊓ (x ⊓ y ⊔ z) = x ⊓ y ⊔ x ⊓ z
[PROOFSTEP]
rw [sup_inf_left]
[GOAL]
α : Type u
β : Type v
inst✝ : DistribLattice α
x y z : α
⊢ (y ⊔ z) ⊓ x = y ⊓ x ⊔ z ⊓ x
[PROOFSTEP]
simp only [inf_sup_left, fun y : α => @inf_comm α _ y x, eq_self_iff_true]
[GOAL]
α : Type u
β : Type v
inst✝ : DistribLattice α
x y z : α
h₁ : x ⊓ z ≤ y ⊓ z
h₂ : x ⊔ z ≤ y ⊔ z
⊢ y ⊓ z ⊔ x = (y ⊔ x) ⊓ (x ⊔ z)
[PROOFSTEP]
rw [sup_inf_right, @sup_comm _ _ x]
[GOAL]
α : Type u
β : Type v
inst✝ : LinearOrder α
a✝ b✝ c d a b : α
p : α → Prop
ha : p a
hb : p b
h : a ≤ b
⊢ p (a ⊔ b)
[PROOFSTEP]
rwa [sup_eq_right.2 h]
[GOAL]
α : Type u
β : Type v
inst✝ : LinearOrder α
a✝ b✝ c d a b : α
p : α → Prop
ha : p a
hb : p b
h : b ≤ a
⊢ p (a ⊔ b)
[PROOFSTEP]
rwa [sup_eq_left.2 h]
[GOAL]
α : Type u
β : Type v
inst✝ : LinearOrder α
a b c d : α
⊢ a ≤ b ⊔ c ↔ a ≤ b ∨ a ≤ c
[PROOFSTEP]
exact
  ⟨fun h => (le_total c b).imp (fun bc => by rwa [sup_eq_left.2 bc] at h ) (fun bc => by rwa [sup_eq_right.2 bc] at h ),
    fun h => h.elim le_sup_of_le_left le_sup_of_le_right⟩
[GOAL]
α : Type u
β : Type v
inst✝ : LinearOrder α
a b c d : α
h : a ≤ b ⊔ c
bc : c ≤ b
⊢ a ≤ b
[PROOFSTEP]
rwa [sup_eq_left.2 bc] at h
[GOAL]
α : Type u
β : Type v
inst✝ : LinearOrder α
a b c d : α
h : a ≤ b ⊔ c
bc : b ≤ c
⊢ a ≤ c
[PROOFSTEP]
rwa [sup_eq_right.2 bc] at h
[GOAL]
α : Type u
β : Type v
inst✝ : LinearOrder α
a b c d : α
⊢ a < b ⊔ c ↔ a < b ∨ a < c
[PROOFSTEP]
exact
  ⟨fun h => (le_total c b).imp (fun bc => by rwa [sup_eq_left.2 bc] at h ) (fun bc => by rwa [sup_eq_right.2 bc] at h ),
    fun h => h.elim lt_sup_of_lt_left lt_sup_of_lt_right⟩
[GOAL]
α : Type u
β : Type v
inst✝ : LinearOrder α
a b c d : α
h : a < b ⊔ c
bc : c ≤ b
⊢ a < b
[PROOFSTEP]
rwa [sup_eq_left.2 bc] at h
[GOAL]
α : Type u
β : Type v
inst✝ : LinearOrder α
a b c d : α
h : a < b ⊔ c
bc : b ≤ c
⊢ a < c
[PROOFSTEP]
rwa [sup_eq_right.2 bc] at h
[GOAL]
α : Type u
β : Type v
inst✝² : SemilatticeSup α
inst✝¹ : DecidableRel fun x x_1 => x ≤ x_1
inst✝ : IsTotal α fun x x_1 => x ≤ x_1
⊢ (fun x x_1 => x ⊔ x_1) = maxDefault
[PROOFSTEP]
ext x y
[GOAL]
case h.h
α : Type u
β : Type v
inst✝² : SemilatticeSup α
inst✝¹ : DecidableRel fun x x_1 => x ≤ x_1
inst✝ : IsTotal α fun x x_1 => x ≤ x_1
x y : α
⊢ x ⊔ y = maxDefault x y
[PROOFSTEP]
unfold maxDefault
[GOAL]
case h.h
α : Type u
β : Type v
inst✝² : SemilatticeSup α
inst✝¹ : DecidableRel fun x x_1 => x ≤ x_1
inst✝ : IsTotal α fun x x_1 => x ≤ x_1
x y : α
⊢ x ⊔ y = if x ≤ y then y else x
[PROOFSTEP]
split_ifs with h'
[GOAL]
case pos
α : Type u
β : Type v
inst✝² : SemilatticeSup α
inst✝¹ : DecidableRel fun x x_1 => x ≤ x_1
inst✝ : IsTotal α fun x x_1 => x ≤ x_1
x y : α
h' : x ≤ y
⊢ x ⊔ y = y
case neg
α : Type u
β : Type v
inst✝² : SemilatticeSup α
inst✝¹ : DecidableRel fun x x_1 => x ≤ x_1
inst✝ : IsTotal α fun x x_1 => x ≤ x_1
x y : α
h' : ¬x ≤ y
⊢ x ⊔ y = x
[PROOFSTEP]
exacts [sup_of_le_right h', sup_of_le_left $ (total_of (· ≤ ·) x y).resolve_left h']
[GOAL]
α : Type u
β : Type v
inst✝² : SemilatticeInf α
inst✝¹ : DecidableRel fun x x_1 => x ≤ x_1
inst✝ : IsTotal α fun x x_1 => x ≤ x_1
⊢ (fun x x_1 => x ⊓ x_1) = minDefault
[PROOFSTEP]
ext x y
[GOAL]
case h.h
α : Type u
β : Type v
inst✝² : SemilatticeInf α
inst✝¹ : DecidableRel fun x x_1 => x ≤ x_1
inst✝ : IsTotal α fun x x_1 => x ≤ x_1
x y : α
⊢ x ⊓ y = minDefault x y
[PROOFSTEP]
unfold minDefault
[GOAL]
case h.h
α : Type u
β : Type v
inst✝² : SemilatticeInf α
inst✝¹ : DecidableRel fun x x_1 => x ≤ x_1
inst✝ : IsTotal α fun x x_1 => x ≤ x_1
x y : α
⊢ x ⊓ y = if x ≤ y then x else y
[PROOFSTEP]
split_ifs with h'
[GOAL]
case pos
α : Type u
β : Type v
inst✝² : SemilatticeInf α
inst✝¹ : DecidableRel fun x x_1 => x ≤ x_1
inst✝ : IsTotal α fun x x_1 => x ≤ x_1
x y : α
h' : x ≤ y
⊢ x ⊓ y = x
case neg
α : Type u
β : Type v
inst✝² : SemilatticeInf α
inst✝¹ : DecidableRel fun x x_1 => x ≤ x_1
inst✝ : IsTotal α fun x x_1 => x ≤ x_1
x y : α
h' : ¬x ≤ y
⊢ x ⊓ y = y
[PROOFSTEP]
exacts [inf_of_le_left h', inf_of_le_right $ (total_of (· ≤ ·) x y).resolve_left h']
[GOAL]
α✝ : Type u
β : Type v
α : Type u
inst✝⁴ : Lattice α
inst✝³ : DecidableEq α
inst✝² : DecidableRel fun x x_1 => x ≤ x_1
inst✝¹ : DecidableRel fun x x_1 => x < x_1
inst✝ : IsTotal α fun x x_1 => x ≤ x_1
src✝ : Lattice α := inst✝⁴
⊢ ∀ (a b : α), min a b = if a ≤ b then a else b
[PROOFSTEP]
exact congr_fun₂ inf_eq_minDefault
[GOAL]
α✝ : Type u
β : Type v
α : Type u
inst✝⁴ : Lattice α
inst✝³ : DecidableEq α
inst✝² : DecidableRel fun x x_1 => x ≤ x_1
inst✝¹ : DecidableRel fun x x_1 => x < x_1
inst✝ : IsTotal α fun x x_1 => x ≤ x_1
src✝ : Lattice α := inst✝⁴
⊢ ∀ (a b : α), max a b = if a ≤ b then b else a
[PROOFSTEP]
exact congr_fun₂ sup_eq_maxDefault
[GOAL]
α : Type u
β : Type v
ι : Type u_1
π : ι → Type u_2
inst✝¹ : DecidableEq ι
inst✝ : (i : ι) → SemilatticeSup (π i)
f : (i : ι) → π i
i : ι
a b : π i
j : ι
⊢ update f i (a ⊔ b) j = (update f i a ⊔ update f i b) j
[PROOFSTEP]
obtain rfl | hji := eq_or_ne j i
[GOAL]
case inl
α : Type u
β : Type v
ι : Type u_1
π : ι → Type u_2
inst✝¹ : DecidableEq ι
inst✝ : (i : ι) → SemilatticeSup (π i)
f : (i : ι) → π i
j : ι
a b : π j
⊢ update f j (a ⊔ b) j = (update f j a ⊔ update f j b) j
[PROOFSTEP]
simp [update_noteq, *]
[GOAL]
case inr
α : Type u
β : Type v
ι : Type u_1
π : ι → Type u_2
inst✝¹ : DecidableEq ι
inst✝ : (i : ι) → SemilatticeSup (π i)
f : (i : ι) → π i
i : ι
a b : π i
j : ι
hji : j ≠ i
⊢ update f i (a ⊔ b) j = (update f i a ⊔ update f i b) j
[PROOFSTEP]
simp [update_noteq, *]
[GOAL]
α : Type u
β : Type v
ι : Type u_1
π : ι → Type u_2
inst✝¹ : DecidableEq ι
inst✝ : (i : ι) → SemilatticeInf (π i)
f : (i : ι) → π i
i : ι
a b : π i
j : ι
⊢ update f i (a ⊓ b) j = (update f i a ⊓ update f i b) j
[PROOFSTEP]
obtain rfl | hji := eq_or_ne j i
[GOAL]
case inl
α : Type u
β : Type v
ι : Type u_1
π : ι → Type u_2
inst✝¹ : DecidableEq ι
inst✝ : (i : ι) → SemilatticeInf (π i)
f : (i : ι) → π i
j : ι
a b : π j
⊢ update f j (a ⊓ b) j = (update f j a ⊓ update f j b) j
[PROOFSTEP]
simp [update_noteq, *]
[GOAL]
case inr
α : Type u
β : Type v
ι : Type u_1
π : ι → Type u_2
inst✝¹ : DecidableEq ι
inst✝ : (i : ι) → SemilatticeInf (π i)
f : (i : ι) → π i
i : ι
a b : π i
j : ι
hji : j ≠ i
⊢ update f i (a ⊓ b) j = (update f i a ⊓ update f i b) j
[PROOFSTEP]
simp [update_noteq, *]
[GOAL]
α : Type u
β : Type v
inst✝¹ : SemilatticeInf α
inst✝ : SemilatticeInf β
f : α → β
h : ∀ (x y : α), f (x ⊓ y) = f x ⊓ f y
x y : α
hxy : x ≤ y
⊢ f x ⊓ f y = f x
[PROOFSTEP]
rw [← h, inf_eq_left.2 hxy]
[GOAL]
α : Type u
β : Type v
inst✝¹ : LinearOrder α
inst✝ : SemilatticeSup β
f : α → β
hf : Monotone f
x y : α
h : x ≤ y
⊢ f (x ⊔ y) = f x ⊔ f y
[PROOFSTEP]
simp only [h, hf h, sup_of_le_right]
[GOAL]
α : Type u
β : Type v
inst✝¹ : LinearOrder α
inst✝ : SemilatticeSup β
f : α → β
hf : Monotone f
x y : α
h : y ≤ x
⊢ f (x ⊔ y) = f x ⊔ f y
[PROOFSTEP]
simp only [h, hf h, sup_of_le_left]
[GOAL]
α : Type u
β : Type v
inst✝¹ : Sup α
inst✝ : SemilatticeSup β
f : α → β
hf_inj : Injective f
map_sup : ∀ (a b : α), f (a ⊔ b) = f a ⊔ f b
src✝ : PartialOrder α := PartialOrder.lift f hf_inj
a b : α
⊢ a ≤ a ⊔ b
[PROOFSTEP]
change f a ≤ f (a ⊔ b)
[GOAL]
α : Type u
β : Type v
inst✝¹ : Sup α
inst✝ : SemilatticeSup β
f : α → β
hf_inj : Injective f
map_sup : ∀ (a b : α), f (a ⊔ b) = f a ⊔ f b
src✝ : PartialOrder α := PartialOrder.lift f hf_inj
a b : α
⊢ f a ≤ f (a ⊔ b)
[PROOFSTEP]
rw [map_sup]
[GOAL]
α : Type u
β : Type v
inst✝¹ : Sup α
inst✝ : SemilatticeSup β
f : α → β
hf_inj : Injective f
map_sup : ∀ (a b : α), f (a ⊔ b) = f a ⊔ f b
src✝ : PartialOrder α := PartialOrder.lift f hf_inj
a b : α
⊢ f a ≤ f a ⊔ f b
[PROOFSTEP]
exact le_sup_left
[GOAL]
α : Type u
β : Type v
inst✝¹ : Sup α
inst✝ : SemilatticeSup β
f : α → β
hf_inj : Injective f
map_sup : ∀ (a b : α), f (a ⊔ b) = f a ⊔ f b
src✝ : PartialOrder α := PartialOrder.lift f hf_inj
a b : α
⊢ b ≤ a ⊔ b
[PROOFSTEP]
change f b ≤ f (a ⊔ b)
[GOAL]
α : Type u
β : Type v
inst✝¹ : Sup α
inst✝ : SemilatticeSup β
f : α → β
hf_inj : Injective f
map_sup : ∀ (a b : α), f (a ⊔ b) = f a ⊔ f b
src✝ : PartialOrder α := PartialOrder.lift f hf_inj
a b : α
⊢ f b ≤ f (a ⊔ b)
[PROOFSTEP]
rw [map_sup]
[GOAL]
α : Type u
β : Type v
inst✝¹ : Sup α
inst✝ : SemilatticeSup β
f : α → β
hf_inj : Injective f
map_sup : ∀ (a b : α), f (a ⊔ b) = f a ⊔ f b
src✝ : PartialOrder α := PartialOrder.lift f hf_inj
a b : α
⊢ f b ≤ f a ⊔ f b
[PROOFSTEP]
exact le_sup_right
[GOAL]
α : Type u
β : Type v
inst✝¹ : Sup α
inst✝ : SemilatticeSup β
f : α → β
hf_inj : Injective f
map_sup : ∀ (a b : α), f (a ⊔ b) = f a ⊔ f b
src✝ : PartialOrder α := PartialOrder.lift f hf_inj
a b c : α
ha : a ≤ c
hb : b ≤ c
⊢ a ⊔ b ≤ c
[PROOFSTEP]
change f (a ⊔ b) ≤ f c
[GOAL]
α : Type u
β : Type v
inst✝¹ : Sup α
inst✝ : SemilatticeSup β
f : α → β
hf_inj : Injective f
map_sup : ∀ (a b : α), f (a ⊔ b) = f a ⊔ f b
src✝ : PartialOrder α := PartialOrder.lift f hf_inj
a b c : α
ha : a ≤ c
hb : b ≤ c
⊢ f (a ⊔ b) ≤ f c
[PROOFSTEP]
rw [map_sup]
[GOAL]
α : Type u
β : Type v
inst✝¹ : Sup α
inst✝ : SemilatticeSup β
f : α → β
hf_inj : Injective f
map_sup : ∀ (a b : α), f (a ⊔ b) = f a ⊔ f b
src✝ : PartialOrder α := PartialOrder.lift f hf_inj
a b c : α
ha : a ≤ c
hb : b ≤ c
⊢ f a ⊔ f b ≤ f c
[PROOFSTEP]
exact sup_le ha hb
[GOAL]
α : Type u
β : Type v
inst✝¹ : Inf α
inst✝ : SemilatticeInf β
f : α → β
hf_inj : Injective f
map_inf : ∀ (a b : α), f (a ⊓ b) = f a ⊓ f b
src✝ : PartialOrder α := PartialOrder.lift f hf_inj
a b : α
⊢ a ⊓ b ≤ a
[PROOFSTEP]
change f (a ⊓ b) ≤ f a
[GOAL]
α : Type u
β : Type v
inst✝¹ : Inf α
inst✝ : SemilatticeInf β
f : α → β
hf_inj : Injective f
map_inf : ∀ (a b : α), f (a ⊓ b) = f a ⊓ f b
src✝ : PartialOrder α := PartialOrder.lift f hf_inj
a b : α
⊢ f (a ⊓ b) ≤ f a
[PROOFSTEP]
rw [map_inf]
[GOAL]
α : Type u
β : Type v
inst✝¹ : Inf α
inst✝ : SemilatticeInf β
f : α → β
hf_inj : Injective f
map_inf : ∀ (a b : α), f (a ⊓ b) = f a ⊓ f b
src✝ : PartialOrder α := PartialOrder.lift f hf_inj
a b : α
⊢ f a ⊓ f b ≤ f a
[PROOFSTEP]
exact inf_le_left
[GOAL]
α : Type u
β : Type v
inst✝¹ : Inf α
inst✝ : SemilatticeInf β
f : α → β
hf_inj : Injective f
map_inf : ∀ (a b : α), f (a ⊓ b) = f a ⊓ f b
src✝ : PartialOrder α := PartialOrder.lift f hf_inj
a b : α
⊢ a ⊓ b ≤ b
[PROOFSTEP]
change f (a ⊓ b) ≤ f b
[GOAL]
α : Type u
β : Type v
inst✝¹ : Inf α
inst✝ : SemilatticeInf β
f : α → β
hf_inj : Injective f
map_inf : ∀ (a b : α), f (a ⊓ b) = f a ⊓ f b
src✝ : PartialOrder α := PartialOrder.lift f hf_inj
a b : α
⊢ f (a ⊓ b) ≤ f b
[PROOFSTEP]
rw [map_inf]
[GOAL]
α : Type u
β : Type v
inst✝¹ : Inf α
inst✝ : SemilatticeInf β
f : α → β
hf_inj : Injective f
map_inf : ∀ (a b : α), f (a ⊓ b) = f a ⊓ f b
src✝ : PartialOrder α := PartialOrder.lift f hf_inj
a b : α
⊢ f a ⊓ f b ≤ f b
[PROOFSTEP]
exact inf_le_right
[GOAL]
α : Type u
β : Type v
inst✝¹ : Inf α
inst✝ : SemilatticeInf β
f : α → β
hf_inj : Injective f
map_inf : ∀ (a b : α), f (a ⊓ b) = f a ⊓ f b
src✝ : PartialOrder α := PartialOrder.lift f hf_inj
a b c : α
ha : a ≤ b
hb : a ≤ c
⊢ a ≤ b ⊓ c
[PROOFSTEP]
change f a ≤ f (b ⊓ c)
[GOAL]
α : Type u
β : Type v
inst✝¹ : Inf α
inst✝ : SemilatticeInf β
f : α → β
hf_inj : Injective f
map_inf : ∀ (a b : α), f (a ⊓ b) = f a ⊓ f b
src✝ : PartialOrder α := PartialOrder.lift f hf_inj
a b c : α
ha : a ≤ b
hb : a ≤ c
⊢ f a ≤ f (b ⊓ c)
[PROOFSTEP]
rw [map_inf]
[GOAL]
α : Type u
β : Type v
inst✝¹ : Inf α
inst✝ : SemilatticeInf β
f : α → β
hf_inj : Injective f
map_inf : ∀ (a b : α), f (a ⊓ b) = f a ⊓ f b
src✝ : PartialOrder α := PartialOrder.lift f hf_inj
a b c : α
ha : a ≤ b
hb : a ≤ c
⊢ f a ≤ f b ⊓ f c
[PROOFSTEP]
exact le_inf ha hb
[GOAL]
α : Type u
β : Type v
inst✝² : Sup α
inst✝¹ : Inf α
inst✝ : DistribLattice β
f : α → β
hf_inj : Injective f
map_sup : ∀ (a b : α), f (a ⊔ b) = f a ⊔ f b
map_inf : ∀ (a b : α), f (a ⊓ b) = f a ⊓ f b
src✝ : Lattice α := Injective.lattice f hf_inj map_sup map_inf
a b c : α
⊢ (a ⊔ b) ⊓ (a ⊔ c) ≤ a ⊔ b ⊓ c
[PROOFSTEP]
change f ((a ⊔ b) ⊓ (a ⊔ c)) ≤ f (a ⊔ b ⊓ c)
[GOAL]
α : Type u
β : Type v
inst✝² : Sup α
inst✝¹ : Inf α
inst✝ : DistribLattice β
f : α → β
hf_inj : Injective f
map_sup : ∀ (a b : α), f (a ⊔ b) = f a ⊔ f b
map_inf : ∀ (a b : α), f (a ⊓ b) = f a ⊓ f b
src✝ : Lattice α := Injective.lattice f hf_inj map_sup map_inf
a b c : α
⊢ f ((a ⊔ b) ⊓ (a ⊔ c)) ≤ f (a ⊔ b ⊓ c)
[PROOFSTEP]
rw [map_inf, map_sup, map_sup, map_sup, map_inf]
[GOAL]
α : Type u
β : Type v
inst✝² : Sup α
inst✝¹ : Inf α
inst✝ : DistribLattice β
f : α → β
hf_inj : Injective f
map_sup : ∀ (a b : α), f (a ⊔ b) = f a ⊔ f b
map_inf : ∀ (a b : α), f (a ⊓ b) = f a ⊓ f b
src✝ : Lattice α := Injective.lattice f hf_inj map_sup map_inf
a b c : α
⊢ (f a ⊔ f b) ⊓ (f a ⊔ f c) ≤ f a ⊔ f b ⊓ f c
[PROOFSTEP]
exact le_sup_inf


[GOAL]
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
M' : Type u_5
N' : Type u_6
ι : Type u_7
κ : Type u_8
τ : Type u_9
ι' : Type u_10
κ' : Type u_11
inst✝¹⁸ : DecidableEq ι
inst✝¹⁷ : DecidableEq κ
inst✝¹⁶ : DecidableEq τ
inst✝¹⁵ : Fintype ι
inst✝¹⁴ : Fintype κ
inst✝¹³ : Fintype τ
inst✝¹² : Fintype ι'
inst✝¹¹ : Fintype κ'
inst✝¹⁰ : CommRing R
inst✝⁹ : AddCommGroup M
inst✝⁸ : AddCommGroup N
inst✝⁷ : AddCommGroup P
inst✝⁶ : AddCommGroup M'
inst✝⁵ : AddCommGroup N'
inst✝⁴ : Module R M
inst✝³ : Module R N
inst✝² : Module R P
inst✝¹ : Module R M'
inst✝ : Module R N'
bM : Basis ι R M
bN : Basis κ R N
bP : Basis τ R P
bM' : Basis ι' R M'
bN' : Basis κ' R N'
f : M →ₗ[R] M'
g : N →ₗ[R] N'
⊢ ↑(toMatrix (Basis.tensorProduct bM bN) (Basis.tensorProduct bM' bN')) (map f g) =
    kroneckerMap (fun x x_1 => x * x_1) (↑(toMatrix bM bM') f) (↑(toMatrix bN bN') g)
[PROOFSTEP]
ext ⟨i, j⟩ ⟨i', j'⟩
[GOAL]
case a.mk.h.mk
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
M' : Type u_5
N' : Type u_6
ι : Type u_7
κ : Type u_8
τ : Type u_9
ι' : Type u_10
κ' : Type u_11
inst✝¹⁸ : DecidableEq ι
inst✝¹⁷ : DecidableEq κ
inst✝¹⁶ : DecidableEq τ
inst✝¹⁵ : Fintype ι
inst✝¹⁴ : Fintype κ
inst✝¹³ : Fintype τ
inst✝¹² : Fintype ι'
inst✝¹¹ : Fintype κ'
inst✝¹⁰ : CommRing R
inst✝⁹ : AddCommGroup M
inst✝⁸ : AddCommGroup N
inst✝⁷ : AddCommGroup P
inst✝⁶ : AddCommGroup M'
inst✝⁵ : AddCommGroup N'
inst✝⁴ : Module R M
inst✝³ : Module R N
inst✝² : Module R P
inst✝¹ : Module R M'
inst✝ : Module R N'
bM : Basis ι R M
bN : Basis κ R N
bP : Basis τ R P
bM' : Basis ι' R M'
bN' : Basis κ' R N'
f : M →ₗ[R] M'
g : N →ₗ[R] N'
i : ι'
j : κ'
i' : ι
j' : κ
⊢ ↑(toMatrix (Basis.tensorProduct bM bN) (Basis.tensorProduct bM' bN')) (map f g) (i, j) (i', j') =
    kroneckerMap (fun x x_1 => x * x_1) (↑(toMatrix bM bM') f) (↑(toMatrix bN bN') g) (i, j) (i', j')
[PROOFSTEP]
simp_rw [Matrix.kroneckerMap_apply, toMatrix_apply, Basis.tensorProduct_apply, TensorProduct.map_tmul,
  Basis.tensorProduct_repr_tmul_apply]
[GOAL]
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
M' : Type u_5
N' : Type u_6
ι : Type u_7
κ : Type u_8
τ : Type u_9
ι' : Type u_10
κ' : Type u_11
inst✝¹⁸ : DecidableEq ι
inst✝¹⁷ : DecidableEq κ
inst✝¹⁶ : DecidableEq τ
inst✝¹⁵ : Fintype ι
inst✝¹⁴ : Fintype κ
inst✝¹³ : Fintype τ
inst✝¹² : Fintype ι'
inst✝¹¹ : Fintype κ'
inst✝¹⁰ : CommRing R
inst✝⁹ : AddCommGroup M
inst✝⁸ : AddCommGroup N
inst✝⁷ : AddCommGroup P
inst✝⁶ : AddCommGroup M'
inst✝⁵ : AddCommGroup N'
inst✝⁴ : Module R M
inst✝³ : Module R N
inst✝² : Module R P
inst✝¹ : Module R M'
inst✝ : Module R N'
bM : Basis ι R M
bN : Basis κ R N
bP : Basis τ R P
bM' : Basis ι' R M'
bN' : Basis κ' R N'
A : Matrix ι' ι R
B : Matrix κ' κ R
⊢ ↑(toLin (Basis.tensorProduct bM bN) (Basis.tensorProduct bM' bN')) (kroneckerMap (fun x x_1 => x * x_1) A B) =
    TensorProduct.map (↑(toLin bM bM') A) (↑(toLin bN bN') B)
[PROOFSTEP]
rw [← LinearEquiv.eq_symm_apply, toLin_symm, TensorProduct.toMatrix_map, toMatrix_toLin, toMatrix_toLin]
[GOAL]
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
M' : Type u_5
N' : Type u_6
ι : Type u_7
κ : Type u_8
τ : Type u_9
ι' : Type u_10
κ' : Type u_11
inst✝¹⁸ : DecidableEq ι
inst✝¹⁷ : DecidableEq κ
inst✝¹⁶ : DecidableEq τ
inst✝¹⁵ : Fintype ι
inst✝¹⁴ : Fintype κ
inst✝¹³ : Fintype τ
inst✝¹² : Fintype ι'
inst✝¹¹ : Fintype κ'
inst✝¹⁰ : CommRing R
inst✝⁹ : AddCommGroup M
inst✝⁸ : AddCommGroup N
inst✝⁷ : AddCommGroup P
inst✝⁶ : AddCommGroup M'
inst✝⁵ : AddCommGroup N'
inst✝⁴ : Module R M
inst✝³ : Module R N
inst✝² : Module R P
inst✝¹ : Module R M'
inst✝ : Module R N'
bM : Basis ι R M
bN : Basis κ R N
bP : Basis τ R P
bM' : Basis ι' R M'
bN' : Basis κ' R N'
⊢ ↑(toMatrix (Basis.tensorProduct bM bN) (Basis.tensorProduct bN bM)) ↑(TensorProduct.comm R M N) =
    submatrix 1 Prod.swap _root_.id
[PROOFSTEP]
ext ⟨i, j⟩ ⟨i', j'⟩
[GOAL]
case a.mk.h.mk
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
M' : Type u_5
N' : Type u_6
ι : Type u_7
κ : Type u_8
τ : Type u_9
ι' : Type u_10
κ' : Type u_11
inst✝¹⁸ : DecidableEq ι
inst✝¹⁷ : DecidableEq κ
inst✝¹⁶ : DecidableEq τ
inst✝¹⁵ : Fintype ι
inst✝¹⁴ : Fintype κ
inst✝¹³ : Fintype τ
inst✝¹² : Fintype ι'
inst✝¹¹ : Fintype κ'
inst✝¹⁰ : CommRing R
inst✝⁹ : AddCommGroup M
inst✝⁸ : AddCommGroup N
inst✝⁷ : AddCommGroup P
inst✝⁶ : AddCommGroup M'
inst✝⁵ : AddCommGroup N'
inst✝⁴ : Module R M
inst✝³ : Module R N
inst✝² : Module R P
inst✝¹ : Module R M'
inst✝ : Module R N'
bM : Basis ι R M
bN : Basis κ R N
bP : Basis τ R P
bM' : Basis ι' R M'
bN' : Basis κ' R N'
i : κ
j i' : ι
j' : κ
⊢ ↑(toMatrix (Basis.tensorProduct bM bN) (Basis.tensorProduct bN bM)) ↑(TensorProduct.comm R M N) (i, j) (i', j') =
    submatrix 1 Prod.swap _root_.id (i, j) (i', j')
[PROOFSTEP]
simp_rw [toMatrix_apply, Basis.tensorProduct_apply, LinearEquiv.coe_coe, TensorProduct.comm_tmul,
  Basis.tensorProduct_repr_tmul_apply, Matrix.submatrix_apply, Prod.swap_prod_mk, id.def, Basis.repr_self_apply,
  Matrix.one_apply, Prod.ext_iff, ite_and, @eq_comm _ i', @eq_comm _ j']
[GOAL]
case a.mk.h.mk
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
M' : Type u_5
N' : Type u_6
ι : Type u_7
κ : Type u_8
τ : Type u_9
ι' : Type u_10
κ' : Type u_11
inst✝¹⁸ : DecidableEq ι
inst✝¹⁷ : DecidableEq κ
inst✝¹⁶ : DecidableEq τ
inst✝¹⁵ : Fintype ι
inst✝¹⁴ : Fintype κ
inst✝¹³ : Fintype τ
inst✝¹² : Fintype ι'
inst✝¹¹ : Fintype κ'
inst✝¹⁰ : CommRing R
inst✝⁹ : AddCommGroup M
inst✝⁸ : AddCommGroup N
inst✝⁷ : AddCommGroup P
inst✝⁶ : AddCommGroup M'
inst✝⁵ : AddCommGroup N'
inst✝⁴ : Module R M
inst✝³ : Module R N
inst✝² : Module R P
inst✝¹ : Module R M'
inst✝ : Module R N'
bM : Basis ι R M
bN : Basis κ R N
bP : Basis τ R P
bM' : Basis ι' R M'
bN' : Basis κ' R N'
i : κ
j i' : ι
j' : κ
⊢ ((if i = j' then 1 else 0) * if j = i' then 1 else 0) = if j = i' then if i = j' then 1 else 0 else 0
[PROOFSTEP]
split_ifs
[GOAL]
case pos
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
M' : Type u_5
N' : Type u_6
ι : Type u_7
κ : Type u_8
τ : Type u_9
ι' : Type u_10
κ' : Type u_11
inst✝¹⁸ : DecidableEq ι
inst✝¹⁷ : DecidableEq κ
inst✝¹⁶ : DecidableEq τ
inst✝¹⁵ : Fintype ι
inst✝¹⁴ : Fintype κ
inst✝¹³ : Fintype τ
inst✝¹² : Fintype ι'
inst✝¹¹ : Fintype κ'
inst✝¹⁰ : CommRing R
inst✝⁹ : AddCommGroup M
inst✝⁸ : AddCommGroup N
inst✝⁷ : AddCommGroup P
inst✝⁶ : AddCommGroup M'
inst✝⁵ : AddCommGroup N'
inst✝⁴ : Module R M
inst✝³ : Module R N
inst✝² : Module R P
inst✝¹ : Module R M'
inst✝ : Module R N'
bM : Basis ι R M
bN : Basis κ R N
bP : Basis τ R P
bM' : Basis ι' R M'
bN' : Basis κ' R N'
i : κ
j i' : ι
j' : κ
h✝¹ : i = j'
h✝ : j = i'
⊢ 1 * 1 = 1
[PROOFSTEP]
simp
[GOAL]
case neg
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
M' : Type u_5
N' : Type u_6
ι : Type u_7
κ : Type u_8
τ : Type u_9
ι' : Type u_10
κ' : Type u_11
inst✝¹⁸ : DecidableEq ι
inst✝¹⁷ : DecidableEq κ
inst✝¹⁶ : DecidableEq τ
inst✝¹⁵ : Fintype ι
inst✝¹⁴ : Fintype κ
inst✝¹³ : Fintype τ
inst✝¹² : Fintype ι'
inst✝¹¹ : Fintype κ'
inst✝¹⁰ : CommRing R
inst✝⁹ : AddCommGroup M
inst✝⁸ : AddCommGroup N
inst✝⁷ : AddCommGroup P
inst✝⁶ : AddCommGroup M'
inst✝⁵ : AddCommGroup N'
inst✝⁴ : Module R M
inst✝³ : Module R N
inst✝² : Module R P
inst✝¹ : Module R M'
inst✝ : Module R N'
bM : Basis ι R M
bN : Basis κ R N
bP : Basis τ R P
bM' : Basis ι' R M'
bN' : Basis κ' R N'
i : κ
j i' : ι
j' : κ
h✝¹ : i = j'
h✝ : ¬j = i'
⊢ 1 * 0 = 0
[PROOFSTEP]
simp
[GOAL]
case pos
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
M' : Type u_5
N' : Type u_6
ι : Type u_7
κ : Type u_8
τ : Type u_9
ι' : Type u_10
κ' : Type u_11
inst✝¹⁸ : DecidableEq ι
inst✝¹⁷ : DecidableEq κ
inst✝¹⁶ : DecidableEq τ
inst✝¹⁵ : Fintype ι
inst✝¹⁴ : Fintype κ
inst✝¹³ : Fintype τ
inst✝¹² : Fintype ι'
inst✝¹¹ : Fintype κ'
inst✝¹⁰ : CommRing R
inst✝⁹ : AddCommGroup M
inst✝⁸ : AddCommGroup N
inst✝⁷ : AddCommGroup P
inst✝⁶ : AddCommGroup M'
inst✝⁵ : AddCommGroup N'
inst✝⁴ : Module R M
inst✝³ : Module R N
inst✝² : Module R P
inst✝¹ : Module R M'
inst✝ : Module R N'
bM : Basis ι R M
bN : Basis κ R N
bP : Basis τ R P
bM' : Basis ι' R M'
bN' : Basis κ' R N'
i : κ
j i' : ι
j' : κ
h✝¹ : ¬i = j'
h✝ : j = i'
⊢ 0 * 1 = 0
[PROOFSTEP]
simp
[GOAL]
case neg
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
M' : Type u_5
N' : Type u_6
ι : Type u_7
κ : Type u_8
τ : Type u_9
ι' : Type u_10
κ' : Type u_11
inst✝¹⁸ : DecidableEq ι
inst✝¹⁷ : DecidableEq κ
inst✝¹⁶ : DecidableEq τ
inst✝¹⁵ : Fintype ι
inst✝¹⁴ : Fintype κ
inst✝¹³ : Fintype τ
inst✝¹² : Fintype ι'
inst✝¹¹ : Fintype κ'
inst✝¹⁰ : CommRing R
inst✝⁹ : AddCommGroup M
inst✝⁸ : AddCommGroup N
inst✝⁷ : AddCommGroup P
inst✝⁶ : AddCommGroup M'
inst✝⁵ : AddCommGroup N'
inst✝⁴ : Module R M
inst✝³ : Module R N
inst✝² : Module R P
inst✝¹ : Module R M'
inst✝ : Module R N'
bM : Basis ι R M
bN : Basis κ R N
bP : Basis τ R P
bM' : Basis ι' R M'
bN' : Basis κ' R N'
i : κ
j i' : ι
j' : κ
h✝¹ : ¬i = j'
h✝ : ¬j = i'
⊢ 0 * 0 = 0
[PROOFSTEP]
simp
[GOAL]
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
M' : Type u_5
N' : Type u_6
ι : Type u_7
κ : Type u_8
τ : Type u_9
ι' : Type u_10
κ' : Type u_11
inst✝¹⁸ : DecidableEq ι
inst✝¹⁷ : DecidableEq κ
inst✝¹⁶ : DecidableEq τ
inst✝¹⁵ : Fintype ι
inst✝¹⁴ : Fintype κ
inst✝¹³ : Fintype τ
inst✝¹² : Fintype ι'
inst✝¹¹ : Fintype κ'
inst✝¹⁰ : CommRing R
inst✝⁹ : AddCommGroup M
inst✝⁸ : AddCommGroup N
inst✝⁷ : AddCommGroup P
inst✝⁶ : AddCommGroup M'
inst✝⁵ : AddCommGroup N'
inst✝⁴ : Module R M
inst✝³ : Module R N
inst✝² : Module R P
inst✝¹ : Module R M'
inst✝ : Module R N'
bM : Basis ι R M
bN : Basis κ R N
bP : Basis τ R P
bM' : Basis ι' R M'
bN' : Basis κ' R N'
⊢ ↑(toMatrix (Basis.tensorProduct (Basis.tensorProduct bM bN) bP) (Basis.tensorProduct bM (Basis.tensorProduct bN bP)))
      ↑(TensorProduct.assoc R M N P) =
    submatrix 1 _root_.id ↑(Equiv.prodAssoc ι κ τ)
[PROOFSTEP]
ext ⟨i, j, k⟩ ⟨⟨i', j'⟩, k'⟩
[GOAL]
case a.mk.mk.h.mk.mk
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
M' : Type u_5
N' : Type u_6
ι : Type u_7
κ : Type u_8
τ : Type u_9
ι' : Type u_10
κ' : Type u_11
inst✝¹⁸ : DecidableEq ι
inst✝¹⁷ : DecidableEq κ
inst✝¹⁶ : DecidableEq τ
inst✝¹⁵ : Fintype ι
inst✝¹⁴ : Fintype κ
inst✝¹³ : Fintype τ
inst✝¹² : Fintype ι'
inst✝¹¹ : Fintype κ'
inst✝¹⁰ : CommRing R
inst✝⁹ : AddCommGroup M
inst✝⁸ : AddCommGroup N
inst✝⁷ : AddCommGroup P
inst✝⁶ : AddCommGroup M'
inst✝⁵ : AddCommGroup N'
inst✝⁴ : Module R M
inst✝³ : Module R N
inst✝² : Module R P
inst✝¹ : Module R M'
inst✝ : Module R N'
bM : Basis ι R M
bN : Basis κ R N
bP : Basis τ R P
bM' : Basis ι' R M'
bN' : Basis κ' R N'
i : ι
j : κ
k k' : τ
i' : ι
j' : κ
⊢ ↑(toMatrix (Basis.tensorProduct (Basis.tensorProduct bM bN) bP) (Basis.tensorProduct bM (Basis.tensorProduct bN bP)))
      ↑(TensorProduct.assoc R M N P) (i, j, k) ((i', j'), k') =
    submatrix 1 _root_.id ↑(Equiv.prodAssoc ι κ τ) (i, j, k) ((i', j'), k')
[PROOFSTEP]
simp_rw [toMatrix_apply, Basis.tensorProduct_apply, LinearEquiv.coe_coe, TensorProduct.assoc_tmul,
  Basis.tensorProduct_repr_tmul_apply, Matrix.submatrix_apply, Equiv.prodAssoc_apply, id.def, Basis.repr_self_apply,
  Matrix.one_apply, Prod.ext_iff, ite_and, @eq_comm _ i', @eq_comm _ j', @eq_comm _ k']
[GOAL]
case a.mk.mk.h.mk.mk
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
M' : Type u_5
N' : Type u_6
ι : Type u_7
κ : Type u_8
τ : Type u_9
ι' : Type u_10
κ' : Type u_11
inst✝¹⁸ : DecidableEq ι
inst✝¹⁷ : DecidableEq κ
inst✝¹⁶ : DecidableEq τ
inst✝¹⁵ : Fintype ι
inst✝¹⁴ : Fintype κ
inst✝¹³ : Fintype τ
inst✝¹² : Fintype ι'
inst✝¹¹ : Fintype κ'
inst✝¹⁰ : CommRing R
inst✝⁹ : AddCommGroup M
inst✝⁸ : AddCommGroup N
inst✝⁷ : AddCommGroup P
inst✝⁶ : AddCommGroup M'
inst✝⁵ : AddCommGroup N'
inst✝⁴ : Module R M
inst✝³ : Module R N
inst✝² : Module R P
inst✝¹ : Module R M'
inst✝ : Module R N'
bM : Basis ι R M
bN : Basis κ R N
bP : Basis τ R P
bM' : Basis ι' R M'
bN' : Basis κ' R N'
i : ι
j : κ
k k' : τ
i' : ι
j' : κ
⊢ (if i = i' then 1 else 0) * ((if j = j' then 1 else 0) * if k = k' then 1 else 0) =
    if i = i' then if j = j' then if k = k' then 1 else 0 else 0 else 0
[PROOFSTEP]
split_ifs
[GOAL]
case pos
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
M' : Type u_5
N' : Type u_6
ι : Type u_7
κ : Type u_8
τ : Type u_9
ι' : Type u_10
κ' : Type u_11
inst✝¹⁸ : DecidableEq ι
inst✝¹⁷ : DecidableEq κ
inst✝¹⁶ : DecidableEq τ
inst✝¹⁵ : Fintype ι
inst✝¹⁴ : Fintype κ
inst✝¹³ : Fintype τ
inst✝¹² : Fintype ι'
inst✝¹¹ : Fintype κ'
inst✝¹⁰ : CommRing R
inst✝⁹ : AddCommGroup M
inst✝⁸ : AddCommGroup N
inst✝⁷ : AddCommGroup P
inst✝⁶ : AddCommGroup M'
inst✝⁵ : AddCommGroup N'
inst✝⁴ : Module R M
inst✝³ : Module R N
inst✝² : Module R P
inst✝¹ : Module R M'
inst✝ : Module R N'
bM : Basis ι R M
bN : Basis κ R N
bP : Basis τ R P
bM' : Basis ι' R M'
bN' : Basis κ' R N'
i : ι
j : κ
k k' : τ
i' : ι
j' : κ
h✝² : i = i'
h✝¹ : j = j'
h✝ : k = k'
⊢ 1 * (1 * 1) = 1
[PROOFSTEP]
simp
[GOAL]
case neg
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
M' : Type u_5
N' : Type u_6
ι : Type u_7
κ : Type u_8
τ : Type u_9
ι' : Type u_10
κ' : Type u_11
inst✝¹⁸ : DecidableEq ι
inst✝¹⁷ : DecidableEq κ
inst✝¹⁶ : DecidableEq τ
inst✝¹⁵ : Fintype ι
inst✝¹⁴ : Fintype κ
inst✝¹³ : Fintype τ
inst✝¹² : Fintype ι'
inst✝¹¹ : Fintype κ'
inst✝¹⁰ : CommRing R
inst✝⁹ : AddCommGroup M
inst✝⁸ : AddCommGroup N
inst✝⁷ : AddCommGroup P
inst✝⁶ : AddCommGroup M'
inst✝⁵ : AddCommGroup N'
inst✝⁴ : Module R M
inst✝³ : Module R N
inst✝² : Module R P
inst✝¹ : Module R M'
inst✝ : Module R N'
bM : Basis ι R M
bN : Basis κ R N
bP : Basis τ R P
bM' : Basis ι' R M'
bN' : Basis κ' R N'
i : ι
j : κ
k k' : τ
i' : ι
j' : κ
h✝² : i = i'
h✝¹ : j = j'
h✝ : ¬k = k'
⊢ 1 * (1 * 0) = 0
[PROOFSTEP]
simp
[GOAL]
case pos
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
M' : Type u_5
N' : Type u_6
ι : Type u_7
κ : Type u_8
τ : Type u_9
ι' : Type u_10
κ' : Type u_11
inst✝¹⁸ : DecidableEq ι
inst✝¹⁷ : DecidableEq κ
inst✝¹⁶ : DecidableEq τ
inst✝¹⁵ : Fintype ι
inst✝¹⁴ : Fintype κ
inst✝¹³ : Fintype τ
inst✝¹² : Fintype ι'
inst✝¹¹ : Fintype κ'
inst✝¹⁰ : CommRing R
inst✝⁹ : AddCommGroup M
inst✝⁸ : AddCommGroup N
inst✝⁷ : AddCommGroup P
inst✝⁶ : AddCommGroup M'
inst✝⁵ : AddCommGroup N'
inst✝⁴ : Module R M
inst✝³ : Module R N
inst✝² : Module R P
inst✝¹ : Module R M'
inst✝ : Module R N'
bM : Basis ι R M
bN : Basis κ R N
bP : Basis τ R P
bM' : Basis ι' R M'
bN' : Basis κ' R N'
i : ι
j : κ
k k' : τ
i' : ι
j' : κ
h✝² : i = i'
h✝¹ : ¬j = j'
h✝ : k = k'
⊢ 1 * (0 * 1) = 0
[PROOFSTEP]
simp
[GOAL]
case neg
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
M' : Type u_5
N' : Type u_6
ι : Type u_7
κ : Type u_8
τ : Type u_9
ι' : Type u_10
κ' : Type u_11
inst✝¹⁸ : DecidableEq ι
inst✝¹⁷ : DecidableEq κ
inst✝¹⁶ : DecidableEq τ
inst✝¹⁵ : Fintype ι
inst✝¹⁴ : Fintype κ
inst✝¹³ : Fintype τ
inst✝¹² : Fintype ι'
inst✝¹¹ : Fintype κ'
inst✝¹⁰ : CommRing R
inst✝⁹ : AddCommGroup M
inst✝⁸ : AddCommGroup N
inst✝⁷ : AddCommGroup P
inst✝⁶ : AddCommGroup M'
inst✝⁵ : AddCommGroup N'
inst✝⁴ : Module R M
inst✝³ : Module R N
inst✝² : Module R P
inst✝¹ : Module R M'
inst✝ : Module R N'
bM : Basis ι R M
bN : Basis κ R N
bP : Basis τ R P
bM' : Basis ι' R M'
bN' : Basis κ' R N'
i : ι
j : κ
k k' : τ
i' : ι
j' : κ
h✝² : i = i'
h✝¹ : ¬j = j'
h✝ : ¬k = k'
⊢ 1 * (0 * 0) = 0
[PROOFSTEP]
simp
[GOAL]
case pos
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
M' : Type u_5
N' : Type u_6
ι : Type u_7
κ : Type u_8
τ : Type u_9
ι' : Type u_10
κ' : Type u_11
inst✝¹⁸ : DecidableEq ι
inst✝¹⁷ : DecidableEq κ
inst✝¹⁶ : DecidableEq τ
inst✝¹⁵ : Fintype ι
inst✝¹⁴ : Fintype κ
inst✝¹³ : Fintype τ
inst✝¹² : Fintype ι'
inst✝¹¹ : Fintype κ'
inst✝¹⁰ : CommRing R
inst✝⁹ : AddCommGroup M
inst✝⁸ : AddCommGroup N
inst✝⁷ : AddCommGroup P
inst✝⁶ : AddCommGroup M'
inst✝⁵ : AddCommGroup N'
inst✝⁴ : Module R M
inst✝³ : Module R N
inst✝² : Module R P
inst✝¹ : Module R M'
inst✝ : Module R N'
bM : Basis ι R M
bN : Basis κ R N
bP : Basis τ R P
bM' : Basis ι' R M'
bN' : Basis κ' R N'
i : ι
j : κ
k k' : τ
i' : ι
j' : κ
h✝² : ¬i = i'
h✝¹ : j = j'
h✝ : k = k'
⊢ 0 * (1 * 1) = 0
[PROOFSTEP]
simp
[GOAL]
case neg
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
M' : Type u_5
N' : Type u_6
ι : Type u_7
κ : Type u_8
τ : Type u_9
ι' : Type u_10
κ' : Type u_11
inst✝¹⁸ : DecidableEq ι
inst✝¹⁷ : DecidableEq κ
inst✝¹⁶ : DecidableEq τ
inst✝¹⁵ : Fintype ι
inst✝¹⁴ : Fintype κ
inst✝¹³ : Fintype τ
inst✝¹² : Fintype ι'
inst✝¹¹ : Fintype κ'
inst✝¹⁰ : CommRing R
inst✝⁹ : AddCommGroup M
inst✝⁸ : AddCommGroup N
inst✝⁷ : AddCommGroup P
inst✝⁶ : AddCommGroup M'
inst✝⁵ : AddCommGroup N'
inst✝⁴ : Module R M
inst✝³ : Module R N
inst✝² : Module R P
inst✝¹ : Module R M'
inst✝ : Module R N'
bM : Basis ι R M
bN : Basis κ R N
bP : Basis τ R P
bM' : Basis ι' R M'
bN' : Basis κ' R N'
i : ι
j : κ
k k' : τ
i' : ι
j' : κ
h✝² : ¬i = i'
h✝¹ : j = j'
h✝ : ¬k = k'
⊢ 0 * (1 * 0) = 0
[PROOFSTEP]
simp
[GOAL]
case pos
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
M' : Type u_5
N' : Type u_6
ι : Type u_7
κ : Type u_8
τ : Type u_9
ι' : Type u_10
κ' : Type u_11
inst✝¹⁸ : DecidableEq ι
inst✝¹⁷ : DecidableEq κ
inst✝¹⁶ : DecidableEq τ
inst✝¹⁵ : Fintype ι
inst✝¹⁴ : Fintype κ
inst✝¹³ : Fintype τ
inst✝¹² : Fintype ι'
inst✝¹¹ : Fintype κ'
inst✝¹⁰ : CommRing R
inst✝⁹ : AddCommGroup M
inst✝⁸ : AddCommGroup N
inst✝⁷ : AddCommGroup P
inst✝⁶ : AddCommGroup M'
inst✝⁵ : AddCommGroup N'
inst✝⁴ : Module R M
inst✝³ : Module R N
inst✝² : Module R P
inst✝¹ : Module R M'
inst✝ : Module R N'
bM : Basis ι R M
bN : Basis κ R N
bP : Basis τ R P
bM' : Basis ι' R M'
bN' : Basis κ' R N'
i : ι
j : κ
k k' : τ
i' : ι
j' : κ
h✝² : ¬i = i'
h✝¹ : ¬j = j'
h✝ : k = k'
⊢ 0 * (0 * 1) = 0
[PROOFSTEP]
simp
[GOAL]
case neg
R : Type u_1
M : Type u_2
N : Type u_3
P : Type u_4
M' : Type u_5
N' : Type u_6
ι : Type u_7
κ : Type u_8
τ : Type u_9
ι' : Type u_10
κ' : Type u_11
inst✝¹⁸ : DecidableEq ι
inst✝¹⁷ : DecidableEq κ
inst✝¹⁶ : DecidableEq τ
inst✝¹⁵ : Fintype ι
inst✝¹⁴ : Fintype κ
inst✝¹³ : Fintype τ
inst✝¹² : Fintype ι'
inst✝¹¹ : Fintype κ'
inst✝¹⁰ : CommRing R
inst✝⁹ : AddCommGroup M
inst✝⁸ : AddCommGroup N
inst✝⁷ : AddCommGroup P
inst✝⁶ : AddCommGroup M'
inst✝⁵ : AddCommGroup N'
inst✝⁴ : Module R M
inst✝³ : Module R N
inst✝² : Module R P
inst✝¹ : Module R M'
inst✝ : Module R N'
bM : Basis ι R M
bN : Basis κ R N
bP : Basis τ R P
bM' : Basis ι' R M'
bN' : Basis κ' R N'
i : ι
j : κ
k k' : τ
i' : ι
j' : κ
h✝² : ¬i = i'
h✝¹ : ¬j = j'
h✝ : ¬k = k'
⊢ 0 * (0 * 0) = 0
[PROOFSTEP]
simp