Theorem: Finset.supIndep_product_iff
File: Mathlib/Order/SupIndep.lean

tactic: refine ⟨?_, fun h => h.1.product h.2⟩
state_before: α : Type u_1
β : Type u_2
ι : Type u_3
ι' : Type u_4
inst✝¹ : DistribLattice α
inst✝ : OrderBot α
s✝ : Finset ι
f✝ : ι → α
s : Finset ι
t : Finset ι'
f : ι × ι' → α
⊢ (s.product t).SupIndep f ↔
    (s.SupIndep fun i => t.sup fun i' => f (i, i')) ∧ t.SupIndep fun i' => s.sup fun i => f (i, i')
state_after: α : Type u_1
β : Type u_2
ι : Type u_3
ι' : Type u_4
inst✝¹ : DistribLattice α
inst✝ : OrderBot α
s✝ : Finset ι
f✝ : ι → α
s : Finset ι
t : Finset ι'
f : ι × ι' → α
⊢ (s.product t).SupIndep f →
    (s.SupIndep fun i => t.sup fun i' => f (i, i')) ∧ t.SupIndep fun i' => s.sup fun i => f (i, i')

tactic: simp_rw [supIndep_iff_pairwiseDisjoint]
state_before: α : Type u_1
β : Type u_2
ι : Type u_3
ι' : Type u_4
inst✝¹ : DistribLattice α
inst✝ : OrderBot α
s✝ : Finset ι
f✝ : ι → α
s : Finset ι
t : Finset ι'
f : ι × ι' → α
⊢ (s.product t).SupIndep f →
    (s.SupIndep fun i => t.sup fun i' => f (i, i')) ∧ t.SupIndep fun i' => s.sup fun i => f (i, i')
state_after: α : Type u_1
β : Type u_2
ι : Type u_3
ι' : Type u_4
inst✝¹ : DistribLattice α
inst✝ : OrderBot α
s✝ : Finset ι
f✝ : ι → α
s : Finset ι
t : Finset ι'
f : ι × ι' → α
⊢ (↑(s.product t)).PairwiseDisjoint f →
    ((↑s).PairwiseDisjoint fun i => t.sup fun i' => f (i, i')) ∧
      (↑t).PairwiseDisjoint fun i' => s.sup fun i => f (i, i')

tactic: refine fun h => ⟨fun i hi j hj hij => ?_, fun i hi j hj hij => ?_⟩ <;>
    simp_rw [Finset.disjoint_sup_left, Finset.disjoint_sup_right] <;>
  intro i' hi' j' hj'
state_before: α : Type u_1
β : Type u_2
ι : Type u_3
ι' : Type u_4
inst✝¹ : DistribLattice α
inst✝ : OrderBot α
s✝ : Finset ι
f✝ : ι → α
s : Finset ι
t : Finset ι'
f : ι × ι' → α
⊢ (↑(s.product t)).PairwiseDisjoint f →
    ((↑s).PairwiseDisjoint fun i => t.sup fun i' => f (i, i')) ∧
      (↑t).PairwiseDisjoint fun i' => s.sup fun i => f (i, i')
state_after: case refine_1
α : Type u_1
β : Type u_2
ι : Type u_3
ι' : Type u_4
inst✝¹ : DistribLattice α
inst✝ : OrderBot α
s✝ : Finset ι
f✝ : ι → α
s : Finset ι
t : Finset ι'
f : ι × ι' → α
h : (↑(s.product t)).PairwiseDisjoint f
i : ι
hi : i ∈ ↑s
j : ι
hj : j ∈ ↑s
hij : i ≠ j
i' : ι'
hi' : i' ∈ t
j' : ι'
hj' : j' ∈ t
⊢ Disjoint (f (i, i')) (f (j, j'))

case refine_2
α : Type u_1
β : Type u_2
ι : Type u_3
ι' : Type u_4
inst✝¹ : DistribLattice α
inst✝ : OrderBot α
s✝ : Finset ι
f✝ : ι → α
s : Finset ι
t : Finset ι'
f : ι × ι' → α
h : (↑(s.product t)).PairwiseDisjoint f
i : ι'
hi : i ∈ ↑t
j : ι'
hj : j ∈ ↑t
hij : i ≠ j
i' : ι
hi' : i' ∈ s
j' : ι
hj' : j' ∈ s
⊢ Disjoint (f (i', i)) (f (j', j))

tactic: exact h (mk_mem_product hi hi') (mk_mem_product hj hj') (ne_of_apply_ne Prod.fst hij)
state_before: case refine_1
α : Type u_1
β : Type u_2
ι : Type u_3
ι' : Type u_4
inst✝¹ : DistribLattice α
inst✝ : OrderBot α
s✝ : Finset ι
f✝ : ι → α
s : Finset ι
t : Finset ι'
f : ι × ι' → α
h : (↑(s.product t)).PairwiseDisjoint f
i : ι
hi : i ∈ ↑s
j : ι
hj : j ∈ ↑s
hij : i ≠ j
i' : ι'
hi' : i' ∈ t
j' : ι'
hj' : j' ∈ t
⊢ Disjoint (f (i, i')) (f (j, j'))
state_after: no goals

tactic: exact h (mk_mem_product hi' hi) (mk_mem_product hj' hj) (ne_of_apply_ne Prod.snd hij)
state_before: case refine_2
α : Type u_1
β : Type u_2
ι : Type u_3
ι' : Type u_4
inst✝¹ : DistribLattice α
inst✝ : OrderBot α
s✝ : Finset ι
f✝ : ι → α
s : Finset ι
t : Finset ι'
f : ι × ι' → α
h : (↑(s.product t)).PairwiseDisjoint f
i : ι'
hi : i ∈ ↑t
j : ι'
hj : j ∈ ↑t
hij : i ≠ j
i' : ι
hi' : i' ∈ s
j' : ι
hj' : j' ∈ s
⊢ Disjoint (f (i', i)) (f (j', j))
state_after: no goals