l3lab/ntp-mathlib huggingface dataset:
lemma Nondegenerate.flip {B : BilinForm K V} (hB : B.Nondegenerate) :
    B.flip.Nondegenerate := by
  

Proof state:
R : Type u_1
M : Type u_2
inst✝²¹ : Semiring R
inst✝²⁰ : AddCommMonoid M
inst✝¹⁹ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁸ : Ring R₁
inst✝¹⁷ : AddCommGroup M₁
inst✝¹⁶ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁵ : CommSemiring R₂
inst✝¹⁴ : AddCommMonoid M₂
inst✝¹³ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹² : CommRing R₃
inst✝¹¹ : AddCommGroup M₃
inst✝¹⁰ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁹ : Field K
inst✝⁸ : AddCommGroup V
inst✝⁷ : Module K V
M₂'✝ : Type u_11
M₂'' : Type u_12
inst✝⁶ : AddCommMonoid M₂'✝
inst✝⁵ : AddCommMonoid M₂''
inst✝⁴ : Module R₂ M₂'✝
inst✝³ : Module R₂ M₂''
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
M₂' : Type u_13
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB : Nondegenerate B
⊢ Nondegenerate (BilinForm.flip B)

Next tactic:
intro x hx
lemma Nondegenerate.flip {B : BilinForm K V} (hB : B.Nondegenerate) :
    B.flip.Nondegenerate := by
  intro x hx
  

Proof state:
R : Type u_1
M : Type u_2
inst✝²¹ : Semiring R
inst✝²⁰ : AddCommMonoid M
inst✝¹⁹ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁸ : Ring R₁
inst✝¹⁷ : AddCommGroup M₁
inst✝¹⁶ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁵ : CommSemiring R₂
inst✝¹⁴ : AddCommMonoid M₂
inst✝¹³ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹² : CommRing R₃
inst✝¹¹ : AddCommGroup M₃
inst✝¹⁰ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁹ : Field K
inst✝⁸ : AddCommGroup V
inst✝⁷ : Module K V
M₂'✝ : Type u_11
M₂'' : Type u_12
inst✝⁶ : AddCommMonoid M₂'✝
inst✝⁵ : AddCommMonoid M₂''
inst✝⁴ : Module R₂ M₂'✝
inst✝³ : Module R₂ M₂''
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
M₂' : Type u_13
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB : Nondegenerate B
x : V
hx : ∀ (n : V), bilin (BilinForm.flip B) x n = 0
⊢ x = 0

Next tactic:
apply (Module.evalEquiv K V).injective
lemma Nondegenerate.flip {B : BilinForm K V} (hB : B.Nondegenerate) :
    B.flip.Nondegenerate := by
  intro x hx
  apply (Module.evalEquiv K V).injective
  

Proof state:
case a
R : Type u_1
M : Type u_2
inst✝²¹ : Semiring R
inst✝²⁰ : AddCommMonoid M
inst✝¹⁹ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁸ : Ring R₁
inst✝¹⁷ : AddCommGroup M₁
inst✝¹⁶ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁵ : CommSemiring R₂
inst✝¹⁴ : AddCommMonoid M₂
inst✝¹³ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹² : CommRing R₃
inst✝¹¹ : AddCommGroup M₃
inst✝¹⁰ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁹ : Field K
inst✝⁸ : AddCommGroup V
inst✝⁷ : Module K V
M₂'✝ : Type u_11
M₂'' : Type u_12
inst✝⁶ : AddCommMonoid M₂'✝
inst✝⁵ : AddCommMonoid M₂''
inst✝⁴ : Module R₂ M₂'✝
inst✝³ : Module R₂ M₂''
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
M₂' : Type u_13
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB : Nondegenerate B
x : V
hx : ∀ (n : V), bilin (BilinForm.flip B) x n = 0
⊢ (Module.evalEquiv K V) x = (Module.evalEquiv K V) 0

Next tactic:
ext f
lemma Nondegenerate.flip {B : BilinForm K V} (hB : B.Nondegenerate) :
    B.flip.Nondegenerate := by
  intro x hx
  apply (Module.evalEquiv K V).injective
  ext f
  

