Theorem: Set.compl_prod_eq_union
File: Mathlib/Data/Set/Prod.lean

tactic: ext p
state_before: α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
δ : Type u_4
s✝ s₁ s₂ : Set α✝
t✝ t₁ t₂ : Set β✝
a : α✝
b : β✝
α : Type u_5
β : Type u_6
s : Set α
t : Set β
⊢ (s ×ˢ t)ᶜ = sᶜ ×ˢ univ ∪ univ ×ˢ tᶜ
state_after: case h
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
δ : Type u_4
s✝ s₁ s₂ : Set α✝
t✝ t₁ t₂ : Set β✝
a : α✝
b : β✝
α : Type u_5
β : Type u_6
s : Set α
t : Set β
p : α × β
⊢ p ∈ (s ×ˢ t)ᶜ ↔ p ∈ sᶜ ×ˢ univ ∪ univ ×ˢ tᶜ

tactic: simp only [mem_compl_iff, mem_prod, not_and, mem_union, mem_univ, and_true, true_and]
state_before: case h
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
δ : Type u_4
s✝ s₁ s₂ : Set α✝
t✝ t₁ t₂ : Set β✝
a : α✝
b : β✝
α : Type u_5
β : Type u_6
s : Set α
t : Set β
p : α × β
⊢ p ∈ (s ×ˢ t)ᶜ ↔ p ∈ sᶜ ×ˢ univ ∪ univ ×ˢ tᶜ
state_after: case h
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
δ : Type u_4
s✝ s₁ s₂ : Set α✝
t✝ t₁ t₂ : Set β✝
a : α✝
b : β✝
α : Type u_5
β : Type u_6
s : Set α
t : Set β
p : α × β
⊢ p.1 ∈ s → p.2 ∉ t ↔ p.1 ∉ s ∨ p.2 ∉ t

tactic: constructor <;> intro h
state_before: case h
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
δ : Type u_4
s✝ s₁ s₂ : Set α✝
t✝ t₁ t₂ : Set β✝
a : α✝
b : β✝
α : Type u_5
β : Type u_6
s : Set α
t : Set β
p : α × β
⊢ p.1 ∈ s → p.2 ∉ t ↔ p.1 ∉ s ∨ p.2 ∉ t
state_after: case h.mp
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
δ : Type u_4
s✝ s₁ s₂ : Set α✝
t✝ t₁ t₂ : Set β✝
a : α✝
b : β✝
α : Type u_5
β : Type u_6
s : Set α
t : Set β
p : α × β
h : p.1 ∈ s → p.2 ∉ t
⊢ p.1 ∉ s ∨ p.2 ∉ t

case h.mpr
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
δ : Type u_4
s✝ s₁ s₂ : Set α✝
t✝ t₁ t₂ : Set β✝
a : α✝
b : β✝
α : Type u_5
β : Type u_6
s : Set α
t : Set β
p : α × β
h : p.1 ∉ s ∨ p.2 ∉ t
⊢ p.1 ∈ s → p.2 ∉ t

tactic: by_cases fst_in_s : p.fst ∈ s
state_before: case h.mp
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
δ : Type u_4
s✝ s₁ s₂ : Set α✝
t✝ t₁ t₂ : Set β✝
a : α✝
b : β✝
α : Type u_5
β : Type u_6
s : Set α
t : Set β
p : α × β
h : p.1 ∈ s → p.2 ∉ t
⊢ p.1 ∉ s ∨ p.2 ∉ t
state_after: case pos
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
δ : Type u_4
s✝ s₁ s₂ : Set α✝
t✝ t₁ t₂ : Set β✝
a : α✝
b : β✝
α : Type u_5
β : Type u_6
s : Set α
t : Set β
p : α × β
h : p.1 ∈ s → p.2 ∉ t
fst_in_s : p.1 ∈ s
⊢ p.1 ∉ s ∨ p.2 ∉ t

case neg
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
δ : Type u_4
s✝ s₁ s₂ : Set α✝
t✝ t₁ t₂ : Set β✝
a : α✝
b : β✝
α : Type u_5
β : Type u_6
s : Set α
t : Set β
p : α × β
h : p.1 ∈ s → p.2 ∉ t
fst_in_s : p.1 ∉ s
⊢ p.1 ∉ s ∨ p.2 ∉ t

tactic: exact Or.inr (h fst_in_s)
state_before: case pos
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
δ : Type u_4
s✝ s₁ s₂ : Set α✝
t✝ t₁ t₂ : Set β✝
a : α✝
b : β✝
α : Type u_5
β : Type u_6
s : Set α
t : Set β
p : α × β
h : p.1 ∈ s → p.2 ∉ t
fst_in_s : p.1 ∈ s
⊢ p.1 ∉ s ∨ p.2 ∉ t
state_after: no goals

tactic: exact Or.inl fst_in_s
state_before: case neg
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
δ : Type u_4
s✝ s₁ s₂ : Set α✝
t✝ t₁ t₂ : Set β✝
a : α✝
b : β✝
α : Type u_5
β : Type u_6
s : Set α
t : Set β
p : α × β
h : p.1 ∈ s → p.2 ∉ t
fst_in_s : p.1 ∉ s
⊢ p.1 ∉ s ∨ p.2 ∉ t
state_after: no goals

tactic: intro fst_in_s
state_before: case h.mpr
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
δ : Type u_4
s✝ s₁ s₂ : Set α✝
t✝ t₁ t₂ : Set β✝
a : α✝
b : β✝
α : Type u_5
β : Type u_6
s : Set α
t : Set β
p : α × β
h : p.1 ∉ s ∨ p.2 ∉ t
⊢ p.1 ∈ s → p.2 ∉ t
state_after: case h.mpr
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
δ : Type u_4
s✝ s₁ s₂ : Set α✝
t✝ t₁ t₂ : Set β✝
a : α✝
b : β✝
α : Type u_5
β : Type u_6
s : Set α
t : Set β
p : α × β
h : p.1 ∉ s ∨ p.2 ∉ t
fst_in_s : p.1 ∈ s
⊢ p.2 ∉ t

tactic: simpa only [fst_in_s, not_true, false_or] using h
state_before: case h.mpr
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
δ : Type u_4
s✝ s₁ s₂ : Set α✝
t✝ t₁ t₂ : Set β✝
a : α✝
b : β✝
α : Type u_5
β : Type u_6
s : Set α
t : Set β
p : α × β
h : p.1 ∉ s ∨ p.2 ∉ t
fst_in_s : p.1 ∈ s
⊢ p.2 ∉ t
state_after: no goals