Theorem: MulAction.IsBlock.isBlockSystem
File: Mathlib/GroupTheory/GroupAction/Blocks.lean

tactic: refine ⟨⟨?nonempty, ?cover⟩, ?mem_blocks⟩
state_before: G : Type u_1
inst✝¹ : Group G
X : Type u_2
inst✝ : MulAction G X
hGX : IsPretransitive G X
B : Set X
hB : IsBlock G B
hBe : B.Nonempty
⊢ IsBlockSystem G (Set.range fun g => g • B)
state_after: case nonempty
G : Type u_1
inst✝¹ : Group G
X : Type u_2
inst✝ : MulAction G X
hGX : IsPretransitive G X
B : Set X
hB : IsBlock G B
hBe : B.Nonempty
⊢ ∅ ∉ Set.range fun g => g • B

case cover
G : Type u_1
inst✝¹ : Group G
X : Type u_2
inst✝ : MulAction G X
hGX : IsPretransitive G X
B : Set X
hB : IsBlock G B
hBe : B.Nonempty
⊢ ∀ (a : X), ∃! b, (b ∈ Set.range fun g => g • B) ∧ a ∈ b

case mem_blocks
G : Type u_1
inst✝¹ : Group G
X : Type u_2
inst✝ : MulAction G X
hGX : IsPretransitive G X
B : Set X
hB : IsBlock G B
hBe : B.Nonempty
⊢ ∀ b ∈ Set.range fun g => g • B, IsBlock G b

tactic: case mem_blocks => rintro B' ⟨g, rfl⟩; exact hB.translate g
state_before: case nonempty
G : Type u_1
inst✝¹ : Group G
X : Type u_2
inst✝ : MulAction G X
hGX : IsPretransitive G X
B : Set X
hB : IsBlock G B
hBe : B.Nonempty
⊢ ∅ ∉ Set.range fun g => g • B

case cover
G : Type u_1
inst✝¹ : Group G
X : Type u_2
inst✝ : MulAction G X
hGX : IsPretransitive G X
B : Set X
hB : IsBlock G B
hBe : B.Nonempty
⊢ ∀ (a : X), ∃! b, (b ∈ Set.range fun g => g • B) ∧ a ∈ b

case mem_blocks
G : Type u_1
inst✝¹ : Group G
X : Type u_2
inst✝ : MulAction G X
hGX : IsPretransitive G X
B : Set X
hB : IsBlock G B
hBe : B.Nonempty
⊢ ∀ b ∈ Set.range fun g => g • B, IsBlock G b
state_after: case nonempty
G : Type u_1
inst✝¹ : Group G
X : Type u_2
inst✝ : MulAction G X
hGX : IsPretransitive G X
B : Set X
hB : IsBlock G B
hBe : B.Nonempty
⊢ ∅ ∉ Set.range fun g => g • B

case cover
G : Type u_1
inst✝¹ : Group G
X : Type u_2
inst✝ : MulAction G X
hGX : IsPretransitive G X
B : Set X
hB : IsBlock G B
hBe : B.Nonempty
⊢ ∀ (a : X), ∃! b, (b ∈ Set.range fun g => g • B) ∧ a ∈ b

tactic: rintro B' ⟨g, rfl⟩
state_before: G : Type u_1
inst✝¹ : Group G
X : Type u_2
inst✝ : MulAction G X
hGX : IsPretransitive G X
B : Set X
hB : IsBlock G B
hBe : B.Nonempty
⊢ ∀ b ∈ Set.range fun g => g • B, IsBlock G b
state_after: case intro
G : Type u_1
inst✝¹ : Group G
X : Type u_2
inst✝ : MulAction G X
hGX : IsPretransitive G X
B : Set X
hB : IsBlock G B
hBe : B.Nonempty
g : G
⊢ IsBlock G ((fun g => g • B) g)

tactic: exact hB.translate g
state_before: case intro
G : Type u_1
inst✝¹ : Group G
X : Type u_2
inst✝ : MulAction G X
hGX : IsPretransitive G X
B : Set X
hB : IsBlock G B
hBe : B.Nonempty
g : G
⊢ IsBlock G ((fun g => g • B) g)
state_after: no goals

