Theorem: ModP.preVal_mul
File: Mathlib/RingTheory/Perfection.lean

Proof steps:
state_before: K : Type u₁
inst✝² : Field K
v : Valuation K ℝ≥0
O : Type u₂
inst✝¹ : CommRing O
inst✝ : Algebra O K
hv : v.Integers O
p : ℕ
hp : Fact (Nat.Prime p)
hvp : Fact (v ↑p ≠ 1)
x y : ModP K v O hv p
hxy0 : x * y ≠ 0
⊢ preVal K v O hv p (x * y) = preVal K v O hv p x * preVal K v O hv p y
state_after: K : Type u₁
inst✝² : Field K
v : Valuation K ℝ≥0
O : Type u₂
inst✝¹ : CommRing O
inst✝ : Algebra O K
hv : v.Integers O
p : ℕ
hp : Fact (Nat.Prime p)
hvp : Fact (v ↑p ≠ 1)
x y : ModP K v O hv p
hxy0 : x * y ≠ 0
hx0 : x ≠ 0
⊢ preVal K v O hv p (x * y) = preVal K v O hv p x * preVal K v O hv p y
tactic: have hx0 : x ≠ 0 := mt (by rintro rfl; rw [zero_mul]) hxy0
state_before: K : Type u₁
inst✝² : Field K
v : Valuation K ℝ≥0
O : Type u₂
inst✝¹ : CommRing O
inst✝ : Algebra O K
hv : v.Integers O
p : ℕ
hp : Fact (Nat.Prime p)
hvp : Fact (v ↑p ≠ 1)
x y : ModP K v O hv p
hxy0 : x * y ≠ 0
hx0 : x ≠ 0
⊢ preVal K v O hv p (x * y) = preVal K v O hv p x * preVal K v O hv p y
state_after: K : Type u₁
inst✝² : Field K
v : Valuation K ℝ≥0
O : Type u₂
inst✝¹ : CommRing O
inst✝ : Algebra O K
hv : v.Integers O
p : ℕ
hp : Fact (Nat.Prime p)
hvp : Fact (v ↑p ≠ 1)
x y : ModP K v O hv p
hxy0 : x * y ≠ 0
hx0 : x ≠ 0
hy0 : y ≠ 0
⊢ preVal K v O hv p (x * y) = preVal K v O hv p x * preVal K v O hv p y
tactic: have hy0 : y ≠ 0 := mt (by rintro rfl; rw [mul_zero]) hxy0
state_before: K : Type u₁
inst✝² : Field K
v : Valuation K ℝ≥0
O : Type u₂
inst✝¹ : CommRing O
inst✝ : Algebra O K
hv : v.Integers O
p : ℕ
hp : Fact (Nat.Prime p)
hvp : Fact (v ↑p ≠ 1)
x y : ModP K v O hv p
hxy0 : x * y ≠ 0
hx0 : x ≠ 0
hy0 : y ≠ 0
⊢ preVal K v O hv p (x * y) = preVal K v O hv p x * preVal K v O hv p y
state_after: case intro
K : Type u₁
inst✝² : Field K
v : Valuation K ℝ≥0
O : Type u₂
inst✝¹ : CommRing O
inst✝ : Algebra O K
hv : v.Integers O
p : ℕ
hp : Fact (Nat.Prime p)
hvp : Fact (v ↑p ≠ 1)
y : ModP K v O hv p
hy0 : y ≠ 0
r : O
hxy0 : (Ideal.Quotient.mk (Ideal.span {↑p})) r * y ≠ 0
hx0 : (Ideal.Quotient.mk (Ideal.span {↑p})) r ≠ 0
⊢ preVal K v O hv p ((Ideal.Quotient.mk (Ideal.span {↑p})) r * y) =
    preVal K v O hv p ((Ideal.Quotient.mk (Ideal.span {↑p})) r) * preVal K v O hv p y
tactic: obtain ⟨r, rfl⟩ := Ideal.Quotient.mk_surjective x
state_before: case intro
K : Type u₁
inst✝² : Field K
v : Valuation K ℝ≥0
O : Type u₂
inst✝¹ : CommRing O
inst✝ : Algebra O K
hv : v.Integers O
p : ℕ
hp : Fact (Nat.Prime p)
hvp : Fact (v ↑p ≠ 1)
y : ModP K v O hv p
hy0 : y ≠ 0
r : O
hxy0 : (Ideal.Quotient.mk (Ideal.span {↑p})) r * y ≠ 0
hx0 : (Ideal.Quotient.mk (Ideal.span {↑p})) r ≠ 0
⊢ preVal K v O hv p ((Ideal.Quotient.mk (Ideal.span {↑p})) r * y) =
    preVal K v O hv p ((Ideal.Quotient.mk (Ideal.span {↑p})) r) * preVal K v O hv p y
