Theorem: Relation.cutExpand_iff
File: Mathlib/Logic/Hydra.lean

tactic: simp_rw [CutExpand, add_singleton_eq_iff]
state_before: α : Type u_1
r : α → α → Prop
inst✝¹ : DecidableEq α
inst✝ : IsIrrefl α r
s' s : Multiset α
⊢ CutExpand r s' s ↔ ∃ t a, (∀ a' ∈ t, r a' a) ∧ a ∈ s ∧ s' = s.erase a + t
state_after: α : Type u_1
r : α → α → Prop
inst✝¹ : DecidableEq α
inst✝ : IsIrrefl α r
s' s : Multiset α
⊢ (∃ t a, (∀ a' ∈ t, r a' a) ∧ a ∈ s + t ∧ s' = (s + t).erase a) ↔
    ∃ t a, (∀ a' ∈ t, r a' a) ∧ a ∈ s ∧ s' = s.erase a + t

tactic: refine exists₂_congr fun t a ↦ ⟨?_, ?_⟩
state_before: α : Type u_1
r : α → α → Prop
inst✝¹ : DecidableEq α
inst✝ : IsIrrefl α r
s' s : Multiset α
⊢ (∃ t a, (∀ a' ∈ t, r a' a) ∧ a ∈ s + t ∧ s' = (s + t).erase a) ↔
    ∃ t a, (∀ a' ∈ t, r a' a) ∧ a ∈ s ∧ s' = s.erase a + t
state_after: case refine_1
α : Type u_1
r : α → α → Prop
inst✝¹ : DecidableEq α
inst✝ : IsIrrefl α r
s' s t : Multiset α
a : α
⊢ (∀ a' ∈ t, r a' a) ∧ a ∈ s + t ∧ s' = (s + t).erase a → (∀ a' ∈ t, r a' a) ∧ a ∈ s ∧ s' = s.erase a + t

case refine_2
α : Type u_1
r : α → α → Prop
inst✝¹ : DecidableEq α
inst✝ : IsIrrefl α r
s' s t : Multiset α
a : α
⊢ (∀ a' ∈ t, r a' a) ∧ a ∈ s ∧ s' = s.erase a + t → (∀ a' ∈ t, r a' a) ∧ a ∈ s + t ∧ s' = (s + t).erase a

tactic: rintro ⟨ht, ha, rfl⟩
state_before: case refine_1
α : Type u_1
r : α → α → Prop
inst✝¹ : DecidableEq α
inst✝ : IsIrrefl α r
s' s t : Multiset α
a : α
⊢ (∀ a' ∈ t, r a' a) ∧ a ∈ s + t ∧ s' = (s + t).erase a → (∀ a' ∈ t, r a' a) ∧ a ∈ s ∧ s' = s.erase a + t
state_after: case refine_1.intro.intro
α : Type u_1
r : α → α → Prop
inst✝¹ : DecidableEq α
inst✝ : IsIrrefl α r
s t : Multiset α
a : α
ht : ∀ a' ∈ t, r a' a
ha : a ∈ s + t
⊢ (∀ a' ∈ t, r a' a) ∧ a ∈ s ∧ (s + t).erase a = s.erase a + t

tactic: obtain h | h := mem_add.1 ha
state_before: case refine_1.intro.intro
α : Type u_1
r : α → α → Prop
inst✝¹ : DecidableEq α
inst✝ : IsIrrefl α r
s t : Multiset α
a : α
ht : ∀ a' ∈ t, r a' a
ha : a ∈ s + t
⊢ (∀ a' ∈ t, r a' a) ∧ a ∈ s ∧ (s + t).erase a = s.erase a + t
state_after: case refine_1.intro.intro.inl
α : Type u_1
r : α → α → Prop
inst✝¹ : DecidableEq α
inst✝ : IsIrrefl α r
s t : Multiset α
a : α
ht : ∀ a' ∈ t, r a' a
ha : a ∈ s + t
h : a ∈ s
⊢ (∀ a' ∈ t, r a' a) ∧ a ∈ s ∧ (s + t).erase a = s.erase a + t

case refine_1.intro.intro.inr
α : Type u_1
r : α → α → Prop
inst✝¹ : DecidableEq α
inst✝ : IsIrrefl α r
s t : Multiset α
a : α
ht : ∀ a' ∈ t, r a' a
ha : a ∈ s + t
h : a ∈ t
⊢ (∀ a' ∈ t, r a' a) ∧ a ∈ s ∧ (s + t).erase a = s.erase a + t

tactic: exacts [⟨ht, h, erase_add_left_pos t h⟩, (@irrefl α r _ a (ht a h)).elim]
state_before: case refine_1.intro.intro.inl
α : Type u_1
r : α → α → Prop
inst✝¹ : DecidableEq α
inst✝ : IsIrrefl α r
s t : Multiset α
a : α
ht : ∀ a' ∈ t, r a' a
ha : a ∈ s + t
h : a ∈ s
⊢ (∀ a' ∈ t, r a' a) ∧ a ∈ s ∧ (s + t).erase a = s.erase a + t

case refine_1.intro.intro.inr
α : Type u_1
r : α → α → Prop
inst✝¹ : DecidableEq α
inst✝ : IsIrrefl α r
s t : Multiset α
a : α
ht : ∀ a' ∈ t, r a' a
ha : a ∈ s + t
h : a ∈ t
⊢ (∀ a' ∈ t, r a' a) ∧ a ∈ s ∧ (s + t).erase a = s.erase a + t
state_after: no goals

tactic: rintro ⟨ht, h, rfl⟩
state_before: case refine_2
α : Type u_1
r : α → α → Prop
inst✝¹ : DecidableEq α
inst✝ : IsIrrefl α r
s' s t : Multiset α
a : α
⊢ (∀ a' ∈ t, r a' a) ∧ a ∈ s ∧ s' = s.erase a + t → (∀ a' ∈ t, r a' a) ∧ a ∈ s + t ∧ s' = (s + t).erase a
state_after: case refine_2.intro.intro
α : Type u_1
r : α → α → Prop
inst✝¹ : DecidableEq α
inst✝ : IsIrrefl α r
s t : Multiset α
a : α
ht : ∀ a' ∈ t, r a' a
h : a ∈ s
⊢ (∀ a' ∈ t, r a' a) ∧ a ∈ s + t ∧ s.erase a + t = (s + t).erase a

tactic: exact ⟨ht, mem_add.2 (Or.inl h), (erase_add_left_pos t h).symm⟩
state_before: case refine_2.intro.intro
α : Type u_1
r : α → α → Prop
inst✝¹ : DecidableEq α
inst✝ : IsIrrefl α r
s t : Multiset α
a : α
ht : ∀ a' ∈ t, r a' a
h : a ∈ s
⊢ (∀ a' ∈ t, r a' a) ∧ a ∈ s + t ∧ s.erase a + t = (s + t).erase a
state_after: no goals