tactic: simp only [Set.mem_range, not_exists]
state_before: case nonempty
G : Type u_1
inst✝¹ : Group G
X : Type u_2
inst✝ : MulAction G X
hGX : IsPretransitive G X
B : Set X
hB : IsBlock G B
hBe : B.Nonempty
⊢ ∅ ∉ Set.range fun g => g • B
state_after: case nonempty
G : Type u_1
inst✝¹ : Group G
X : Type u_2
inst✝ : MulAction G X
hGX : IsPretransitive G X
B : Set X
hB : IsBlock G B
hBe : B.Nonempty
⊢ ∀ (x : G), ¬x • B = ∅

tactic: intro g hg
state_before: case nonempty
G : Type u_1
inst✝¹ : Group G
X : Type u_2
inst✝ : MulAction G X
hGX : IsPretransitive G X
B : Set X
hB : IsBlock G B
hBe : B.Nonempty
⊢ ∀ (x : G), ¬x • B = ∅
state_after: case nonempty
G : Type u_1
inst✝¹ : Group G
X : Type u_2
inst✝ : MulAction G X
hGX : IsPretransitive G X
B : Set X
hB : IsBlock G B
hBe : B.Nonempty
g : G
hg : g • B = ∅
⊢ False

tactic: apply hBe.ne_empty
state_before: case nonempty
G : Type u_1
inst✝¹ : Group G
X : Type u_2
inst✝ : MulAction G X
hGX : IsPretransitive G X
B : Set X
hB : IsBlock G B
hBe : B.Nonempty
g : G
hg : g • B = ∅
⊢ False
state_after: case nonempty
G : Type u_1
inst✝¹ : Group G
X : Type u_2
inst✝ : MulAction G X
hGX : IsPretransitive G X
B : Set X
hB : IsBlock G B
hBe : B.Nonempty
g : G
hg : g • B = ∅
⊢ B = ∅

tactic: simpa only [Set.smul_set_eq_empty] using hg
state_before: case nonempty
G : Type u_1
inst✝¹ : Group G
X : Type u_2
inst✝ : MulAction G X
hGX : IsPretransitive G X
B : Set X
hB : IsBlock G B
hBe : B.Nonempty
g : G
hg : g • B = ∅
⊢ B = ∅
state_after: no goals

tactic: intro a
state_before: case cover
G : Type u_1
inst✝¹ : Group G
X : Type u_2
inst✝ : MulAction G X
hGX : IsPretransitive G X
B : Set X
hB : IsBlock G B
hBe : B.Nonempty
⊢ ∀ (a : X), ∃! b, (b ∈ Set.range fun g => g • B) ∧ a ∈ b
state_after: case cover
G : Type u_1
inst✝¹ : Group G
X : Type u_2
inst✝ : MulAction G X
hGX : IsPretransitive G X
B : Set X
hB : IsBlock G B
hBe : B.Nonempty
a : X
⊢ ∃! b, (b ∈ Set.range fun g => g • B) ∧ a ∈ b

tactic: obtain ⟨b : X, hb : b ∈ B⟩ := hBe
state_before: case cover
G : Type u_1
inst✝¹ : Group G
X : Type u_2
inst✝ : MulAction G X
hGX : IsPretransitive G X
B : Set X
hB : IsBlock G B
hBe : B.Nonempty
a : X
⊢ ∃! b, (b ∈ Set.range fun g => g • B) ∧ a ∈ b
state_after: case cover.intro
G : Type u_1
inst✝¹ : Group G
X : Type u_2
inst✝ : MulAction G X
hGX : IsPretransitive G X
B : Set X
hB : IsBlock G B
a b : X
hb : b ∈ B
⊢ ∃! b, (b ∈ Set.range fun g => g • B) ∧ a ∈ b

tactic: obtain ⟨g, rfl⟩ := exists_smul_eq G b a
state_before: case cover.intro
G : Type u_1
inst✝¹ : Group G
X : Type u_2
inst✝ : MulAction G X
hGX : IsPretransitive G X
B : Set X
hB : IsBlock G B
a b : X
hb : b ∈ B
⊢ ∃! b, (b ∈ Set.range fun g => g • B) ∧ a ∈ b
state_after: case cover.intro.intro
G : Type u_1
inst✝¹ : Group G
X : Type u_2
inst✝ : MulAction G X
hGX : IsPretransitive G X
B : Set X
hB : IsBlock G B
b : X
hb : b ∈ B
g : G
⊢ ∃! b_1, (b_1 ∈ Set.range fun g => g • B) ∧ g • b ∈ b_1

