Theorem: SimpleGraph.cliqueSet_map
File: Mathlib/Combinatorics/SimpleGraph/Clique.lean

tactic: ext s
state_before: α : Type u_1
β : Type u_2
G✝ H : SimpleGraph α
n : ℕ
a b c : α
s : Finset α
hn : n ≠ 1
G : SimpleGraph α
f : α ↪ β
⊢ (SimpleGraph.map f G).cliqueSet n = map f '' G.cliqueSet n
state_after: case h
α : Type u_1
β : Type u_2
G✝ H : SimpleGraph α
n : ℕ
a b c : α
s✝ : Finset α
hn : n ≠ 1
G : SimpleGraph α
f : α ↪ β
s : Finset β
⊢ s ∈ (SimpleGraph.map f G).cliqueSet n ↔ s ∈ map f '' G.cliqueSet n

tactic: constructor
state_before: case h
α : Type u_1
β : Type u_2
G✝ H : SimpleGraph α
n : ℕ
a b c : α
s✝ : Finset α
hn : n ≠ 1
G : SimpleGraph α
f : α ↪ β
s : Finset β
⊢ s ∈ (SimpleGraph.map f G).cliqueSet n ↔ s ∈ map f '' G.cliqueSet n
state_after: case h.mp
α : Type u_1
β : Type u_2
G✝ H : SimpleGraph α
n : ℕ
a b c : α
s✝ : Finset α
hn : n ≠ 1
G : SimpleGraph α
f : α ↪ β
s : Finset β
⊢ s ∈ (SimpleGraph.map f G).cliqueSet n → s ∈ map f '' G.cliqueSet n

case h.mpr
α : Type u_1
β : Type u_2
G✝ H : SimpleGraph α
n : ℕ
a b c : α
s✝ : Finset α
hn : n ≠ 1
G : SimpleGraph α
f : α ↪ β
s : Finset β
⊢ s ∈ map f '' G.cliqueSet n → s ∈ (SimpleGraph.map f G).cliqueSet n

tactic: rintro ⟨hs, rfl⟩
state_before: case h.mp
α : Type u_1
β : Type u_2
G✝ H : SimpleGraph α
n : ℕ
a b c : α
s✝ : Finset α
hn : n ≠ 1
G : SimpleGraph α
f : α ↪ β
s : Finset β
⊢ s ∈ (SimpleGraph.map f G).cliqueSet n → s ∈ map f '' G.cliqueSet n
state_after: case h.mp.mk
α : Type u_1
β : Type u_2
G✝ H : SimpleGraph α
a b c : α
s✝ : Finset α
G : SimpleGraph α
f : α ↪ β
s : Finset β
hs : (SimpleGraph.map f G).IsClique ↑s
hn : s.card ≠ 1
⊢ s ∈ map f '' G.cliqueSet s.card

