Theorem: RingTheory.Sequence.isWeaklyRegular_append_iff
File: Mathlib/RingTheory/Regular/RegularSequence.lean

tactic: induction rs₁ generalizing M with
| nil =>
  refine Iff.symm <| Iff.trans (and_iff_right (.nil R M)) ?_
  refine (quotEquivOfEqBot _ ?_).isWeaklyRegular_congr rs₂
  rw [Ideal.ofList_nil, bot_smul]
| cons r rs₁ ih =>
  let e := quotOfListConsSMulTopEquivQuotSMulTopInner M r rs₁
  rw [List.cons_append, isWeaklyRegular_cons_iff, isWeaklyRegular_cons_iff,
    ih, ← and_assoc, ← e.isWeaklyRegular_congr rs₂]
state_before: R : Type u_1
S : Type u_2
M : Type u_3
M₂ : Type u_4
M₃ : Type u_5
M₄ : Type u_6
inst✝⁸ : CommRing R
inst✝⁷ : AddCommGroup M
inst✝⁶ : AddCommGroup M₂
inst✝⁵ : AddCommGroup M₃
inst✝⁴ : AddCommGroup M₄
inst✝³ : Module R M
inst✝² : Module R M₂
inst✝¹ : Module R M₃
inst✝ : Module R M₄
rs₁ rs₂ : List R
⊢ IsWeaklyRegular M (rs₁ ++ rs₂) ↔ IsWeaklyRegular M rs₁ ∧ IsWeaklyRegular (M ⧸ Ideal.ofList rs₁ • ⊤) rs₂
state_after: no goals

tactic: refine Iff.symm <| Iff.trans (and_iff_right (.nil R M)) ?_
state_before: case nil
R : Type u_1
S : Type u_2
M₂ : Type u_4
M₃ : Type u_5
M₄ : Type u_6
inst✝⁸ : CommRing R
inst✝⁷ : AddCommGroup M₂
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : AddCommGroup M₄
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M₄
rs₂ : List R
M : Type u_3
inst✝¹ : AddCommGroup M
inst✝ : Module R M
⊢ IsWeaklyRegular M ([] ++ rs₂) ↔ IsWeaklyRegular M [] ∧ IsWeaklyRegular (M ⧸ Ideal.ofList [] • ⊤) rs₂
state_after: case nil
R : Type u_1
S : Type u_2
M₂ : Type u_4
M₃ : Type u_5
M₄ : Type u_6
inst✝⁸ : CommRing R
inst✝⁷ : AddCommGroup M₂
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : AddCommGroup M₄
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M₄
rs₂ : List R
M : Type u_3
inst✝¹ : AddCommGroup M
inst✝ : Module R M
⊢ IsWeaklyRegular (M ⧸ Ideal.ofList [] • ⊤) rs₂ ↔ IsWeaklyRegular M ([] ++ rs₂)

tactic: refine (quotEquivOfEqBot _ ?_).isWeaklyRegular_congr rs₂
state_before: case nil
R : Type u_1
S : Type u_2
M₂ : Type u_4
M₃ : Type u_5
M₄ : Type u_6
inst✝⁸ : CommRing R
inst✝⁷ : AddCommGroup M₂
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : AddCommGroup M₄
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M₄
rs₂ : List R
M : Type u_3
inst✝¹ : AddCommGroup M
inst✝ : Module R M
⊢ IsWeaklyRegular (M ⧸ Ideal.ofList [] • ⊤) rs₂ ↔ IsWeaklyRegular M ([] ++ rs₂)
state_after: case nil
R : Type u_1
S : Type u_2
M₂ : Type u_4
M₃ : Type u_5
M₄ : Type u_6
inst✝⁸ : CommRing R
inst✝⁷ : AddCommGroup M₂
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : AddCommGroup M₄
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M₄
rs₂ : List R
M : Type u_3
inst✝¹ : AddCommGroup M
inst✝ : Module R M
⊢ Ideal.ofList [] • ⊤ = ⊥

tactic: rw [Ideal.ofList_nil, bot_smul]
state_before: case nil
R : Type u_1
S : Type u_2
M₂ : Type u_4
M₃ : Type u_5
M₄ : Type u_6
inst✝⁸ : CommRing R
inst✝⁷ : AddCommGroup M₂
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : AddCommGroup M₄
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M₄
rs₂ : List R
M : Type u_3
inst✝¹ : AddCommGroup M
inst✝ : Module R M
⊢ Ideal.ofList [] • ⊤ = ⊥
state_after: no goals

