Theorem: QuadraticForm.nonneg_prod_iff
File: Mathlib/LinearAlgebra/QuadraticForm/Prod.lean

tactic: simp_rw [Prod.forall, prod_apply]
state_before: ι : Type u_1
R✝ : Type u_2
M₁ : Type u_3
M₂ : Type u_4
N₁ : Type u_5
N₂ : Type u_6
Mᵢ : ι → Type u_7
Nᵢ : ι → Type u_8
inst✝¹¹ : CommSemiring R✝
inst✝¹⁰ : AddCommMonoid M₁
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid N₁
inst✝⁷ : AddCommMonoid N₂
inst✝⁶ : Module R✝ M₁
inst✝⁵ : Module R✝ M₂
inst✝⁴ : Module R✝ N₁
inst✝³ : Module R✝ N₂
R : Type u_9
inst✝² : OrderedCommRing R
inst✝¹ : Module R M₁
inst✝ : Module R M₂
Q₁ : QuadraticForm R M₁
Q₂ : QuadraticForm R M₂
⊢ (∀ (x : M₁ × M₂), 0 ≤ (Q₁.prod Q₂) x) ↔ (∀ (x : M₁), 0 ≤ Q₁ x) ∧ ∀ (x : M₂), 0 ≤ Q₂ x
state_after: ι : Type u_1
R✝ : Type u_2
M₁ : Type u_3
M₂ : Type u_4
N₁ : Type u_5
N₂ : Type u_6
Mᵢ : ι → Type u_7
Nᵢ : ι → Type u_8
inst✝¹¹ : CommSemiring R✝
inst✝¹⁰ : AddCommMonoid M₁
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid N₁
inst✝⁷ : AddCommMonoid N₂
inst✝⁶ : Module R✝ M₁
inst✝⁵ : Module R✝ M₂
inst✝⁴ : Module R✝ N₁
inst✝³ : Module R✝ N₂
R : Type u_9
inst✝² : OrderedCommRing R
inst✝¹ : Module R M₁
inst✝ : Module R M₂
Q₁ : QuadraticForm R M₁
Q₂ : QuadraticForm R M₂
⊢ (∀ (a : M₁) (b : M₂), 0 ≤ Q₁ a + Q₂ b) ↔ (∀ (x : M₁), 0 ≤ Q₁ x) ∧ ∀ (x : M₂), 0 ≤ Q₂ x

tactic: constructor
state_before: ι : Type u_1
R✝ : Type u_2
M₁ : Type u_3
M₂ : Type u_4
N₁ : Type u_5
N₂ : Type u_6
Mᵢ : ι → Type u_7
Nᵢ : ι → Type u_8
inst✝¹¹ : CommSemiring R✝
inst✝¹⁰ : AddCommMonoid M₁
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid N₁
inst✝⁷ : AddCommMonoid N₂
inst✝⁶ : Module R✝ M₁
inst✝⁵ : Module R✝ M₂
inst✝⁴ : Module R✝ N₁
inst✝³ : Module R✝ N₂
R : Type u_9
inst✝² : OrderedCommRing R
inst✝¹ : Module R M₁
inst✝ : Module R M₂
Q₁ : QuadraticForm R M₁
Q₂ : QuadraticForm R M₂
⊢ (∀ (a : M₁) (b : M₂), 0 ≤ Q₁ a + Q₂ b) ↔ (∀ (x : M₁), 0 ≤ Q₁ x) ∧ ∀ (x : M₂), 0 ≤ Q₂ x
state_after: case mp
ι : Type u_1
R✝ : Type u_2
M₁ : Type u_3
M₂ : Type u_4
N₁ : Type u_5
N₂ : Type u_6
Mᵢ : ι → Type u_7
Nᵢ : ι → Type u_8
inst✝¹¹ : CommSemiring R✝
inst✝¹⁰ : AddCommMonoid M₁
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid N₁
inst✝⁷ : AddCommMonoid N₂
inst✝⁶ : Module R✝ M₁
inst✝⁵ : Module R✝ M₂
inst✝⁴ : Module R✝ N₁
inst✝³ : Module R✝ N₂
R : Type u_9
inst✝² : OrderedCommRing R
inst✝¹ : Module R M₁
inst✝ : Module R M₂
Q₁ : QuadraticForm R M₁
Q₂ : QuadraticForm R M₂
⊢ (∀ (a : M₁) (b : M₂), 0 ≤ Q₁ a + Q₂ b) → (∀ (x : M₁), 0 ≤ Q₁ x) ∧ ∀ (x : M₂), 0 ≤ Q₂ x

