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

tactic: infer_instance
state_before: R : Type u
inst✝⁴ : Ring R
ι : Type v
dec_ι : DecidableEq ι
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 ι

tactic: rw [(of G f k).map_mul, of_f, of_f, hs]
state_before: R : Type u
inst✝⁴ : Ring R
ι : Type v
dec_ι : DecidableEq ι
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 ({ fst := i, snd := x } ::ₘ s))

tactic: apply congr_arg Quotient.mk''
state_before: R : Type u
inst✝⁴ : Ring R
ι : Type v
dec_ι : DecidableEq ι
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 ({ fst := i, snd := x } ::ₘ s))

tactic: symm
state_before: R : Type u
inst✝⁴ : Ring R
ι : Type v
dec_ι : DecidableEq ι
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 { fst := i, snd := x }) (FreeAbelianGroup.of s) =
    FreeAbelianGroup.of ({ fst := i, snd := x } ::ₘ s)

tactic: apply FreeCommRing.of_cons
state_before: R : Type u
inst✝⁴ : Ring R
ι : Type v
dec_ι : DecidableEq ι
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 ({ fst := i, snd := x } ::ₘ s) =
    (fun x x_1 => x * x_1) (FreeCommRing.of { fst := i, snd := x }) (FreeAbelianGroup.of s)

tactic: rw [(of G f i).map_neg, ih]
state_before: R : Type u
inst✝⁴ : Ring R
ι : Type v
dec_ι : DecidableEq ι
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)

tactic: rfl
state_before: R : Type u
inst✝⁴ : Ring R
ι : Type v
dec_ι : DecidableEq ι
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 _ _ _).map_add, of_f, of_f, ihx, ihy]
state_before: R : Type u
inst✝⁴ : Ring R
ι : Type v
dec_ι : DecidableEq ι
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)

tactic: rfl
state_before: R : Type u
inst✝⁴ : Ring R
ι : Type v
dec_ι : DecidableEq ι
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)