tactic: use g • B
state_before: case cover.intro.intro
G : Type u_1
inst✝¹ : Group G
X : Type u_2
inst✝ : MulAction G X
hGX : IsPretransitive G X
B : Set X
hB : IsBlock G B
b : X
hb : b ∈ B
g : G
⊢ ∃! b_1, (b_1 ∈ Set.range fun g => g • B) ∧ g • b ∈ b_1
state_after: case h
G : Type u_1
inst✝¹ : Group G
X : Type u_2
inst✝ : MulAction G X
hGX : IsPretransitive G X
B : Set X
hB : IsBlock G B
b : X
hb : b ∈ B
g : G
⊢ (fun b_1 => (b_1 ∈ Set.range fun g => g • B) ∧ g • b ∈ b_1) (g • B) ∧
    ∀ (y : Set X), (fun b_1 => (b_1 ∈ Set.range fun g => g • B) ∧ g • b ∈ b_1) y → y = g • B

tactic: simp only [Set.smul_mem_smul_set_iff, hb, exists_unique_iff_exists, Set.mem_range,
  exists_apply_eq_apply, exists_const, exists_prop, and_imp, forall_exists_index,
  forall_apply_eq_imp_iff, true_and]
state_before: case h
G : Type u_1
inst✝¹ : Group G
X : Type u_2
inst✝ : MulAction G X
hGX : IsPretransitive G X
B : Set X
hB : IsBlock G B
b : X
hb : b ∈ B
g : G
⊢ (fun b_1 => (b_1 ∈ Set.range fun g => g • B) ∧ g • b ∈ b_1) (g • B) ∧
    ∀ (y : Set X), (fun b_1 => (b_1 ∈ Set.range fun g => g • B) ∧ g • b ∈ b_1) y → y = g • B
state_after: case h
G : Type u_1
inst✝¹ : Group G
X : Type u_2
inst✝ : MulAction G X
hGX : IsPretransitive G X
B : Set X
hB : IsBlock G B
b : X
hb : b ∈ B
g : G
⊢ ∀ (a : G), g • b ∈ a • B → a • B = g • B

tactic: intro g' ha
state_before: case h
G : Type u_1
inst✝¹ : Group G
X : Type u_2
inst✝ : MulAction G X
hGX : IsPretransitive G X
B : Set X
hB : IsBlock G B
b : X
hb : b ∈ B
g : G
⊢ ∀ (a : G), g • b ∈ a • B → a • B = g • B
state_after: case h
G : Type u_1
inst✝¹ : Group G
X : Type u_2
inst✝ : MulAction G X
hGX : IsPretransitive G X
B : Set X
hB : IsBlock G B
b : X
hb : b ∈ B
g g' : G
ha : g • b ∈ g' • B
⊢ g' • B = g • B

tactic: apply (IsBlock.def.mp hB g' g).resolve_right
state_before: case h
G : Type u_1
inst✝¹ : Group G
X : Type u_2
inst✝ : MulAction G X
hGX : IsPretransitive G X
B : Set X
hB : IsBlock G B
b : X
hb : b ∈ B
g g' : G
ha : g • b ∈ g' • B
⊢ g' • B = g • B
state_after: case h
G : Type u_1
inst✝¹ : Group G
X : Type u_2
inst✝ : MulAction G X
hGX : IsPretransitive G X
B : Set X
hB : IsBlock G B
b : X
hb : b ∈ B
g g' : G
ha : g • b ∈ g' • B
⊢ ¬Disjoint (g' • B) (g • B)

tactic: rw [Set.not_disjoint_iff]
state_before: case h
G : Type u_1
inst✝¹ : Group G
X : Type u_2
inst✝ : MulAction G X
hGX : IsPretransitive G X
B : Set X
hB : IsBlock G B
b : X
hb : b ∈ B
g g' : G
ha : g • b ∈ g' • B
⊢ ¬Disjoint (g' • B) (g • B)
state_after: case h
G : Type u_1
inst✝¹ : Group G
X : Type u_2
inst✝ : MulAction G X
hGX : IsPretransitive G X
B : Set X
hB : IsBlock G B
b : X
hb : b ∈ B
g g' : G
ha : g • b ∈ g' • B
⊢ ∃ x ∈ g' • B, x ∈ g • B

tactic: refine ⟨g • b, ha, ⟨b, hb, rfl⟩⟩
state_before: case h
G : Type u_1
inst✝¹ : Group G
X : Type u_2
inst✝ : MulAction G X
hGX : IsPretransitive G X
B : Set X
hB : IsBlock G B
b : X
hb : b ∈ B
g g' : G
ha : g • b ∈ g' • B
⊢ ∃ x ∈ g' • B, x ∈ g • B
state_after: no goals