Theorem: IsPrimal.mul
File: Mathlib/Algebra/GroupWithZero/Divisibility.lean

tactic: obtain rfl | h0 := eq_or_ne m 0
state_before: α✝ : Type u_1
inst✝¹ : MonoidWithZero α✝
α : Type u_2
inst✝ : CancelCommMonoidWithZero α
m n : α
hm : IsPrimal m
hn : IsPrimal n
⊢ IsPrimal (m * n)
state_after: case inl
α✝ : Type u_1
inst✝¹ : MonoidWithZero α✝
α : Type u_2
inst✝ : CancelCommMonoidWithZero α
n : α
hn : IsPrimal n
hm : IsPrimal 0
⊢ IsPrimal (0 * n)

case inr
α✝ : Type u_1
inst✝¹ : MonoidWithZero α✝
α : Type u_2
inst✝ : CancelCommMonoidWithZero α
m n : α
hm : IsPrimal m
hn : IsPrimal n
h0 : m ≠ 0
⊢ IsPrimal (m * n)

tactic: intro b c h
state_before: case inr
α✝ : Type u_1
inst✝¹ : MonoidWithZero α✝
α : Type u_2
inst✝ : CancelCommMonoidWithZero α
m n : α
hm : IsPrimal m
hn : IsPrimal n
h0 : m ≠ 0
⊢ IsPrimal (m * n)
state_after: case inr
α✝ : Type u_1
inst✝¹ : MonoidWithZero α✝
α : Type u_2
inst✝ : CancelCommMonoidWithZero α
m n : α
hm : IsPrimal m
hn : IsPrimal n
h0 : m ≠ 0
b c : α
h : m * n ∣ b * c
⊢ ∃ a₁ a₂, a₁ ∣ b ∧ a₂ ∣ c ∧ m * n = a₁ * a₂

tactic: obtain ⟨a₁, a₂, ⟨b, rfl⟩, ⟨c, rfl⟩, rfl⟩ := hm (dvd_of_mul_right_dvd h)
state_before: case inr
α✝ : Type u_1
inst✝¹ : MonoidWithZero α✝
α : Type u_2
inst✝ : CancelCommMonoidWithZero α
m n : α
hm : IsPrimal m
hn : IsPrimal n
h0 : m ≠ 0
b c : α
h : m * n ∣ b * c
⊢ ∃ a₁ a₂, a₁ ∣ b ∧ a₂ ∣ c ∧ m * n = a₁ * a₂
state_after: case inr.intro.intro.intro.intro.intro.intro
α✝ : Type u_1
inst✝¹ : MonoidWithZero α✝
α : Type u_2
inst✝ : CancelCommMonoidWithZero α
n : α
hn : IsPrimal n
a₁ a₂ b c : α
hm : IsPrimal (a₁ * a₂)
h0 : a₁ * a₂ ≠ 0
h : a₁ * a₂ * n ∣ a₁ * b * (a₂ * c)
⊢ ∃ a₁_1 a₂_1, a₁_1 ∣ a₁ * b ∧ a₂_1 ∣ a₂ * c ∧ a₁ * a₂ * n = a₁_1 * a₂_1

tactic: rw [mul_mul_mul_comm, mul_dvd_mul_iff_left h0] at h
state_before: case inr.intro.intro.intro.intro.intro.intro
α✝ : Type u_1
inst✝¹ : MonoidWithZero α✝
α : Type u_2
inst✝ : CancelCommMonoidWithZero α
n : α
hn : IsPrimal n
a₁ a₂ b c : α
hm : IsPrimal (a₁ * a₂)
h0 : a₁ * a₂ ≠ 0
h : a₁ * a₂ * n ∣ a₁ * b * (a₂ * c)
⊢ ∃ a₁_1 a₂_1, a₁_1 ∣ a₁ * b ∧ a₂_1 ∣ a₂ * c ∧ a₁ * a₂ * n = a₁_1 * a₂_1
state_after: case inr.intro.intro.intro.intro.intro.intro
α✝ : Type u_1
inst✝¹ : MonoidWithZero α✝
α : Type u_2
inst✝ : CancelCommMonoidWithZero α
n : α
hn : IsPrimal n
a₁ a₂ b c : α
hm : IsPrimal (a₁ * a₂)
h0 : a₁ * a₂ ≠ 0
h : n ∣ b * c
⊢ ∃ a₁_1 a₂_1, a₁_1 ∣ a₁ * b ∧ a₂_1 ∣ a₂ * c ∧ a₁ * a₂ * n = a₁_1 * a₂_1

tactic: obtain ⟨a₁', a₂', h₁, h₂, rfl⟩ := hn h
state_before: case inr.intro.intro.intro.intro.intro.intro
α✝ : Type u_1
inst✝¹ : MonoidWithZero α✝
α : Type u_2
inst✝ : CancelCommMonoidWithZero α
n : α
hn : IsPrimal n
a₁ a₂ b c : α
hm : IsPrimal (a₁ * a₂)
h0 : a₁ * a₂ ≠ 0
h : n ∣ b * c
⊢ ∃ a₁_1 a₂_1, a₁_1 ∣ a₁ * b ∧ a₂_1 ∣ a₂ * c ∧ a₁ * a₂ * n = a₁_1 * a₂_1
state_after: case inr.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
α✝ : Type u_1
inst✝¹ : MonoidWithZero α✝
α : Type u_2
inst✝ : CancelCommMonoidWithZero α
a₁ a₂ b c : α
hm : IsPrimal (a₁ * a₂)
h0 : a₁ * a₂ ≠ 0
a₁' a₂' : α
h₁ : a₁' ∣ b
h₂ : a₂' ∣ c
hn : IsPrimal (a₁' * a₂')
h : a₁' * a₂' ∣ b * c
⊢ ∃ a₁_1 a₂_1, a₁_1 ∣ a₁ * b ∧ a₂_1 ∣ a₂ * c ∧ a₁ * a₂ * (a₁' * a₂') = a₁_1 * a₂_1

tactic: exact ⟨a₁ * a₁', a₂ * a₂', mul_dvd_mul_left _ h₁, mul_dvd_mul_left _ h₂, mul_mul_mul_comm _ _ _ _⟩
state_before: case inr.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
α✝ : Type u_1
inst✝¹ : MonoidWithZero α✝
α : Type u_2
inst✝ : CancelCommMonoidWithZero α
a₁ a₂ b c : α
hm : IsPrimal (a₁ * a₂)
h0 : a₁ * a₂ ≠ 0
a₁' a₂' : α
h₁ : a₁' ∣ b
h₂ : a₂' ∣ c
hn : IsPrimal (a₁' * a₂')
h : a₁' * a₂' ∣ b * c
⊢ ∃ a₁_1 a₂_1, a₁_1 ∣ a₁ * b ∧ a₂_1 ∣ a₂ * c ∧ a₁ * a₂ * (a₁' * a₂') = a₁_1 * a₂_1
state_after: no goals

tactic: rwa [zero_mul]
state_before: case inl
α✝ : Type u_1
inst✝¹ : MonoidWithZero α✝
α : Type u_2
inst✝ : CancelCommMonoidWithZero α
n : α
hn : IsPrimal n
hm : IsPrimal 0
⊢ IsPrimal (0 * n)
state_after: no goals