Theorem: HasProd.of_nat_of_neg_add_one
File: Mathlib/Topology/Algebra/InfiniteSum/NatInt.lean

tactic: have hi₂ : Injective Int.negSucc := @Int.negSucc.inj
state_before: M : Type u_1
inst✝³ : CommMonoid M
inst✝² : TopologicalSpace M
m m' : M
G : Type u_2
inst✝¹ : CommGroup G
g g' : G
inst✝ : ContinuousMul M
f : ℤ → M
hf₁ : HasProd (fun n => f ↑n) m
hf₂ : HasProd (fun n => f (-(↑n + 1))) m'
⊢ HasProd f (m * m')
state_after: M : Type u_1
inst✝³ : CommMonoid M
inst✝² : TopologicalSpace M
m m' : M
G : Type u_2
inst✝¹ : CommGroup G
g g' : G
inst✝ : ContinuousMul M
f : ℤ → M
hf₁ : HasProd (fun n => f ↑n) m
hf₂ : HasProd (fun n => f (-(↑n + 1))) m'
hi₂ : Injective Int.negSucc
⊢ HasProd f (m * m')

tactic: exact (Nat.cast_injective.hasProd_range_iff.mpr hf₁).mul_isCompl
  this (hi₂.hasProd_range_iff.mpr hf₂)
state_before: M : Type u_1
inst✝³ : CommMonoid M
inst✝² : TopologicalSpace M
m m' : M
G : Type u_2
inst✝¹ : CommGroup G
g g' : G
inst✝ : ContinuousMul M
f : ℤ → M
hf₁ : HasProd (fun n => f ↑n) m
hf₂ : HasProd (fun n => f (-(↑n + 1))) m'
hi₂ : Injective Int.negSucc
this : IsCompl (Set.range Nat.cast) (Set.range Int.negSucc)
⊢ HasProd f (m * m')
state_after: no goals

tactic: constructor
state_before: M : Type u_1
inst✝³ : CommMonoid M
inst✝² : TopologicalSpace M
m m' : M
G : Type u_2
inst✝¹ : CommGroup G
g g' : G
inst✝ : ContinuousMul M
f : ℤ → M
hf₁ : HasProd (fun n => f ↑n) m
hf₂ : HasProd (fun n => f (-(↑n + 1))) m'
hi₂ : Injective Int.negSucc
⊢ IsCompl (Set.range Nat.cast) (Set.range Int.negSucc)
state_after: case disjoint
M : Type u_1
inst✝³ : CommMonoid M
inst✝² : TopologicalSpace M
m m' : M
G : Type u_2
inst✝¹ : CommGroup G
g g' : G
inst✝ : ContinuousMul M
f : ℤ → M
hf₁ : HasProd (fun n => f ↑n) m
hf₂ : HasProd (fun n => f (-(↑n + 1))) m'
hi₂ : Injective Int.negSucc
⊢ Disjoint (Set.range Nat.cast) (Set.range Int.negSucc)

case codisjoint
M : Type u_1
inst✝³ : CommMonoid M
inst✝² : TopologicalSpace M
m m' : M
G : Type u_2
inst✝¹ : CommGroup G
g g' : G
inst✝ : ContinuousMul M
f : ℤ → M
hf₁ : HasProd (fun n => f ↑n) m
hf₂ : HasProd (fun n => f (-(↑n + 1))) m'
hi₂ : Injective Int.negSucc
⊢ Codisjoint (Set.range Nat.cast) (Set.range Int.negSucc)

tactic: rw [disjoint_iff_inf_le]
state_before: case disjoint
M : Type u_1
inst✝³ : CommMonoid M
inst✝² : TopologicalSpace M
m m' : M
G : Type u_2
inst✝¹ : CommGroup G
g g' : G
inst✝ : ContinuousMul M
f : ℤ → M
hf₁ : HasProd (fun n => f ↑n) m
hf₂ : HasProd (fun n => f (-(↑n + 1))) m'
hi₂ : Injective Int.negSucc
⊢ Disjoint (Set.range Nat.cast) (Set.range Int.negSucc)
state_after: case disjoint
M : Type u_1
inst✝³ : CommMonoid M
inst✝² : TopologicalSpace M
m m' : M
G : Type u_2
inst✝¹ : CommGroup G
g g' : G
inst✝ : ContinuousMul M
f : ℤ → M
hf₁ : HasProd (fun n => f ↑n) m
hf₂ : HasProd (fun n => f (-(↑n + 1))) m'
hi₂ : Injective Int.negSucc
⊢ Set.range Nat.cast ⊓ Set.range Int.negSucc ≤ ⊥

tactic: rintro _ ⟨⟨i, rfl⟩, ⟨j, ⟨⟩⟩⟩
state_before: case disjoint
M : Type u_1
inst✝³ : CommMonoid M
inst✝² : TopologicalSpace M
m m' : M
G : Type u_2
inst✝¹ : CommGroup G
g g' : G
inst✝ : ContinuousMul M
f : ℤ → M
hf₁ : HasProd (fun n => f ↑n) m
hf₂ : HasProd (fun n => f (-(↑n + 1))) m'
hi₂ : Injective Int.negSucc
⊢ Set.range Nat.cast ⊓ Set.range Int.negSucc ≤ ⊥
state_after: no goals

tactic: rw [codisjoint_iff_le_sup]
state_before: case codisjoint
M : Type u_1
inst✝³ : CommMonoid M
inst✝² : TopologicalSpace M
m m' : M
G : Type u_2
inst✝¹ : CommGroup G
g g' : G
inst✝ : ContinuousMul M
f : ℤ → M
hf₁ : HasProd (fun n => f ↑n) m
hf₂ : HasProd (fun n => f (-(↑n + 1))) m'
hi₂ : Injective Int.negSucc
⊢ Codisjoint (Set.range Nat.cast) (Set.range Int.negSucc)
state_after: case codisjoint
M : Type u_1
inst✝³ : CommMonoid M
inst✝² : TopologicalSpace M
m m' : M
G : Type u_2
inst✝¹ : CommGroup G
g g' : G
inst✝ : ContinuousMul M
f : ℤ → M
hf₁ : HasProd (fun n => f ↑n) m
hf₂ : HasProd (fun n => f (-(↑n + 1))) m'
hi₂ : Injective Int.negSucc
⊢ ⊤ ≤ Set.range Nat.cast ⊔ Set.range Int.negSucc

tactic: rintro (i | j) <;> simp
state_before: case codisjoint
M : Type u_1
inst✝³ : CommMonoid M
inst✝² : TopologicalSpace M
m m' : M
G : Type u_2
inst✝¹ : CommGroup G
g g' : G
inst✝ : ContinuousMul M
f : ℤ → M
hf₁ : HasProd (fun n => f ↑n) m
hf₂ : HasProd (fun n => f (-(↑n + 1))) m'
hi₂ : Injective Int.negSucc
⊢ ⊤ ≤ Set.range Nat.cast ⊔ Set.range Int.negSucc
state_after: no goals