Proof state:
case a.h
R : Type u_1
M : Type u_2
inst✝²¹ : Semiring R
inst✝²⁰ : AddCommMonoid M
inst✝¹⁹ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁸ : Ring R₁
inst✝¹⁷ : AddCommGroup M₁
inst✝¹⁶ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁵ : CommSemiring R₂
inst✝¹⁴ : AddCommMonoid M₂
inst✝¹³ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹² : CommRing R₃
inst✝¹¹ : AddCommGroup M₃
inst✝¹⁰ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁹ : Field K
inst✝⁸ : AddCommGroup V
inst✝⁷ : Module K V
M₂'✝ : Type u_11
M₂'' : Type u_12
inst✝⁶ : AddCommMonoid M₂'✝
inst✝⁵ : AddCommMonoid M₂''
inst✝⁴ : Module R₂ M₂'✝
inst✝³ : Module R₂ M₂''
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
M₂' : Type u_13
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB : Nondegenerate B
x : V
hx : ∀ (n : V), bilin (BilinForm.flip B) x n = 0
f : Module.Dual K V
⊢ ((Module.evalEquiv K V) x) f = ((Module.evalEquiv K V) 0) f

Next tactic:
obtain ⟨y, rfl⟩ := (B.toDual hB).surjective f
lemma Nondegenerate.flip {B : BilinForm K V} (hB : B.Nondegenerate) :
    B.flip.Nondegenerate := by
  intro x hx
  apply (Module.evalEquiv K V).injective
  ext f
  obtain ⟨y, rfl⟩ := (B.toDual hB).surjective f
  

Proof state:
case a.h.intro
R : Type u_1
M : Type u_2
inst✝²¹ : Semiring R
inst✝²⁰ : AddCommMonoid M
inst✝¹⁹ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁸ : Ring R₁
inst✝¹⁷ : AddCommGroup M₁
inst✝¹⁶ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁵ : CommSemiring R₂
inst✝¹⁴ : AddCommMonoid M₂
inst✝¹³ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹² : CommRing R₃
inst✝¹¹ : AddCommGroup M₃
inst✝¹⁰ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁹ : Field K
inst✝⁸ : AddCommGroup V
inst✝⁷ : Module K V
M₂'✝ : Type u_11
M₂'' : Type u_12
inst✝⁶ : AddCommMonoid M₂'✝
inst✝⁵ : AddCommMonoid M₂''
inst✝⁴ : Module R₂ M₂'✝
inst✝³ : Module R₂ M₂''
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
M₂' : Type u_13
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
inst✝ : FiniteDimensional K V
B : BilinForm K V
hB : Nondegenerate B
x : V
hx : ∀ (n : V), bilin (BilinForm.flip B) x n = 0
y : V
⊢ ((Module.evalEquiv K V) x) ((toDual B hB) y) = ((Module.evalEquiv K V) 0) ((toDual B hB) y)

Next tactic:
simpa using hx y
@[simp]
theorem dualBasis_repr_apply (B : BilinForm K V) (hB : B.Nondegenerate) (b : Basis ι K V) (x i) :
    (B.dualBasis hB b).repr x i = B x (b i) := by
  

Proof state:
R : Type u_1
M : Type u_2
inst✝²³ : Semiring R
inst✝²² : AddCommMonoid M
inst✝²¹ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝²⁰ : Ring R₁
inst✝¹⁹ : AddCommGroup M₁
inst✝¹⁸ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁷ : CommSemiring R₂
inst✝¹⁶ : AddCommMonoid M₂
inst✝¹⁵ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹⁴ : CommRing R₃
inst✝¹³ : AddCommGroup M₃
inst✝¹² : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝¹¹ : Field K
inst✝¹⁰ : AddCommGroup V
inst✝⁹ : Module K V
M₂'✝ : Type u_11
M₂'' : Type u_12
inst✝⁸ : AddCommMonoid M₂'✝
inst✝⁷ : AddCommMonoid M₂''
inst✝⁶ : Module R₂ M₂'✝
inst✝⁵ : Module R₂ M₂''
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
M₂' : Type u_13
inst✝⁴ : AddCommMonoid M₂'
inst✝³ : Module R₂ M₂'
inst✝² : FiniteDimensional K V
ι : Type u_14
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
B : BilinForm K V
hB : Nondegenerate B
b : Basis ι K V
x : V
i : ι
⊢ ((dualBasis B hB b).repr x) i = bilin B x (b i)

Next tactic:
rw [dualBasis, Basis.map_repr, LinearEquiv.symm_symm, LinearEquiv.trans_apply,
    Basis.dualBasis_repr, toDual_def]