case mpr
ι : Type u_1
R✝ : Type u_2
M₁ : Type u_3
M₂ : Type u_4
N₁ : Type u_5
N₂ : Type u_6
Mᵢ : ι → Type u_7
Nᵢ : ι → Type u_8
inst✝¹¹ : CommSemiring R✝
inst✝¹⁰ : AddCommMonoid M₁
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid N₁
inst✝⁷ : AddCommMonoid N₂
inst✝⁶ : Module R✝ M₁
inst✝⁵ : Module R✝ M₂
inst✝⁴ : Module R✝ N₁
inst✝³ : Module R✝ N₂
R : Type u_9
inst✝² : OrderedCommRing R
inst✝¹ : Module R M₁
inst✝ : Module R M₂
Q₁ : QuadraticForm R M₁
Q₂ : QuadraticForm R M₂
⊢ ((∀ (x : M₁), 0 ≤ Q₁ x) ∧ ∀ (x : M₂), 0 ≤ Q₂ x) → ∀ (a : M₁) (b : M₂), 0 ≤ Q₁ a + Q₂ b

tactic: intro h
state_before: case mp
ι : Type u_1
R✝ : Type u_2
M₁ : Type u_3
M₂ : Type u_4
N₁ : Type u_5
N₂ : Type u_6
Mᵢ : ι → Type u_7
Nᵢ : ι → Type u_8
inst✝¹¹ : CommSemiring R✝
inst✝¹⁰ : AddCommMonoid M₁
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid N₁
inst✝⁷ : AddCommMonoid N₂
inst✝⁶ : Module R✝ M₁
inst✝⁵ : Module R✝ M₂
inst✝⁴ : Module R✝ N₁
inst✝³ : Module R✝ N₂
R : Type u_9
inst✝² : OrderedCommRing R
inst✝¹ : Module R M₁
inst✝ : Module R M₂
Q₁ : QuadraticForm R M₁
Q₂ : QuadraticForm R M₂
⊢ (∀ (a : M₁) (b : M₂), 0 ≤ Q₁ a + Q₂ b) → (∀ (x : M₁), 0 ≤ Q₁ x) ∧ ∀ (x : M₂), 0 ≤ Q₂ x
state_after: case mp
ι : Type u_1
R✝ : Type u_2
M₁ : Type u_3
M₂ : Type u_4
N₁ : Type u_5
N₂ : Type u_6
Mᵢ : ι → Type u_7
Nᵢ : ι → Type u_8
inst✝¹¹ : CommSemiring R✝
inst✝¹⁰ : AddCommMonoid M₁
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid N₁
inst✝⁷ : AddCommMonoid N₂
inst✝⁶ : Module R✝ M₁
inst✝⁵ : Module R✝ M₂
inst✝⁴ : Module R✝ N₁
inst✝³ : Module R✝ N₂
R : Type u_9
inst✝² : OrderedCommRing R
inst✝¹ : Module R M₁
inst✝ : Module R M₂
Q₁ : QuadraticForm R M₁
Q₂ : QuadraticForm R M₂
h : ∀ (a : M₁) (b : M₂), 0 ≤ Q₁ a + Q₂ b
⊢ (∀ (x : M₁), 0 ≤ Q₁ x) ∧ ∀ (x : M₂), 0 ≤ Q₂ x