tactic: let e := quotOfListConsSMulTopEquivQuotSMulTopInner M r rs₁
state_before: case cons
R : Type u_1
S : Type u_2
M₂ : Type u_4
M₃ : Type u_5
M₄ : Type u_6
inst✝⁸ : CommRing R
inst✝⁷ : AddCommGroup M₂
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : AddCommGroup M₄
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M₄
rs₂ : List R
r : R
rs₁ : List R
ih :
  ∀ (M : Type u_3) [inst : AddCommGroup M] [inst_1 : Module R M],
    IsWeaklyRegular M (rs₁ ++ rs₂) ↔ IsWeaklyRegular M rs₁ ∧ IsWeaklyRegular (M ⧸ Ideal.ofList rs₁ • ⊤) rs₂
M : Type u_3
inst✝¹ : AddCommGroup M
inst✝ : Module R M
⊢ IsWeaklyRegular M (r :: rs₁ ++ rs₂) ↔
    IsWeaklyRegular M (r :: rs₁) ∧ IsWeaklyRegular (M ⧸ Ideal.ofList (r :: rs₁) • ⊤) rs₂
state_after: case cons
R : Type u_1
S : Type u_2
M₂ : Type u_4
M₃ : Type u_5
M₄ : Type u_6
inst✝⁸ : CommRing R
inst✝⁷ : AddCommGroup M₂
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : AddCommGroup M₄
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M₄
rs₂ : List R
r : R
rs₁ : List R
ih :
  ∀ (M : Type u_3) [inst : AddCommGroup M] [inst_1 : Module R M],
    IsWeaklyRegular M (rs₁ ++ rs₂) ↔ IsWeaklyRegular M rs₁ ∧ IsWeaklyRegular (M ⧸ Ideal.ofList rs₁ • ⊤) rs₂
M : Type u_3
inst✝¹ : AddCommGroup M
inst✝ : Module R M
e : (M ⧸ Ideal.ofList (r :: rs₁) • ⊤) ≃ₗ[R] QuotSMulTop r M ⧸ Ideal.ofList rs₁ • ⊤ :=
  quotOfListConsSMulTopEquivQuotSMulTopInner M r rs₁
⊢ IsWeaklyRegular M (r :: rs₁ ++ rs₂) ↔
    IsWeaklyRegular M (r :: rs₁) ∧ IsWeaklyRegular (M ⧸ Ideal.ofList (r :: rs₁) • ⊤) rs₂

tactic: rw [List.cons_append, isWeaklyRegular_cons_iff, isWeaklyRegular_cons_iff,
  ih, ← and_assoc, ← e.isWeaklyRegular_congr rs₂]
state_before: case cons
R : Type u_1
S : Type u_2
M₂ : Type u_4
M₃ : Type u_5
M₄ : Type u_6
inst✝⁸ : CommRing R
inst✝⁷ : AddCommGroup M₂
inst✝⁶ : AddCommGroup M₃
inst✝⁵ : AddCommGroup M₄
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M₄
rs₂ : List R
r : R
rs₁ : List R
ih :
  ∀ (M : Type u_3) [inst : AddCommGroup M] [inst_1 : Module R M],
    IsWeaklyRegular M (rs₁ ++ rs₂) ↔ IsWeaklyRegular M rs₁ ∧ IsWeaklyRegular (M ⧸ Ideal.ofList rs₁ • ⊤) rs₂
M : Type u_3
inst✝¹ : AddCommGroup M
inst✝ : Module R M
e : (M ⧸ Ideal.ofList (r :: rs₁) • ⊤) ≃ₗ[R] QuotSMulTop r M ⧸ Ideal.ofList rs₁ • ⊤ :=
  quotOfListConsSMulTopEquivQuotSMulTopInner M r rs₁
⊢ IsWeaklyRegular M (r :: rs₁ ++ rs₂) ↔
    IsWeaklyRegular M (r :: rs₁) ∧ IsWeaklyRegular (M ⧸ Ideal.ofList (r :: rs₁) • ⊤) rs₂
state_after: no goals