theorem apply_dualBasis_left (B : BilinForm K V) (hB : B.Nondegenerate) (b : Basis ι K V) (i j) :
    B (B.dualBasis hB b i) (b j) = if j = i then 1 else 0 := by
  

Proof state:
R : Type u_1
M : Type u_2
inst✝²³ : Semiring R
inst✝²² : AddCommMonoid M
inst✝²¹ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝²⁰ : Ring R₁
inst✝¹⁹ : AddCommGroup M₁
inst✝¹⁸ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁷ : CommSemiring R₂
inst✝¹⁶ : AddCommMonoid M₂
inst✝¹⁵ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹⁴ : CommRing R₃
inst✝¹³ : AddCommGroup M₃
inst✝¹² : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝¹¹ : Field K
inst✝¹⁰ : AddCommGroup V
inst✝⁹ : Module K V
M₂'✝ : Type u_11
M₂'' : Type u_12
inst✝⁸ : AddCommMonoid M₂'✝
inst✝⁷ : AddCommMonoid M₂''
inst✝⁶ : Module R₂ M₂'✝
inst✝⁵ : Module R₂ M₂''
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
M₂' : Type u_13
inst✝⁴ : AddCommMonoid M₂'
inst✝³ : Module R₂ M₂'
inst✝² : FiniteDimensional K V
ι : Type u_14
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
B : BilinForm K V
hB : Nondegenerate B
b : Basis ι K V
i j : ι
⊢ bilin B ((dualBasis B hB b) i) (b j) = if j = i then 1 else 0

Next tactic:
have := FiniteDimensional.of_fintype_basis b
theorem apply_dualBasis_left (B : BilinForm K V) (hB : B.Nondegenerate) (b : Basis ι K V) (i j) :
    B (B.dualBasis hB b i) (b j) = if j = i then 1 else 0 := by
  have := FiniteDimensional.of_fintype_basis b
  

Proof state:
R : Type u_1
M : Type u_2
inst✝²³ : Semiring R
inst✝²² : AddCommMonoid M
inst✝²¹ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝²⁰ : Ring R₁
inst✝¹⁹ : AddCommGroup M₁
inst✝¹⁸ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁷ : CommSemiring R₂
inst✝¹⁶ : AddCommMonoid M₂
inst✝¹⁵ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹⁴ : CommRing R₃
inst✝¹³ : AddCommGroup M₃
inst✝¹² : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝¹¹ : Field K
inst✝¹⁰ : AddCommGroup V
inst✝⁹ : Module K V
M₂'✝ : Type u_11
M₂'' : Type u_12
inst✝⁸ : AddCommMonoid M₂'✝
inst✝⁷ : AddCommMonoid M₂''
inst✝⁶ : Module R₂ M₂'✝
inst✝⁵ : Module R₂ M₂''
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
M₂' : Type u_13
inst✝⁴ : AddCommMonoid M₂'
inst✝³ : Module R₂ M₂'
inst✝² : FiniteDimensional K V
ι : Type u_14
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
B : BilinForm K V
hB : Nondegenerate B
b : Basis ι K V
i j : ι
this : FiniteDimensional K V
⊢ bilin B ((dualBasis B hB b) i) (b j) = if j = i then 1 else 0

Next tactic:
rw [dualBasis, Basis.map_apply, Basis.coe_dualBasis, ← toDual_def hB,
    LinearEquiv.apply_symm_apply, Basis.coord_apply, Basis.repr_self, Finsupp.single_apply]
theorem apply_dualBasis_right (B : BilinForm K V) (hB : B.Nondegenerate) (sym : B.IsSymm)
    (b : Basis ι K V) (i j) : B (b i) (B.dualBasis hB b j) = if i = j then 1 else 0 := by
  