tactic: have hs' : (s.preimage f f.injective.injOn).map f = s := by
  classical
  rw [map_eq_image, image_preimage, filter_true_of_mem]
  rintro a ha
  obtain ⟨b, hb, hba⟩ := exists_mem_ne (hn.lt_of_le' <| Finset.card_pos.2 ⟨a, ha⟩) a
  obtain ⟨c, _, _, hc, _⟩ := hs ha hb hba.symm
  exact ⟨c, hc⟩
state_before: case h.mp.mk
α : Type u_1
β : Type u_2
G✝ H : SimpleGraph α
a b c : α
s✝ : Finset α
G : SimpleGraph α
f : α ↪ β
s : Finset β
hs : (SimpleGraph.map f G).IsClique ↑s
hn : s.card ≠ 1
⊢ s ∈ map f '' G.cliqueSet s.card
state_after: case h.mp.mk
α : Type u_1
β : Type u_2
G✝ H : SimpleGraph α
a b c : α
s✝ : Finset α
G : SimpleGraph α
f : α ↪ β
s : Finset β
hs : (SimpleGraph.map f G).IsClique ↑s
hn : s.card ≠ 1
hs' : map f (s.preimage ⇑f ⋯) = s
⊢ s ∈ map f '' G.cliqueSet s.card

tactic: refine ⟨s.preimage f f.injective.injOn, ⟨?_, by rw [← card_map f, hs']⟩, hs'⟩
state_before: case h.mp.mk
α : Type u_1
β : Type u_2
G✝ H : SimpleGraph α
a b c : α
s✝ : Finset α
G : SimpleGraph α
f : α ↪ β
s : Finset β
hs : (SimpleGraph.map f G).IsClique ↑s
hn : s.card ≠ 1
hs' : map f (s.preimage ⇑f ⋯) = s
⊢ s ∈ map f '' G.cliqueSet s.card
state_after: case h.mp.mk
α : Type u_1
β : Type u_2
G✝ H : SimpleGraph α
a b c : α
s✝ : Finset α
G : SimpleGraph α
f : α ↪ β
s : Finset β
hs : (SimpleGraph.map f G).IsClique ↑s
hn : s.card ≠ 1
hs' : map f (s.preimage ⇑f ⋯) = s
⊢ G.IsClique ↑(s.preimage ⇑f ⋯)

tactic: rw [coe_preimage]
state_before: case h.mp.mk
α : Type u_1
β : Type u_2
G✝ H : SimpleGraph α
a b c : α
s✝ : Finset α
G : SimpleGraph α
f : α ↪ β
s : Finset β
hs : (SimpleGraph.map f G).IsClique ↑s
hn : s.card ≠ 1
hs' : map f (s.preimage ⇑f ⋯) = s
⊢ G.IsClique ↑(s.preimage ⇑f ⋯)
state_after: case h.mp.mk
α : Type u_1
β : Type u_2
G✝ H : SimpleGraph α
a b c : α
s✝ : Finset α
G : SimpleGraph α
f : α ↪ β
s : Finset β
hs : (SimpleGraph.map f G).IsClique ↑s
hn : s.card ≠ 1
hs' : map f (s.preimage ⇑f ⋯) = s
⊢ G.IsClique (⇑f ⁻¹' ↑s)

tactic: exact fun a ha b hb hab => map_adj_apply.1 (hs ha hb <| f.injective.ne hab)
state_before: case h.mp.mk
α : Type u_1
β : Type u_2
G✝ H : SimpleGraph α
a b c : α
s✝ : Finset α
G : SimpleGraph α
f : α ↪ β
s : Finset β
hs : (SimpleGraph.map f G).IsClique ↑s
hn : s.card ≠ 1
hs' : map f (s.preimage ⇑f ⋯) = s
⊢ G.IsClique (⇑f ⁻¹' ↑s)
state_after: no goals

tactic: classical
rw [map_eq_image, image_preimage, filter_true_of_mem]
rintro a ha
obtain ⟨b, hb, hba⟩ := exists_mem_ne (hn.lt_of_le' <| Finset.card_pos.2 ⟨a, ha⟩) a
obtain ⟨c, _, _, hc, _⟩ := hs ha hb hba.symm
exact ⟨c, hc⟩
state_before: α : Type u_1
β : Type u_2
G✝ H : SimpleGraph α
a b c : α
s✝ : Finset α
G : SimpleGraph α
f : α ↪ β
s : Finset β
hs : (SimpleGraph.map f G).IsClique ↑s
hn : s.card ≠ 1
⊢ map f (s.preimage ⇑f ⋯) = s
state_after: no goals

tactic: rw [map_eq_image, image_preimage, filter_true_of_mem]
state_before: α : Type u_1
β : Type u_2
G✝ H : SimpleGraph α
a b c : α
s✝ : Finset α
G : SimpleGraph α
f : α ↪ β
s : Finset β
hs : (SimpleGraph.map f G).IsClique ↑s
hn : s.card ≠ 1
⊢ map f (s.preimage ⇑f ⋯) = s
state_after: α : Type u_1
β : Type u_2
G✝ H : SimpleGraph α
a b c : α
s✝ : Finset α
G : SimpleGraph α
f : α ↪ β
s : Finset β
hs : (SimpleGraph.map f G).IsClique ↑s
hn : s.card ≠ 1
⊢ ∀ x ∈ s, x ∈ Set.range ⇑f

tactic: rintro a ha
state_before: α : Type u_1
β : Type u_2
G✝ H : SimpleGraph α
a b c : α
s✝ : Finset α
G : SimpleGraph α
f : α ↪ β
s : Finset β
hs : (SimpleGraph.map f G).IsClique ↑s
hn : s.card ≠ 1
⊢ ∀ x ∈ s, x ∈ Set.range ⇑f
state_after: α : Type u_1
β : Type u_2
G✝ H : SimpleGraph α
a✝ b c : α
s✝ : Finset α
G : SimpleGraph α
f : α ↪ β
s : Finset β
hs : (SimpleGraph.map f G).IsClique ↑s
hn : s.card ≠ 1
a : β
ha : a ∈ s
⊢ a ∈ Set.range ⇑f

tactic: obtain ⟨b, hb, hba⟩ := exists_mem_ne (hn.lt_of_le' <| Finset.card_pos.2 ⟨a, ha⟩) a
state_before: α : Type u_1
β : Type u_2
G✝ H : SimpleGraph α
a✝ b c : α
s✝ : Finset α
G : SimpleGraph α
f : α ↪ β
s : Finset β
hs : (SimpleGraph.map f G).IsClique ↑s
hn : s.card ≠ 1
a : β
ha : a ∈ s
⊢ a ∈ Set.range ⇑f
state_after: case intro.intro
α : Type u_1
β : Type u_2
G✝ H : SimpleGraph α
a✝ b✝ c : α
s✝ : Finset α
G : SimpleGraph α
f : α ↪ β
s : Finset β
hs : (SimpleGraph.map f G).IsClique ↑s
hn : s.card ≠ 1
a : β
ha : a ∈ s
b : β
hb : b ∈ s
hba : b ≠ a
⊢ a ∈ Set.range ⇑f

tactic: obtain ⟨c, _, _, hc, _⟩ := hs ha hb hba.symm
state_before: case intro.intro
α : Type u_1
β : Type u_2
G✝ H : SimpleGraph α
a✝ b✝ c : α
s✝ : Finset α
G : SimpleGraph α
f : α ↪ β
s : Finset β
hs : (SimpleGraph.map f G).IsClique ↑s
hn : s.card ≠ 1
a : β
ha : a ∈ s
b : β
hb : b ∈ s
hba : b ≠ a
⊢ a ∈ Set.range ⇑f
state_after: case intro.intro.intro.intro.intro.intro
α : Type u_1
β : Type u_2
G✝ H : SimpleGraph α
a✝ b✝ c✝ : α
s✝ : Finset α
G : SimpleGraph α
f : α ↪ β
s : Finset β
hs : (SimpleGraph.map f G).IsClique ↑s
hn : s.card ≠ 1
a : β
ha : a ∈ s
b : β
hb : b ∈ s
hba : b ≠ a
c w✝ : α
left✝ : G.Adj c w✝
hc : f c = a
right✝ : f w✝ = b
⊢ a ∈ Set.range ⇑f

tactic: exact ⟨c, hc⟩
state_before: case intro.intro.intro.intro.intro.intro
α : Type u_1
β : Type u_2
G✝ H : SimpleGraph α
a✝ b✝ c✝ : α
s✝ : Finset α
G : SimpleGraph α
f : α ↪ β
s : Finset β
hs : (SimpleGraph.map f G).IsClique ↑s
hn : s.card ≠ 1
a : β
ha : a ∈ s
b : β
hb : b ∈ s
hba : b ≠ a
c w✝ : α
left✝ : G.Adj c w✝
hc : f c = a
right✝ : f w✝ = b
⊢ a ∈ Set.range ⇑f
state_after: no goals

tactic: rw [← card_map f, hs']
state_before: α : Type u_1
β : Type u_2
G✝ H : SimpleGraph α
a b c : α
s✝ : Finset α
G : SimpleGraph α
f : α ↪ β
s : Finset β
hs : (SimpleGraph.map f G).IsClique ↑s
hn : s.card ≠ 1
hs' : map f (s.preimage ⇑f ⋯) = s
⊢ (s.preimage ⇑f ⋯).card = s.card
state_after: no goals

tactic: rintro ⟨s, hs, rfl⟩
state_before: case h.mpr
α : Type u_1
β : Type u_2
G✝ H : SimpleGraph α
n : ℕ
a b c : α
s✝ : Finset α
hn : n ≠ 1
G : SimpleGraph α
f : α ↪ β
s : Finset β
⊢ s ∈ map f '' G.cliqueSet n → s ∈ (SimpleGraph.map f G).cliqueSet n
state_after: case h.mpr.intro.intro
α : Type u_1
β : Type u_2
G✝ H : SimpleGraph α
n : ℕ
a b c : α
s✝ : Finset α
hn : n ≠ 1
G : SimpleGraph α
f : α ↪ β
s : Finset α
hs : s ∈ G.cliqueSet n
⊢ map f s ∈ (SimpleGraph.map f G).cliqueSet n

tactic: exact hs.map
state_before: case h.mpr.intro.intro
α : Type u_1
β : Type u_2
G✝ H : SimpleGraph α
n : ℕ
a b c : α
s✝ : Finset α
hn : n ≠ 1
G : SimpleGraph α
f : α ↪ β
s : Finset α
hs : s ∈ G.cliqueSet n
⊢ map f s ∈ (SimpleGraph.map f G).cliqueSet n
state_after: no goals