Theorem: Ring.DirectLimit.exists_of
File: Mathlib/Algebra/DirectLimit.lean

Proof steps:
state_before: R : Type u
inst✝⁴ : Ring R
ι : Type v
inst✝³ : Preorder ι
G : ι → Type w
inst✝² : (i : ι) → CommRing (G i)
f : (i j : ι) → i ≤ j → G i → G j
inst✝¹ : Nonempty ι
inst✝ : IsDirected ι fun x x_1 => x ≤ x_1
z : DirectLimit G f
⊢ Nonempty ι
state_after: no goals
tactic: infer_instance
state_before: R : Type u
inst✝⁴ : Ring R
ι : Type v
inst✝³ : Preorder ι
G : ι → Type w
inst✝² : (i : ι) → CommRing (G i)
f : (i j : ι) → i ≤ j → G i → G j
inst✝¹ : Nonempty ι
inst✝ : IsDirected ι fun x x_1 => x ≤ x_1
z : DirectLimit G f
ind : ι
x✝ : FreeCommRing ((i : ι) × G i)
s✝ : Multiplicative (Multiset ((i : ι) × G i))
a : (i : ι) × G i
s : Multiset ((i : ι) × G i)
ih : ∃ i x, (of G f i) x = Quotient.mk'' (FreeAbelianGroup.of s)
i : ι
x : G i
j : ι
y : G j
hs : (of G f j) y = Quotient.mk'' (FreeAbelianGroup.of s)
k : ι
hik : i ≤ k
hjk : j ≤ k
⊢ (of G f k) (f i k hik x * f j k hjk y) = Quotient.mk'' (FreeAbelianGroup.of (⟨i, x⟩ ::ₘ s))
state_after: R : Type u
inst✝⁴ : Ring R
ι : Type v
inst✝³ : Preorder ι
G : ι → Type w
inst✝² : (i : ι) → CommRing (G i)
f : (i j : ι) → i ≤ j → G i → G j
inst✝¹ : Nonempty ι
inst✝ : IsDirected ι fun x x_1 => x ≤ x_1
z : DirectLimit G f
ind : ι
x✝ : FreeCommRing ((i : ι) × G i)
s✝ : Multiplicative (Multiset ((i : ι) × G i))
a : (i : ι) × G i
s : Multiset ((i : ι) × G i)
ih : ∃ i x, (of G f i) x = Quotient.mk'' (FreeAbelianGroup.of s)
i : ι
x : G i
j : ι
y : G j
hs : (of G f j) y = Quotient.mk'' (FreeAbelianGroup.of s)
k : ι
hik : i ≤ k
hjk : j ≤ k
⊢ (of G f i) x * Quotient.mk'' (FreeAbelianGroup.of s) = Quotient.mk'' (FreeAbelianGroup.of (⟨i, x⟩ ::ₘ s))
tactic: rw [(of G f k).map_mul, of_f, of_f, hs]
state_before: R : Type u
inst✝⁴ : Ring R
ι : Type v
inst✝³ : Preorder ι
G : ι → Type w
inst✝² : (i : ι) → CommRing (G i)
f : (i j : ι) → i ≤ j → G i → G j
inst✝¹ : Nonempty ι
inst✝ : IsDirected ι fun x x_1 => x ≤ x_1
z : DirectLimit G f
ind : ι
x✝ : FreeCommRing ((i : ι) × G i)
s✝ : Multiplicative (Multiset ((i : ι) × G i))
a : (i : ι) × G i
s : Multiset ((i : ι) × G i)
ih : ∃ i x, (of G f i) x = Quotient.mk'' (FreeAbelianGroup.of s)
i : ι
x : G i
j : ι
y : G j
hs : (of G f j) y = Quotient.mk'' (FreeAbelianGroup.of s)
k : ι
hik : i ≤ k
hjk : j ≤ k
⊢ (of G f i) x * Quotient.mk'' (FreeAbelianGroup.of s) = Quotient.mk'' (FreeAbelianGroup.of (⟨i, x⟩ ::ₘ s))
state_after: R : Type u
inst✝⁴ : Ring R
ι : Type v
inst✝³ : Preorder ι
G : ι → Type w
inst✝² : (i : ι) → CommRing (G i)
f : (i j : ι) → i ≤ j → G i → G j
inst✝¹ : Nonempty ι
inst✝ : IsDirected ι fun x x_1 => x ≤ x_1
z : DirectLimit G f
ind : ι
x✝ : FreeCommRing ((i : ι) × G i)
s✝ : Multiplicative (Multiset ((i : ι) × G i))
a : (i : ι) × G i
s : Multiset ((i : ι) × G i)
ih : ∃ i x, (of G f i) x = Quotient.mk'' (FreeAbelianGroup.of s)
i : ι
x : G i
j : ι
y : G j
hs : (of G f j) y = Quotient.mk'' (FreeAbelianGroup.of s)
k : ι
hik : i ≤ k
hjk : j ≤ k
⊢ (fun x x_1 => x * x_1) (FreeCommRing.of ⟨i, x⟩) (FreeAbelianGroup.of s) = FreeAbelianGroup.of (⟨i, x⟩ ::ₘ s)
tactic: apply congr_arg Quotient.mk''
state_before: R : Type u
inst✝⁴ : Ring R
ι : Type v
inst✝³ : Preorder ι
G : ι → Type w
inst✝² : (i : ι) → CommRing (G i)
f : (i j : ι) → i ≤ j → G i → G j
inst✝¹ : Nonempty ι
inst✝ : IsDirected ι fun x x_1 => x ≤ x_1
z : DirectLimit G f
ind : ι
x✝ : FreeCommRing ((i : ι) × G i)
s✝ : Multiplicative (Multiset ((i : ι) × G i))
a : (i : ι) × G i
s : Multiset ((i : ι) × G i)
ih : ∃ i x, (of G f i) x = Quotient.mk'' (FreeAbelianGroup.of s)
i : ι
x : G i
j : ι
y : G j
hs : (of G f j) y = Quotient.mk'' (FreeAbelianGroup.of s)
k : ι
hik : i ≤ k
hjk : j ≤ k
⊢ (fun x x_1 => x * x_1) (FreeCommRing.of ⟨i, x⟩) (FreeAbelianGroup.of s) = FreeAbelianGroup.of (⟨i, x⟩ ::ₘ s)
state_after: R : Type u
inst✝⁴ : Ring R
ι : Type v
inst✝³ : Preorder ι
G : ι → Type w
inst✝² : (i : ι) → CommRing (G i)
f : (i j : ι) → i ≤ j → G i → G j
inst✝¹ : Nonempty ι
inst✝ : IsDirected ι fun x x_1 => x ≤ x_1
z : DirectLimit G f
ind : ι
x✝ : FreeCommRing ((i : ι) × G i)
s✝ : Multiplicative (Multiset ((i : ι) × G i))
a : (i : ι) × G i
s : Multiset ((i : ι) × G i)
ih : ∃ i x, (of G f i) x = Quotient.mk'' (FreeAbelianGroup.of s)
i : ι
x : G i
j : ι
y : G j
hs : (of G f j) y = Quotient.mk'' (FreeAbelianGroup.of s)
k : ι
hik : i ≤ k
hjk : j ≤ k
⊢ FreeAbelianGroup.of (⟨i, x⟩ ::ₘ s) = (fun x x_1 => x * x_1) (FreeCommRing.of ⟨i, x⟩) (FreeAbelianGroup.of s)
tactic: symm
state_before: R : Type u
inst✝⁴ : Ring R
ι : Type v
inst✝³ : Preorder ι
G : ι → Type w
inst✝² : (i : ι) → CommRing (G i)
f : (i j : ι) → i ≤ j → G i → G j
inst✝¹ : Nonempty ι
inst✝ : IsDirected ι fun x x_1 => x ≤ x_1
z : DirectLimit G f
ind : ι
x✝ : FreeCommRing ((i : ι) × G i)
s✝ : Multiplicative (Multiset ((i : ι) × G i))
a : (i : ι) × G i
s : Multiset ((i : ι) × G i)
ih : ∃ i x, (of G f i) x = Quotient.mk'' (FreeAbelianGroup.of s)
i : ι
x : G i
j : ι
y : G j
hs : (of G f j) y = Quotient.mk'' (FreeAbelianGroup.of s)
k : ι
hik : i ≤ k
hjk : j ≤ k
⊢ FreeAbelianGroup.of (⟨i, x⟩ ::ₘ s) = (fun x x_1 => x * x_1) (FreeCommRing.of ⟨i, x⟩) (FreeAbelianGroup.of s)
state_after: no goals
tactic: apply FreeCommRing.of_cons
state_before: R : Type u
inst✝⁴ : Ring R
ι : Type v
inst✝³ : Preorder ι
G : ι → Type w
inst✝² : (i : ι) → CommRing (G i)
f : (i j : ι) → i ≤ j → G i → G j
inst✝¹ : Nonempty ι
inst✝ : IsDirected ι fun x x_1 => x ≤ x_1
z : DirectLimit G f
ind : ι
x✝¹ : FreeCommRing ((i : ι) × G i)
s : Multiplicative (Multiset ((i : ι) × G i))
x✝ : ∃ i x, (of G f i) x = Quotient.mk'' (FreeAbelianGroup.of s)
i : ι
x : G i
ih : (of G f i) x = Quotient.mk'' (FreeAbelianGroup.of s)
⊢ (of G f i) (-x) = Quotient.mk'' (-FreeAbelianGroup.of s)
state_after: R : Type u
inst✝⁴ : Ring R
ι : Type v
inst✝³ : Preorder ι
G : ι → Type w
inst✝² : (i : ι) → CommRing (G i)
f : (i j : ι) → i ≤ j → G i → G j
inst✝¹ : Nonempty ι
inst✝ : IsDirected ι fun x x_1 => x ≤ x_1
z : DirectLimit G f
ind : ι
x✝¹ : FreeCommRing ((i : ι) × G i)
s : Multiplicative (Multiset ((i : ι) × G i))
x✝ : ∃ i x, (of G f i) x = Quotient.mk'' (FreeAbelianGroup.of s)
i : ι
x : G i
ih : (of G f i) x = Quotient.mk'' (FreeAbelianGroup.of s)
⊢ -Quotient.mk'' (FreeAbelianGroup.of s) = Quotient.mk'' (-FreeAbelianGroup.of s)
tactic: rw [(of G _ _).map_neg, ih]
state_before: R : Type u
inst✝⁴ : Ring R
ι : Type v
inst✝³ : Preorder ι
G : ι → Type w
inst✝² : (i : ι) → CommRing (G i)
f : (i j : ι) → i ≤ j → G i → G j
inst✝¹ : Nonempty ι
inst✝ : IsDirected ι fun x x_1 => x ≤ x_1
z : DirectLimit G f
ind : ι
x✝¹ : FreeCommRing ((i : ι) × G i)
s : Multiplicative (Multiset ((i : ι) × G i))
x✝ : ∃ i x, (of G f i) x = Quotient.mk'' (FreeAbelianGroup.of s)
i : ι
x : G i
ih : (of G f i) x = Quotient.mk'' (FreeAbelianGroup.of s)
⊢ -Quotient.mk'' (FreeAbelianGroup.of s) = Quotient.mk'' (-FreeAbelianGroup.of s)
state_after: no goals
tactic: rfl
state_before: R : Type u
inst✝⁴ : Ring R
ι : Type v
inst✝³ : Preorder ι
G : ι → Type w
inst✝² : (i : ι) → CommRing (G i)
f : (i j : ι) → i ≤ j → G i → G j
inst✝¹ : Nonempty ι
inst✝ : IsDirected ι fun x x_1 => x ≤ x_1
z : DirectLimit G f
ind : ι
x✝² : FreeCommRing ((i : ι) × G i)
p q : FreeAbelianGroup (Multiplicative (Multiset ((i : ι) × G i)))
x✝¹ : ∃ i x, (of G f i) x = Quotient.mk'' p
x✝ : ∃ i x, (of G f i) x = Quotient.mk'' q
i : ι
x : G i
ihx : (of G f i) x = Quotient.mk'' p
j : ι
y : G j
ihy : (of G f j) y = Quotient.mk'' q
k : ι
hik : i ≤ k
hjk : j ≤ k
⊢ (of G f k) (f i k hik x + f j k hjk y) = Quotient.mk'' (p + q)
state_after: R : Type u
inst✝⁴ : Ring R
ι : Type v
inst✝³ : Preorder ι
G : ι → Type w
inst✝² : (i : ι) → CommRing (G i)
f : (i j : ι) → i ≤ j → G i → G j
inst✝¹ : Nonempty ι
inst✝ : IsDirected ι fun x x_1 => x ≤ x_1
z : DirectLimit G f
ind : ι
x✝² : FreeCommRing ((i : ι) × G i)
p q : FreeAbelianGroup (Multiplicative (Multiset ((i : ι) × G i)))
x✝¹ : ∃ i x, (of G f i) x = Quotient.mk'' p
x✝ : ∃ i x, (of G f i) x = Quotient.mk'' q
i : ι
x : G i
ihx : (of G f i) x = Quotient.mk'' p
j : ι
y : G j
ihy : (of G f j) y = Quotient.mk'' q
k : ι
hik : i ≤ k
hjk : j ≤ k
⊢ Quotient.mk'' p + Quotient.mk'' q = Quotient.mk'' (p + q)
tactic: rw [(of _ _ _).map_add, of_f, of_f, ihx, ihy]
state_before: R : Type u
inst✝⁴ : Ring R
ι : Type v
inst✝³ : Preorder ι
G : ι → Type w
inst✝² : (i : ι) → CommRing (G i)
f : (i j : ι) → i ≤ j → G i → G j
inst✝¹ : Nonempty ι
inst✝ : IsDirected ι fun x x_1 => x ≤ x_1
z : DirectLimit G f
ind : ι
x✝² : FreeCommRing ((i : ι) × G i)
p q : FreeAbelianGroup (Multiplicative (Multiset ((i : ι) × G i)))
x✝¹ : ∃ i x, (of G f i) x = Quotient.mk'' p
x✝ : ∃ i x, (of G f i) x = Quotient.mk'' q
i : ι
x : G i
ihx : (of G f i) x = Quotient.mk'' p
j : ι
y : G j
ihy : (of G f j) y = Quotient.mk'' q
k : ι
hik : i ≤ k
hjk : j ≤ k
⊢ Quotient.mk'' p + Quotient.mk'' q = Quotient.mk'' (p + q)
state_after: no goals
tactic: rfl