Proof state:
R : Type u_1
M : Type u_2
inst✝²³ : Semiring R
inst✝²² : AddCommMonoid M
inst✝²¹ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝²⁰ : Ring R₁
inst✝¹⁹ : AddCommGroup M₁
inst✝¹⁸ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁷ : CommSemiring R₂
inst✝¹⁶ : AddCommMonoid M₂
inst✝¹⁵ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹⁴ : CommRing R₃
inst✝¹³ : AddCommGroup M₃
inst✝¹² : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝¹¹ : Field K
inst✝¹⁰ : AddCommGroup V
inst✝⁹ : Module K V
M₂'✝ : Type u_11
M₂'' : Type u_12
inst✝⁸ : AddCommMonoid M₂'✝
inst✝⁷ : AddCommMonoid M₂''
inst✝⁶ : Module R₂ M₂'✝
inst✝⁵ : Module R₂ M₂''
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
M₂' : Type u_13
inst✝⁴ : AddCommMonoid M₂'
inst✝³ : Module R₂ M₂'
inst✝² : FiniteDimensional K V
ι : Type u_14
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
B : BilinForm K V
hB : Nondegenerate B
sym : IsSymm B
b : Basis ι K V
i j : ι
⊢ bilin B (b i) ((dualBasis B hB b) j) = if i = j then 1 else 0

Next tactic:
rw [sym, apply_dualBasis_left]
@[simp]
lemma dualBasis_dualBasis_flip (B : BilinForm K V) (hB : B.Nondegenerate) {ι}
    [Fintype ι] [DecidableEq ι] (b : Basis ι K V) :
    B.dualBasis hB (B.flip.dualBasis hB.flip b) = b := by
  

Proof state:
R : Type u_1
M : Type u_2
inst✝²⁵ : Semiring R
inst✝²⁴ : AddCommMonoid M
inst✝²³ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝²² : Ring R₁
inst✝²¹ : AddCommGroup M₁
inst✝²⁰ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁹ : CommSemiring R₂
inst✝¹⁸ : AddCommMonoid M₂
inst✝¹⁷ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹⁶ : CommRing R₃
inst✝¹⁵ : AddCommGroup M₃
inst✝¹⁴ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝¹³ : Field K
inst✝¹² : AddCommGroup V
inst✝¹¹ : Module K V
M₂'✝ : Type u_11
M₂'' : Type u_12
inst✝¹⁰ : AddCommMonoid M₂'✝
inst✝⁹ : AddCommMonoid M₂''
inst✝⁸ : Module R₂ M₂'✝
inst✝⁷ : Module R₂ M₂''
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
M₂' : Type u_13
inst✝⁶ : AddCommMonoid M₂'
inst✝⁵ : Module R₂ M₂'
inst✝⁴ : FiniteDimensional K V
ι✝ : Type u_14
inst✝³ : DecidableEq ι✝
inst✝² : Fintype ι✝
B : BilinForm K V
hB : Nondegenerate B
ι : Type u_15
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
b : Basis ι K V
⊢ dualBasis B hB (dualBasis (flip B) (_ : Nondegenerate (flip B)) b) = b

Next tactic:
ext i
@[simp]
lemma dualBasis_dualBasis_flip (B : BilinForm K V) (hB : B.Nondegenerate) {ι}
    [Fintype ι] [DecidableEq ι] (b : Basis ι K V) :
    B.dualBasis hB (B.flip.dualBasis hB.flip b) = b := by
  ext i
  

Proof state:
case a
R : Type u_1
M : Type u_2
inst✝²⁵ : Semiring R
inst✝²⁴ : AddCommMonoid M
inst✝²³ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝²² : Ring R₁
inst✝²¹ : AddCommGroup M₁
inst✝²⁰ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁹ : CommSemiring R₂
inst✝¹⁸ : AddCommMonoid M₂
inst✝¹⁷ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹⁶ : CommRing R₃
inst✝¹⁵ : AddCommGroup M₃
inst✝¹⁴ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝¹³ : Field K
inst✝¹² : AddCommGroup V
inst✝¹¹ : Module K V
M₂'✝ : Type u_11
M₂'' : Type u_12
inst✝¹⁰ : AddCommMonoid M₂'✝
inst✝⁹ : AddCommMonoid M₂''
inst✝⁸ : Module R₂ M₂'✝
inst✝⁷ : Module R₂ M₂''
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
M₂' : Type u_13
inst✝⁶ : AddCommMonoid M₂'
inst✝⁵ : Module R₂ M₂'
inst✝⁴ : FiniteDimensional K V
ι✝ : Type u_14
inst✝³ : DecidableEq ι✝
inst✝² : Fintype ι✝
B : BilinForm K V
hB : Nondegenerate B
ι : Type u_15
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
b : Basis ι K V
i : ι
⊢ (dualBasis B hB (dualBasis (flip B) (_ : Nondegenerate (flip B)) b)) i = b i