tactic: constructor
state_before: case mp
ι : Type u_1
R✝ : Type u_2
M₁ : Type u_3
M₂ : Type u_4
N₁ : Type u_5
N₂ : Type u_6
Mᵢ : ι → Type u_7
Nᵢ : ι → Type u_8
inst✝¹¹ : CommSemiring R✝
inst✝¹⁰ : AddCommMonoid M₁
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid N₁
inst✝⁷ : AddCommMonoid N₂
inst✝⁶ : Module R✝ M₁
inst✝⁵ : Module R✝ M₂
inst✝⁴ : Module R✝ N₁
inst✝³ : Module R✝ N₂
R : Type u_9
inst✝² : OrderedCommRing R
inst✝¹ : Module R M₁
inst✝ : Module R M₂
Q₁ : QuadraticForm R M₁
Q₂ : QuadraticForm R M₂
h : ∀ (a : M₁) (b : M₂), 0 ≤ Q₁ a + Q₂ b
⊢ (∀ (x : M₁), 0 ≤ Q₁ x) ∧ ∀ (x : M₂), 0 ≤ Q₂ x
state_after: case mp.left
ι : Type u_1
R✝ : Type u_2
M₁ : Type u_3
M₂ : Type u_4
N₁ : Type u_5
N₂ : Type u_6
Mᵢ : ι → Type u_7
Nᵢ : ι → Type u_8
inst✝¹¹ : CommSemiring R✝
inst✝¹⁰ : AddCommMonoid M₁
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid N₁
inst✝⁷ : AddCommMonoid N₂
inst✝⁶ : Module R✝ M₁
inst✝⁵ : Module R✝ M₂
inst✝⁴ : Module R✝ N₁
inst✝³ : Module R✝ N₂
R : Type u_9
inst✝² : OrderedCommRing R
inst✝¹ : Module R M₁
inst✝ : Module R M₂
Q₁ : QuadraticForm R M₁
Q₂ : QuadraticForm R M₂
h : ∀ (a : M₁) (b : M₂), 0 ≤ Q₁ a + Q₂ b
⊢ ∀ (x : M₁), 0 ≤ Q₁ x

case mp.right
ι : Type u_1
R✝ : Type u_2
M₁ : Type u_3
M₂ : Type u_4
N₁ : Type u_5
N₂ : Type u_6
Mᵢ : ι → Type u_7
Nᵢ : ι → Type u_8
inst✝¹¹ : CommSemiring R✝
inst✝¹⁰ : AddCommMonoid M₁
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid N₁
inst✝⁷ : AddCommMonoid N₂
inst✝⁶ : Module R✝ M₁
inst✝⁵ : Module R✝ M₂
inst✝⁴ : Module R✝ N₁
inst✝³ : Module R✝ N₂
R : Type u_9
inst✝² : OrderedCommRing R
inst✝¹ : Module R M₁
inst✝ : Module R M₂
Q₁ : QuadraticForm R M₁
Q₂ : QuadraticForm R M₂
h : ∀ (a : M₁) (b : M₂), 0 ≤ Q₁ a + Q₂ b
⊢ ∀ (x : M₂), 0 ≤ Q₂ x

tactic: intro x
state_before: case mp.left
ι : Type u_1
R✝ : Type u_2
M₁ : Type u_3
M₂ : Type u_4
N₁ : Type u_5
N₂ : Type u_6
Mᵢ : ι → Type u_7
Nᵢ : ι → Type u_8
inst✝¹¹ : CommSemiring R✝
inst✝¹⁰ : AddCommMonoid M₁
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid N₁
inst✝⁷ : AddCommMonoid N₂
inst✝⁶ : Module R✝ M₁
inst✝⁵ : Module R✝ M₂
inst✝⁴ : Module R✝ N₁
inst✝³ : Module R✝ N₂
R : Type u_9
inst✝² : OrderedCommRing R
inst✝¹ : Module R M₁
inst✝ : Module R M₂
Q₁ : QuadraticForm R M₁
Q₂ : QuadraticForm R M₂
h : ∀ (a : M₁) (b : M₂), 0 ≤ Q₁ a + Q₂ b
⊢ ∀ (x : M₁), 0 ≤ Q₁ x
state_after: case mp.left
ι : Type u_1
R✝ : Type u_2
M₁ : Type u_3
M₂ : Type u_4
N₁ : Type u_5
N₂ : Type u_6
Mᵢ : ι → Type u_7
Nᵢ : ι → Type u_8
inst✝¹¹ : CommSemiring R✝
inst✝¹⁰ : AddCommMonoid M₁
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid N₁
inst✝⁷ : AddCommMonoid N₂
inst✝⁶ : Module R✝ M₁
inst✝⁵ : Module R✝ M₂
inst✝⁴ : Module R✝ N₁
inst✝³ : Module R✝ N₂
R : Type u_9
inst✝² : OrderedCommRing R
inst✝¹ : Module R M₁
inst✝ : Module R M₂
Q₁ : QuadraticForm R M₁
Q₂ : QuadraticForm R M₂
h : ∀ (a : M₁) (b : M₂), 0 ≤ Q₁ a + Q₂ b
x : M₁
⊢ 0 ≤ Q₁ x