state_after: case intro.intro
K : Type u₁
inst✝² : Field K
v : Valuation K ℝ≥0
O : Type u₂
inst✝¹ : CommRing O
inst✝ : Algebra O K
hv : v.Integers O
p : ℕ
hp : Fact (Nat.Prime p)
hvp : Fact (v ↑p ≠ 1)
r : O
hx0 : (Ideal.Quotient.mk (Ideal.span {↑p})) r ≠ 0
s : O
hy0 : (Ideal.Quotient.mk (Ideal.span {↑p})) s ≠ 0
hxy0 : (Ideal.Quotient.mk (Ideal.span {↑p})) r * (Ideal.Quotient.mk (Ideal.span {↑p})) s ≠ 0
⊢ preVal K v O hv p ((Ideal.Quotient.mk (Ideal.span {↑p})) r * (Ideal.Quotient.mk (Ideal.span {↑p})) s) =
    preVal K v O hv p ((Ideal.Quotient.mk (Ideal.span {↑p})) r) *
      preVal K v O hv p ((Ideal.Quotient.mk (Ideal.span {↑p})) s)
tactic: obtain ⟨s, rfl⟩ := Ideal.Quotient.mk_surjective y
state_before: case intro.intro
K : Type u₁
inst✝² : Field K
v : Valuation K ℝ≥0
O : Type u₂
inst✝¹ : CommRing O
inst✝ : Algebra O K
hv : v.Integers O
p : ℕ
hp : Fact (Nat.Prime p)
hvp : Fact (v ↑p ≠ 1)
r : O
hx0 : (Ideal.Quotient.mk (Ideal.span {↑p})) r ≠ 0
s : O
hy0 : (Ideal.Quotient.mk (Ideal.span {↑p})) s ≠ 0
hxy0 : (Ideal.Quotient.mk (Ideal.span {↑p})) r * (Ideal.Quotient.mk (Ideal.span {↑p})) s ≠ 0
⊢ preVal K v O hv p ((Ideal.Quotient.mk (Ideal.span {↑p})) r * (Ideal.Quotient.mk (Ideal.span {↑p})) s) =
    preVal K v O hv p ((Ideal.Quotient.mk (Ideal.span {↑p})) r) *
      preVal K v O hv p ((Ideal.Quotient.mk (Ideal.span {↑p})) s)
state_after: case intro.intro
K : Type u₁
inst✝² : Field K
v : Valuation K ℝ≥0
O : Type u₂
inst✝¹ : CommRing O
inst✝ : Algebra O K
hv : v.Integers O
p : ℕ
hp : Fact (Nat.Prime p)
hvp : Fact (v ↑p ≠ 1)
r : O
hx0 : (Ideal.Quotient.mk (Ideal.span {↑p})) r ≠ 0
s : O
hy0 : (Ideal.Quotient.mk (Ideal.span {↑p})) s ≠ 0
hxy0 : (Ideal.Quotient.mk (Ideal.span {↑p})) (r * s) ≠ 0
⊢ preVal K v O hv p ((Ideal.Quotient.mk (Ideal.span {↑p})) (r * s)) =
    preVal K v O hv p ((Ideal.Quotient.mk (Ideal.span {↑p})) r) *
      preVal K v O hv p ((Ideal.Quotient.mk (Ideal.span {↑p})) s)
tactic: rw [← map_mul (Ideal.Quotient.mk (Ideal.span {↑p})) r s] at hxy0 ⊢
state_before: case intro.intro
K : Type u₁
inst✝² : Field K
v : Valuation K ℝ≥0
O : Type u₂
inst✝¹ : CommRing O
inst✝ : Algebra O K
hv : v.Integers O
p : ℕ
hp : Fact (Nat.Prime p)
hvp : Fact (v ↑p ≠ 1)
r : O
hx0 : (Ideal.Quotient.mk (Ideal.span {↑p})) r ≠ 0
s : O
hy0 : (Ideal.Quotient.mk (Ideal.span {↑p})) s ≠ 0
hxy0 : (Ideal.Quotient.mk (Ideal.span {↑p})) (r * s) ≠ 0
⊢ preVal K v O hv p ((Ideal.Quotient.mk (Ideal.span {↑p})) (r * s)) =
    preVal K v O hv p ((Ideal.Quotient.mk (Ideal.span {↑p})) r) *
      preVal K v O hv p ((Ideal.Quotient.mk (Ideal.span {↑p})) s)
state_after: no goals
tactic: rw [preVal_mk hx0, preVal_mk hy0, preVal_mk hxy0, RingHom.map_mul, v.map_mul]