Next tactic:
refine LinearMap.ker_eq_bot.mp hB.ker_eq_bot ((B.flip.dualBasis hB.flip b).ext (fun j ↦ ?_))
@[simp]
lemma dualBasis_dualBasis_flip (B : BilinForm K V) (hB : B.Nondegenerate) {ι}
    [Fintype ι] [DecidableEq ι] (b : Basis ι K V) :
    B.dualBasis hB (B.flip.dualBasis hB.flip b) = b := by
  ext i
  refine LinearMap.ker_eq_bot.mp hB.ker_eq_bot ((B.flip.dualBasis hB.flip b).ext (fun j ↦ ?_))
  

Proof state:
case a
R : Type u_1
M : Type u_2
inst✝²⁵ : Semiring R
inst✝²⁴ : AddCommMonoid M
inst✝²³ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝²² : Ring R₁
inst✝²¹ : AddCommGroup M₁
inst✝²⁰ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁹ : CommSemiring R₂
inst✝¹⁸ : AddCommMonoid M₂
inst✝¹⁷ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹⁶ : CommRing R₃
inst✝¹⁵ : AddCommGroup M₃
inst✝¹⁴ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝¹³ : Field K
inst✝¹² : AddCommGroup V
inst✝¹¹ : Module K V
M₂'✝ : Type u_11
M₂'' : Type u_12
inst✝¹⁰ : AddCommMonoid M₂'✝
inst✝⁹ : AddCommMonoid M₂''
inst✝⁸ : Module R₂ M₂'✝
inst✝⁷ : Module R₂ M₂''
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
M₂' : Type u_13
inst✝⁶ : AddCommMonoid M₂'
inst✝⁵ : Module R₂ M₂'
inst✝⁴ : FiniteDimensional K V
ι✝ : Type u_14
inst✝³ : DecidableEq ι✝
inst✝² : Fintype ι✝
B : BilinForm K V
hB : Nondegenerate B
ι : Type u_15
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
b : Basis ι K V
i j : ι
⊢ ((toLin B) ((dualBasis B hB (dualBasis (flip B) (_ : Nondegenerate (flip B)) b)) i))
      ((dualBasis (flip B) (_ : Nondegenerate (flip B)) b) j) =
    ((toLin B) (b i)) ((dualBasis (flip B) (_ : Nondegenerate (flip B)) b) j)

Next tactic:
rw [toLin_apply, apply_dualBasis_left, toLin_apply, ← B.flip_apply (R₂ := K),
    apply_dualBasis_left]
@[simp]
lemma dualBasis_dualBasis_flip (B : BilinForm K V) (hB : B.Nondegenerate) {ι}
    [Fintype ι] [DecidableEq ι] (b : Basis ι K V) :
    B.dualBasis hB (B.flip.dualBasis hB.flip b) = b := by
  ext i
  refine LinearMap.ker_eq_bot.mp hB.ker_eq_bot ((B.flip.dualBasis hB.flip b).ext (fun j ↦ ?_))
  rw [toLin_apply, apply_dualBasis_left, toLin_apply, ← B.flip_apply (R₂ := K),
    apply_dualBasis_left]
  

Proof state:
case a
R : Type u_1
M : Type u_2
inst✝²⁵ : Semiring R
inst✝²⁴ : AddCommMonoid M
inst✝²³ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝²² : Ring R₁
inst✝²¹ : AddCommGroup M₁
inst✝²⁰ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁹ : CommSemiring R₂
inst✝¹⁸ : AddCommMonoid M₂
inst✝¹⁷ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹⁶ : CommRing R₃
inst✝¹⁵ : AddCommGroup M₃
inst✝¹⁴ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝¹³ : Field K
inst✝¹² : AddCommGroup V
inst✝¹¹ : Module K V
M₂'✝ : Type u_11
M₂'' : Type u_12
inst✝¹⁰ : AddCommMonoid M₂'✝
inst✝⁹ : AddCommMonoid M₂''
inst✝⁸ : Module R₂ M₂'✝
inst✝⁷ : Module R₂ M₂''
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
M₂' : Type u_13
inst✝⁶ : AddCommMonoid M₂'
inst✝⁵ : Module R₂ M₂'
inst✝⁴ : FiniteDimensional K V
ι✝ : Type u_14
inst✝³ : DecidableEq ι✝
inst✝² : Fintype ι✝
B : BilinForm K V
hB : Nondegenerate B
ι : Type u_15
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
b : Basis ι K V
i j : ι
⊢ (if j = i then 1 else 0) = if i = j then 1 else 0