tactic: simpa only [add_zero, map_zero] using h x 0
state_before: case mp.left
ι : Type u_1
R✝ : Type u_2
M₁ : Type u_3
M₂ : Type u_4
N₁ : Type u_5
N₂ : Type u_6
Mᵢ : ι → Type u_7
Nᵢ : ι → Type u_8
inst✝¹¹ : CommSemiring R✝
inst✝¹⁰ : AddCommMonoid M₁
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid N₁
inst✝⁷ : AddCommMonoid N₂
inst✝⁶ : Module R✝ M₁
inst✝⁵ : Module R✝ M₂
inst✝⁴ : Module R✝ N₁
inst✝³ : Module R✝ N₂
R : Type u_9
inst✝² : OrderedCommRing R
inst✝¹ : Module R M₁
inst✝ : Module R M₂
Q₁ : QuadraticForm R M₁
Q₂ : QuadraticForm R M₂
h : ∀ (a : M₁) (b : M₂), 0 ≤ Q₁ a + Q₂ b
x : M₁
⊢ 0 ≤ Q₁ x
state_after: no goals

tactic: intro x
state_before: case mp.right
ι : Type u_1
R✝ : Type u_2
M₁ : Type u_3
M₂ : Type u_4
N₁ : Type u_5
N₂ : Type u_6
Mᵢ : ι → Type u_7
Nᵢ : ι → Type u_8
inst✝¹¹ : CommSemiring R✝
inst✝¹⁰ : AddCommMonoid M₁
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid N₁
inst✝⁷ : AddCommMonoid N₂
inst✝⁶ : Module R✝ M₁
inst✝⁵ : Module R✝ M₂
inst✝⁴ : Module R✝ N₁
inst✝³ : Module R✝ N₂
R : Type u_9
inst✝² : OrderedCommRing R
inst✝¹ : Module R M₁
inst✝ : Module R M₂
Q₁ : QuadraticForm R M₁
Q₂ : QuadraticForm R M₂
h : ∀ (a : M₁) (b : M₂), 0 ≤ Q₁ a + Q₂ b
⊢ ∀ (x : M₂), 0 ≤ Q₂ x
state_after: case mp.right
ι : Type u_1
R✝ : Type u_2
M₁ : Type u_3
M₂ : Type u_4
N₁ : Type u_5
N₂ : Type u_6
Mᵢ : ι → Type u_7
Nᵢ : ι → Type u_8
inst✝¹¹ : CommSemiring R✝
inst✝¹⁰ : AddCommMonoid M₁
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid N₁
inst✝⁷ : AddCommMonoid N₂
inst✝⁶ : Module R✝ M₁
inst✝⁵ : Module R✝ M₂
inst✝⁴ : Module R✝ N₁
inst✝³ : Module R✝ N₂
R : Type u_9
inst✝² : OrderedCommRing R
inst✝¹ : Module R M₁
inst✝ : Module R M₂
Q₁ : QuadraticForm R M₁
Q₂ : QuadraticForm R M₂
h : ∀ (a : M₁) (b : M₂), 0 ≤ Q₁ a + Q₂ b
x : M₂
⊢ 0 ≤ Q₂ x