Next tactic:
simp_rw [@eq_comm _ i j]
@[simp]
lemma dualBasis_dualBasis (B : BilinForm K V) (hB : B.Nondegenerate) (hB' : B.IsSymm) {ι}
    [Fintype ι] [DecidableEq ι] [FiniteDimensional K V] (b : Basis ι K V) :
    B.dualBasis hB (B.dualBasis hB b) = b := by
  

Proof state:
R : Type u_1
M : Type u_2
inst✝²⁶ : Semiring R
inst✝²⁵ : AddCommMonoid M
inst✝²⁴ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝²³ : Ring R₁
inst✝²² : AddCommGroup M₁
inst✝²¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝²⁰ : CommSemiring R₂
inst✝¹⁹ : AddCommMonoid M₂
inst✝¹⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹⁷ : CommRing R₃
inst✝¹⁶ : AddCommGroup M₃
inst✝¹⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝¹⁴ : Field K
inst✝¹³ : AddCommGroup V
inst✝¹² : Module K V
M₂'✝ : Type u_11
M₂'' : Type u_12
inst✝¹¹ : AddCommMonoid M₂'✝
inst✝¹⁰ : AddCommMonoid M₂''
inst✝⁹ : Module R₂ M₂'✝
inst✝⁸ : Module R₂ M₂''
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
M₂' : Type u_13
inst✝⁷ : AddCommMonoid M₂'
inst✝⁶ : Module R₂ M₂'
inst✝⁵ : FiniteDimensional K V
ι✝ : Type u_14
inst✝⁴ : DecidableEq ι✝
inst✝³ : Fintype ι✝
B : BilinForm K V
hB : Nondegenerate B
hB' : IsSymm B
ι : Type u_15
inst✝² : Fintype ι
inst✝¹ : DecidableEq ι
inst✝ : FiniteDimensional K V
b : Basis ι K V
⊢ dualBasis B hB (dualBasis B hB b) = b

Next tactic:
convert dualBasis_dualBasis_flip _ hB.flip b
@[simp]
lemma dualBasis_dualBasis (B : BilinForm K V) (hB : B.Nondegenerate) (hB' : B.IsSymm) {ι}
    [Fintype ι] [DecidableEq ι] [FiniteDimensional K V] (b : Basis ι K V) :
    B.dualBasis hB (B.dualBasis hB b) = b := by
  convert dualBasis_dualBasis_flip _ hB.flip b
  

Proof state:
case h.e'_2.h.e'_9
R : Type u_1
M : Type u_2
inst✝²⁶ : Semiring R
inst✝²⁵ : AddCommMonoid M
inst✝²⁴ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝²³ : Ring R₁
inst✝²² : AddCommGroup M₁
inst✝²¹ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝²⁰ : CommSemiring R₂
inst✝¹⁹ : AddCommMonoid M₂
inst✝¹⁸ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹⁷ : CommRing R₃
inst✝¹⁶ : AddCommGroup M₃
inst✝¹⁵ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝¹⁴ : Field K
inst✝¹³ : AddCommGroup V
inst✝¹² : Module K V
M₂'✝ : Type u_11
M₂'' : Type u_12
inst✝¹¹ : AddCommMonoid M₂'✝
inst✝¹⁰ : AddCommMonoid M₂''
inst✝⁹ : Module R₂ M₂'✝
inst✝⁸ : Module R₂ M₂''
B✝ : BilinForm R M
B₁ : BilinForm R₁ M₁
B₂ : BilinForm R₂ M₂
M₂' : Type u_13
inst✝⁷ : AddCommMonoid M₂'
inst✝⁶ : Module R₂ M₂'
inst✝⁵ : FiniteDimensional K V
ι✝ : Type u_14
inst✝⁴ : DecidableEq ι✝
inst✝³ : Fintype ι✝
B : BilinForm K V
hB : Nondegenerate B
hB' : IsSymm B
ι : Type u_15
inst✝² : Fintype ι
inst✝¹ : DecidableEq ι
inst✝ : FiniteDimensional K V
b : Basis ι K V
⊢ B = flip B

Next tactic:
rwa [eq_comm, ← isSymm_iff_flip]
theorem comp_symmCompOfNondegenerate_apply (B₁ : BilinForm K V) {B₂ : BilinForm K V}
    (b₂ : B₂.Nondegenerate) (v : V) :
    toLin B₂ (B₁.symmCompOfNondegenerate B₂ b₂ v) = toLin B₁ v := by
  

Proof state:
R : Type u_1
M : Type u_2
inst✝²¹ : Semiring R
inst✝²⁰ : AddCommMonoid M
inst✝¹⁹ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁸ : Ring R₁
inst✝¹⁷ : AddCommGroup M₁
inst✝¹⁶ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁵ : CommSemiring R₂
inst✝¹⁴ : AddCommMonoid M₂
inst✝¹³ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹² : CommRing R₃
inst✝¹¹ : AddCommGroup M₃
inst✝¹⁰ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁹ : Field K
inst✝⁸ : AddCommGroup V
inst✝⁷ : Module K V
M₂'✝ : Type u_11
M₂'' : Type u_12
inst✝⁶ : AddCommMonoid M₂'✝
inst✝⁵ : AddCommMonoid M₂''
inst✝⁴ : Module R₂ M₂'✝
inst✝³ : Module R₂ M₂''
B : BilinForm R M
B₁✝ : BilinForm R₁ M₁
B₂✝ : BilinForm R₂ M₂
M₂' : Type u_13
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
inst✝ : FiniteDimensional K V
B₁ B₂ : BilinForm K V
b₂ : Nondegenerate B₂
v : V
⊢ (toLin B₂) ((symmCompOfNondegenerate B₁ B₂ b₂) v) = (toLin B₁) v

Next tactic:
erw [symmCompOfNondegenerate, LinearEquiv.apply_symm_apply (B₂.toDual b₂) _]
@[simp]
theorem symmCompOfNondegenerate_left_apply (B₁ : BilinForm K V) {B₂ : BilinForm K V}
    (b₂ : B₂.Nondegenerate) (v w : V) : B₂ (symmCompOfNondegenerate B₁ B₂ b₂ w) v = B₁ w v := by
  

Proof state:
R : Type u_1
M : Type u_2
inst✝²¹ : Semiring R
inst✝²⁰ : AddCommMonoid M
inst✝¹⁹ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁸ : Ring R₁
inst✝¹⁷ : AddCommGroup M₁
inst✝¹⁶ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁵ : CommSemiring R₂
inst✝¹⁴ : AddCommMonoid M₂
inst✝¹³ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹² : CommRing R₃
inst✝¹¹ : AddCommGroup M₃
inst✝¹⁰ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁹ : Field K
inst✝⁸ : AddCommGroup V
inst✝⁷ : Module K V
M₂'✝ : Type u_11
M₂'' : Type u_12
inst✝⁶ : AddCommMonoid M₂'✝
inst✝⁵ : AddCommMonoid M₂''
inst✝⁴ : Module R₂ M₂'✝
inst✝³ : Module R₂ M₂''
B : BilinForm R M
B₁✝ : BilinForm R₁ M₁
B₂✝ : BilinForm R₂ M₂
M₂' : Type u_13
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
inst✝ : FiniteDimensional K V
B₁ B₂ : BilinForm K V
b₂ : Nondegenerate B₂
v w : V
⊢ bilin B₂ ((symmCompOfNondegenerate B₁ B₂ b₂) w) v = bilin B₁ w v

Next tactic:
conv_lhs => rw [← BilinForm.toLin_apply, comp_symmCompOfNondegenerate_apply]
@[simp]
theorem symmCompOfNondegenerate_left_apply (B₁ : BilinForm K V) {B₂ : BilinForm K V}
    (b₂ : B₂.Nondegenerate) (v w : V) : B₂ (symmCompOfNondegenerate B₁ B₂ b₂ w) v = B₁ w v := by
  conv_lhs => 

Proof state:
R : Type u_1
M : Type u_2
inst✝²¹ : Semiring R
inst✝²⁰ : AddCommMonoid M
inst✝¹⁹ : Module R M
R₁ : Type u_3
M₁ : Type u_4
inst✝¹⁸ : Ring R₁
inst✝¹⁷ : AddCommGroup M₁
inst✝¹⁶ : Module R₁ M₁
R₂ : Type u_5
M₂ : Type u_6
inst✝¹⁵ : CommSemiring R₂
inst✝¹⁴ : AddCommMonoid M₂
inst✝¹³ : Module R₂ M₂
R₃ : Type u_7
M₃ : Type u_8
inst✝¹² : CommRing R₃
inst✝¹¹ : AddCommGroup M₃
inst✝¹⁰ : Module R₃ M₃
V : Type u_9
K : Type u_10
inst✝⁹ : Field K
inst✝⁸ : AddCommGroup V
inst✝⁷ : Module K V
M₂'✝ : Type u_11
M₂'' : Type u_12
inst✝⁶ : AddCommMonoid M₂'✝
inst✝⁵ : AddCommMonoid M₂''
inst✝⁴ : Module R₂ M₂'✝
inst✝³ : Module R₂ M₂''
B : BilinForm R M
B₁✝ : BilinForm R₁ M₁
B₂✝ : BilinForm R₂ M₂
M₂' : Type u_13
inst✝² : AddCommMonoid M₂'
inst✝¹ : Module R₂ M₂'
inst✝ : FiniteDimensional K V
B₁ B₂ : BilinForm K V
b₂ : Nondegenerate B₂
v w : V
| bilin B₂ ((symmCompOfNondegenerate B₁ B₂ b₂) w) v

Next tactic:
rw [← BilinForm.toLin_apply, comp_symmCompOfNondegenerate_apply]
theorem QuasiconvexOn.sup [SemilatticeSup β] (hf : QuasiconvexOn 𝕜 s f)
    (hg : QuasiconvexOn 𝕜 s g) : QuasiconvexOn 𝕜 s (f ⊔ g) := by
  

Proof state:
𝕜 : Type u_1
E : Type u_2
F : Type u_3
β : Type u_4
inst✝⁴ : OrderedSemiring 𝕜
inst✝³ : AddCommMonoid E
inst✝² : AddCommMonoid F
inst✝¹ : SMul 𝕜 E
s : Set E
f g : E → β
inst✝ : SemilatticeSup β
hf : QuasiconvexOn 𝕜 s f
hg : QuasiconvexOn 𝕜 s g
⊢ QuasiconvexOn 𝕜 s (f ⊔ g)

Next tactic:
intro r
theorem QuasiconvexOn.sup [SemilatticeSup β] (hf : QuasiconvexOn 𝕜 s f)
    (hg : QuasiconvexOn 𝕜 s g) : QuasiconvexOn 𝕜 s (f ⊔ g) := by
  intro r
  

Proof state:
𝕜 : Type u_1
E : Type u_2
F : Type u_3
β : Type u_4
inst✝⁴ : OrderedSemiring 𝕜
inst✝³ : AddCommMonoid E
inst✝² : AddCommMonoid F
inst✝¹ : SMul 𝕜 E
s : Set E
f g : E → β
inst✝ : SemilatticeSup β
hf : QuasiconvexOn 𝕜 s f
hg : QuasiconvexOn 𝕜 s g
r : β
⊢ Convex 𝕜 {x | x ∈ s ∧ (f ⊔ g) x ≤ r}

Next tactic:
simp_rw [Pi.sup_def, sup_le_iff, Set.sep_and]
theorem QuasiconvexOn.sup [SemilatticeSup β] (hf : QuasiconvexOn 𝕜 s f)
    (hg : QuasiconvexOn 𝕜 s g) : QuasiconvexOn 𝕜 s (f ⊔ g) := by
  intro r
  simp_rw [Pi.sup_def, sup_le_iff, Set.sep_and]
  

Proof state:
𝕜 : Type u_1
E : Type u_2
F : Type u_3
β : Type u_4
inst✝⁴ : OrderedSemiring 𝕜
inst✝³ : AddCommMonoid E
inst✝² : AddCommMonoid F
inst✝¹ : SMul 𝕜 E
s : Set E
f g : E → β
inst✝ : SemilatticeSup β
hf : QuasiconvexOn 𝕜 s f
hg : QuasiconvexOn 𝕜 s g
r : β
⊢ Convex 𝕜 ({x | x ∈ s ∧ f x ≤ r} ∩ {x | x ∈ s ∧ g x ≤ r})

Next tactic:
exact (hf r).inter (hg r)