tactic: simpa only [zero_add, map_zero] using h 0 x
state_before: case mp.right
ι : Type u_1
R✝ : Type u_2
M₁ : Type u_3
M₂ : Type u_4
N₁ : Type u_5
N₂ : Type u_6
Mᵢ : ι → Type u_7
Nᵢ : ι → Type u_8
inst✝¹¹ : CommSemiring R✝
inst✝¹⁰ : AddCommMonoid M₁
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid N₁
inst✝⁷ : AddCommMonoid N₂
inst✝⁶ : Module R✝ M₁
inst✝⁵ : Module R✝ M₂
inst✝⁴ : Module R✝ N₁
inst✝³ : Module R✝ N₂
R : Type u_9
inst✝² : OrderedCommRing R
inst✝¹ : Module R M₁
inst✝ : Module R M₂
Q₁ : QuadraticForm R M₁
Q₂ : QuadraticForm R M₂
h : ∀ (a : M₁) (b : M₂), 0 ≤ Q₁ a + Q₂ b
x : M₂
⊢ 0 ≤ Q₂ x
state_after: no goals

tactic: rintro ⟨h₁, h₂⟩ x₁ x₂
state_before: case mpr
ι : Type u_1
R✝ : Type u_2
M₁ : Type u_3
M₂ : Type u_4
N₁ : Type u_5
N₂ : Type u_6
Mᵢ : ι → Type u_7
Nᵢ : ι → Type u_8
inst✝¹¹ : CommSemiring R✝
inst✝¹⁰ : AddCommMonoid M₁
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid N₁
inst✝⁷ : AddCommMonoid N₂
inst✝⁶ : Module R✝ M₁
inst✝⁵ : Module R✝ M₂
inst✝⁴ : Module R✝ N₁
inst✝³ : Module R✝ N₂
R : Type u_9
inst✝² : OrderedCommRing R
inst✝¹ : Module R M₁
inst✝ : Module R M₂
Q₁ : QuadraticForm R M₁
Q₂ : QuadraticForm R M₂
⊢ ((∀ (x : M₁), 0 ≤ Q₁ x) ∧ ∀ (x : M₂), 0 ≤ Q₂ x) → ∀ (a : M₁) (b : M₂), 0 ≤ Q₁ a + Q₂ b
state_after: case mpr.intro
ι : Type u_1
R✝ : Type u_2
M₁ : Type u_3
M₂ : Type u_4
N₁ : Type u_5
N₂ : Type u_6
Mᵢ : ι → Type u_7
Nᵢ : ι → Type u_8
inst✝¹¹ : CommSemiring R✝
inst✝¹⁰ : AddCommMonoid M₁
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid N₁
inst✝⁷ : AddCommMonoid N₂
inst✝⁶ : Module R✝ M₁
inst✝⁵ : Module R✝ M₂
inst✝⁴ : Module R✝ N₁
inst✝³ : Module R✝ N₂
R : Type u_9
inst✝² : OrderedCommRing R
inst✝¹ : Module R M₁
inst✝ : Module R M₂
Q₁ : QuadraticForm R M₁
Q₂ : QuadraticForm R M₂
h₁ : ∀ (x : M₁), 0 ≤ Q₁ x
h₂ : ∀ (x : M₂), 0 ≤ Q₂ x
x₁ : M₁
x₂ : M₂
⊢ 0 ≤ Q₁ x₁ + Q₂ x₂

tactic: exact add_nonneg (h₁ x₁) (h₂ x₂)
state_before: case mpr.intro
ι : Type u_1
R✝ : Type u_2
M₁ : Type u_3
M₂ : Type u_4
N₁ : Type u_5
N₂ : Type u_6
Mᵢ : ι → Type u_7
Nᵢ : ι → Type u_8
inst✝¹¹ : CommSemiring R✝
inst✝¹⁰ : AddCommMonoid M₁
inst✝⁹ : AddCommMonoid M₂
inst✝⁸ : AddCommMonoid N₁
inst✝⁷ : AddCommMonoid N₂
inst✝⁶ : Module R✝ M₁
inst✝⁵ : Module R✝ M₂
inst✝⁴ : Module R✝ N₁
inst✝³ : Module R✝ N₂
R : Type u_9
inst✝² : OrderedCommRing R
inst✝¹ : Module R M₁
inst✝ : Module R M₂
Q₁ : QuadraticForm R M₁
Q₂ : QuadraticForm R M₂
h₁ : ∀ (x : M₁), 0 ≤ Q₁ x
h₂ : ∀ (x : M₂), 0 ≤ Q₂ x
x₁ : M₁
x₂ : M₂
⊢ 0 ≤ Q₁ x₁ + Q₂ x₂
state_after: no goals