Theorem: Lists.Equiv.trans
File: Mathlib/SetTheory/Lists.lean

tactic: let trans := fun l₁ : Lists α => ∀ ⦃l₂ l₃⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
state_before: α : Type u_1
⊢ ∀ {l₁ l₂ l₃ : Lists α}, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
state_after: α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
⊢ ∀ {l₁ l₂ l₃ : Lists α}, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃

tactic: suffices PProd (∀ l₁, trans l₁) (∀ (l : Lists' α true), ∀ l' ∈ l.toList, trans l') by exact this.1
state_before: α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
⊢ ∀ {l₁ l₂ l₃ : Lists α}, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
state_after: α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
⊢ PProd (∀ (l₁ : Lists α), trans l₁) (∀ (l : Lists' α true), ∀ l' ∈ l.toList, trans l')

tactic: apply inductionMut
state_before: α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
⊢ PProd (∀ (l₁ : Lists α), trans l₁) (∀ (l : Lists' α true), ∀ l' ∈ l.toList, trans l')
state_after: case C0
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
⊢ ∀ (a : α), trans (atom a)

case C1
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
⊢ ∀ (l : Lists' α true), (∀ l' ∈ l.toList, trans l') → trans (of' l)

case D0
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
⊢ ∀ l' ∈ Lists'.nil.toList, trans l'

case D1
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
⊢ ∀ (a : Lists α) (l : Lists' α true), trans a → (∀ l' ∈ l.toList, trans l') → ∀ l' ∈ (Lists'.cons a l).toList, trans l'

tactic: exact this.1
state_before: α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
this : PProd (∀ (l₁ : Lists α), trans l₁) (∀ (l : Lists' α true), ∀ l' ∈ l.toList, trans l')
⊢ ∀ {l₁ l₂ l₃ : Lists α}, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
state_after: no goals

tactic: intro a l₂ l₃ h₁ h₂
state_before: case C0
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
⊢ ∀ (a : α), trans (atom a)
state_after: case C0
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
a : α
l₂ l₃ : Lists α
h₁ : atom a ~ l₂
h₂ : l₂ ~ l₃
⊢ atom a ~ l₃

tactic: rwa [← equiv_atom.1 h₁] at h₂
state_before: case C0
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
a : α
l₂ l₃ : Lists α
h₁ : atom a ~ l₂
h₂ : l₂ ~ l₃
⊢ atom a ~ l₃
state_after: no goals

tactic: intro l₁ IH l₂ l₃ h₁ h₂
state_before: case C1
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
⊢ ∀ (l : Lists' α true), (∀ l' ∈ l.toList, trans l') → trans (of' l)
state_after: case C1
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
l₁ : Lists' α true
IH : ∀ l' ∈ l₁.toList, trans l'
l₂ l₃ : Lists α
h₁ : of' l₁ ~ l₂
h₂ : l₂ ~ l₃
⊢ of' l₁ ~ l₃

tactic: have h₁' := h₁
state_before: case C1
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
l₁ : Lists' α true
IH : ∀ l' ∈ l₁.toList, trans l'
l₂ l₃ : Lists α
h₁ : of' l₁ ~ l₂
h₂ : l₂ ~ l₃
⊢ of' l₁ ~ l₃
state_after: case C1
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
l₁ : Lists' α true
IH : ∀ l' ∈ l₁.toList, trans l'
l₂ l₃ : Lists α
h₁ : of' l₁ ~ l₂
h₂ : l₂ ~ l₃
h₁' : of' l₁ ~ l₂
⊢ of' l₁ ~ l₃

tactic: have h₂' := h₂
state_before: case C1
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
l₁ : Lists' α true
IH : ∀ l' ∈ l₁.toList, trans l'
l₂ l₃ : Lists α
h₁ : of' l₁ ~ l₂
h₂ : l₂ ~ l₃
h₁' : of' l₁ ~ l₂
⊢ of' l₁ ~ l₃
state_after: case C1
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
l₁ : Lists' α true
IH : ∀ l' ∈ l₁.toList, trans l'
l₂ l₃ : Lists α
h₁ : of' l₁ ~ l₂
h₂ : l₂ ~ l₃
h₁' : of' l₁ ~ l₂
h₂' : l₂ ~ l₃
⊢ of' l₁ ~ l₃

tactic: cases' h₁ with _ _ l₂
state_before: case C1
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
l₁ : Lists' α true
IH : ∀ l' ∈ l₁.toList, trans l'
l₂ l₃ : Lists α
h₁ : of' l₁ ~ l₂
h₂ : l₂ ~ l₃
h₁' : of' l₁ ~ l₂
h₂' : l₂ ~ l₃
⊢ of' l₁ ~ l₃
state_after: case C1.refl
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
l₁ : Lists' α true
IH : ∀ l' ∈ l₁.toList, trans l'
l₃ : Lists α
h₂ : of' l₁ ~ l₃
h₁' : of' l₁ ~ of' l₁
h₂' : of' l₁ ~ l₃
⊢ of' l₁ ~ l₃

case C1.antisymm
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
l₁ : Lists' α true
IH : ∀ l' ∈ l₁.toList, trans l'
l₃ : Lists α
l₂ : Lists' α true
a✝¹ : l₁.Subset l₂
a✝ : l₂.Subset l₁
h₂ : ⟨true, l₂⟩ ~ l₃
h₁' : of' l₁ ~ ⟨true, l₂⟩
h₂' : ⟨true, l₂⟩ ~ l₃
⊢ of' l₁ ~ l₃

tactic: cases' h₂ with _ _ l₃
state_before: case C1.antisymm
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
l₁ : Lists' α true
IH : ∀ l' ∈ l₁.toList, trans l'
l₃ : Lists α
l₂ : Lists' α true
a✝¹ : l₁.Subset l₂
a✝ : l₂.Subset l₁
h₂ : ⟨true, l₂⟩ ~ l₃
h₁' : of' l₁ ~ ⟨true, l₂⟩
h₂' : ⟨true, l₂⟩ ~ l₃
⊢ of' l₁ ~ l₃
state_after: case C1.antisymm.refl
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
l₁ : Lists' α true
IH : ∀ l' ∈ l₁.toList, trans l'
l₂ : Lists' α true
a✝¹ : l₁.Subset l₂
a✝ : l₂.Subset l₁
h₁' : of' l₁ ~ ⟨true, l₂⟩
h₂' : ⟨true, l₂⟩ ~ ⟨true, l₂⟩
⊢ of' l₁ ~ ⟨true, l₂⟩

case C1.antisymm.antisymm
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
l₁ : Lists' α true
IH : ∀ l' ∈ l₁.toList, trans l'
l₂ : Lists' α true
a✝³ : l₁.Subset l₂
a✝² : l₂.Subset l₁
h₁' : of' l₁ ~ ⟨true, l₂⟩
l₃ : Lists' α true
a✝¹ : l₂.Subset l₃
a✝ : l₃.Subset l₂
h₂' : ⟨true, l₂⟩ ~ ⟨true, l₃⟩
⊢ of' l₁ ~ ⟨true, l₃⟩

tactic: cases' Equiv.antisymm_iff.1 h₁' with hl₁ hr₁
state_before: case C1.antisymm.antisymm
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
l₁ : Lists' α true
IH : ∀ l' ∈ l₁.toList, trans l'
l₂ : Lists' α true
a✝³ : l₁.Subset l₂
a✝² : l₂.Subset l₁
h₁' : of' l₁ ~ ⟨true, l₂⟩
l₃ : Lists' α true
a✝¹ : l₂.Subset l₃
a✝ : l₃.Subset l₂
h₂' : ⟨true, l₂⟩ ~ ⟨true, l₃⟩
⊢ of' l₁ ~ ⟨true, l₃⟩
state_after: case C1.antisymm.antisymm.intro
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
l₁ : Lists' α true
IH : ∀ l' ∈ l₁.toList, trans l'
l₂ : Lists' α true
a✝³ : l₁.Subset l₂
a✝² : l₂.Subset l₁
h₁' : of' l₁ ~ ⟨true, l₂⟩
l₃ : Lists' α true
a✝¹ : l₂.Subset l₃
a✝ : l₃.Subset l₂
h₂' : ⟨true, l₂⟩ ~ ⟨true, l₃⟩
hl₁ : l₁ ⊆ l₂
hr₁ : l₂ ⊆ l₁
⊢ of' l₁ ~ ⟨true, l₃⟩

tactic: cases' Equiv.antisymm_iff.1 h₂' with hl₂ hr₂
state_before: case C1.antisymm.antisymm.intro
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
l₁ : Lists' α true
IH : ∀ l' ∈ l₁.toList, trans l'
l₂ : Lists' α true
a✝³ : l₁.Subset l₂
a✝² : l₂.Subset l₁
h₁' : of' l₁ ~ ⟨true, l₂⟩
l₃ : Lists' α true
a✝¹ : l₂.Subset l₃
a✝ : l₃.Subset l₂
h₂' : ⟨true, l₂⟩ ~ ⟨true, l₃⟩
hl₁ : l₁ ⊆ l₂
hr₁ : l₂ ⊆ l₁
⊢ of' l₁ ~ ⟨true, l₃⟩
state_after: case C1.antisymm.antisymm.intro.intro
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
l₁ : Lists' α true
IH : ∀ l' ∈ l₁.toList, trans l'
l₂ : Lists' α true
a✝³ : l₁.Subset l₂
a✝² : l₂.Subset l₁
h₁' : of' l₁ ~ ⟨true, l₂⟩
l₃ : Lists' α true
a✝¹ : l₂.Subset l₃
a✝ : l₃.Subset l₂
h₂' : ⟨true, l₂⟩ ~ ⟨true, l₃⟩
hl₁ : l₁ ⊆ l₂
hr₁ : l₂ ⊆ l₁
hl₂ : l₂ ⊆ l₃
hr₂ : l₃ ⊆ l₂
⊢ of' l₁ ~ ⟨true, l₃⟩

tactic: apply Equiv.antisymm_iff.2
state_before: case C1.antisymm.antisymm.intro.intro
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
l₁ : Lists' α true
IH : ∀ l' ∈ l₁.toList, trans l'
l₂ : Lists' α true
a✝³ : l₁.Subset l₂
a✝² : l₂.Subset l₁
h₁' : of' l₁ ~ ⟨true, l₂⟩
l₃ : Lists' α true
a✝¹ : l₂.Subset l₃
a✝ : l₃.Subset l₂
h₂' : ⟨true, l₂⟩ ~ ⟨true, l₃⟩
hl₁ : l₁ ⊆ l₂
hr₁ : l₂ ⊆ l₁
hl₂ : l₂ ⊆ l₃
hr₂ : l₃ ⊆ l₂
⊢ of' l₁ ~ ⟨true, l₃⟩
state_after: case C1.antisymm.antisymm.intro.intro
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
l₁ : Lists' α true
IH : ∀ l' ∈ l₁.toList, trans l'
l₂ : Lists' α true
a✝³ : l₁.Subset l₂
a✝² : l₂.Subset l₁
h₁' : of' l₁ ~ ⟨true, l₂⟩
l₃ : Lists' α true
a✝¹ : l₂.Subset l₃
a✝ : l₃.Subset l₂
h₂' : ⟨true, l₂⟩ ~ ⟨true, l₃⟩
hl₁ : l₁ ⊆ l₂
hr₁ : l₂ ⊆ l₁
hl₂ : l₂ ⊆ l₃
hr₂ : l₃ ⊆ l₂
⊢ l₁ ⊆ l₃ ∧ l₃ ⊆ l₁

tactic: constructor <;> apply Lists'.subset_def.2
state_before: case C1.antisymm.antisymm.intro.intro
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
l₁ : Lists' α true
IH : ∀ l' ∈ l₁.toList, trans l'
l₂ : Lists' α true
a✝³ : l₁.Subset l₂
a✝² : l₂.Subset l₁
h₁' : of' l₁ ~ ⟨true, l₂⟩
l₃ : Lists' α true
a✝¹ : l₂.Subset l₃
a✝ : l₃.Subset l₂
h₂' : ⟨true, l₂⟩ ~ ⟨true, l₃⟩
hl₁ : l₁ ⊆ l₂
hr₁ : l₂ ⊆ l₁
hl₂ : l₂ ⊆ l₃
hr₂ : l₃ ⊆ l₂
⊢ l₁ ⊆ l₃ ∧ l₃ ⊆ l₁
state_after: case C1.antisymm.antisymm.intro.intro.left
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
l₁ : Lists' α true
IH : ∀ l' ∈ l₁.toList, trans l'
l₂ : Lists' α true
a✝³ : l₁.Subset l₂
a✝² : l₂.Subset l₁
h₁' : of' l₁ ~ ⟨true, l₂⟩
l₃ : Lists' α true
a✝¹ : l₂.Subset l₃
a✝ : l₃.Subset l₂
h₂' : ⟨true, l₂⟩ ~ ⟨true, l₃⟩
hl₁ : l₁ ⊆ l₂
hr₁ : l₂ ⊆ l₁
hl₂ : l₂ ⊆ l₃
hr₂ : l₃ ⊆ l₂
⊢ ∀ a ∈ l₁.toList, a ∈ l₃

case C1.antisymm.antisymm.intro.intro.right
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
l₁ : Lists' α true
IH : ∀ l' ∈ l₁.toList, trans l'
l₂ : Lists' α true
a✝³ : l₁.Subset l₂
a✝² : l₂.Subset l₁
h₁' : of' l₁ ~ ⟨true, l₂⟩
l₃ : Lists' α true
a✝¹ : l₂.Subset l₃
a✝ : l₃.Subset l₂
h₂' : ⟨true, l₂⟩ ~ ⟨true, l₃⟩
hl₁ : l₁ ⊆ l₂
hr₁ : l₂ ⊆ l₁
hl₂ : l₂ ⊆ l₃
hr₂ : l₃ ⊆ l₂
⊢ ∀ a ∈ l₃.toList, a ∈ l₁

tactic: exact h₂
state_before: case C1.refl
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
l₁ : Lists' α true
IH : ∀ l' ∈ l₁.toList, trans l'
l₃ : Lists α
h₂ : of' l₁ ~ l₃
h₁' : of' l₁ ~ of' l₁
h₂' : of' l₁ ~ l₃
⊢ of' l₁ ~ l₃
state_after: no goals

tactic: exact h₁'
state_before: case C1.antisymm.refl
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
l₁ : Lists' α true
IH : ∀ l' ∈ l₁.toList, trans l'
l₂ : Lists' α true
a✝¹ : l₁.Subset l₂
a✝ : l₂.Subset l₁
h₁' : of' l₁ ~ ⟨true, l₂⟩
h₂' : ⟨true, l₂⟩ ~ ⟨true, l₂⟩
⊢ of' l₁ ~ ⟨true, l₂⟩
state_after: no goals

tactic: intro a₁ m₁
state_before: case C1.antisymm.antisymm.intro.intro.left
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
l₁ : Lists' α true
IH : ∀ l' ∈ l₁.toList, trans l'
l₂ : Lists' α true
a✝³ : l₁.Subset l₂
a✝² : l₂.Subset l₁
h₁' : of' l₁ ~ ⟨true, l₂⟩
l₃ : Lists' α true
a✝¹ : l₂.Subset l₃
a✝ : l₃.Subset l₂
h₂' : ⟨true, l₂⟩ ~ ⟨true, l₃⟩
hl₁ : l₁ ⊆ l₂
hr₁ : l₂ ⊆ l₁
hl₂ : l₂ ⊆ l₃
hr₂ : l₃ ⊆ l₂
⊢ ∀ a ∈ l₁.toList, a ∈ l₃
state_after: case C1.antisymm.antisymm.intro.intro.left
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
l₁ : Lists' α true
IH : ∀ l' ∈ l₁.toList, trans l'
l₂ : Lists' α true
a✝³ : l₁.Subset l₂
a✝² : l₂.Subset l₁
h₁' : of' l₁ ~ ⟨true, l₂⟩
l₃ : Lists' α true
a✝¹ : l₂.Subset l₃
a✝ : l₃.Subset l₂
h₂' : ⟨true, l₂⟩ ~ ⟨true, l₃⟩
hl₁ : l₁ ⊆ l₂
hr₁ : l₂ ⊆ l₁
hl₂ : l₂ ⊆ l₃
hr₂ : l₃ ⊆ l₂
a₁ : Lists α
m₁ : a₁ ∈ l₁.toList
⊢ a₁ ∈ l₃

tactic: rcases Lists'.mem_of_subset' hl₁ m₁ with ⟨a₂, m₂, e₁₂⟩
state_before: case C1.antisymm.antisymm.intro.intro.left
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
l₁ : Lists' α true
IH : ∀ l' ∈ l₁.toList, trans l'
l₂ : Lists' α true
a✝³ : l₁.Subset l₂
a✝² : l₂.Subset l₁
h₁' : of' l₁ ~ ⟨true, l₂⟩
l₃ : Lists' α true
a✝¹ : l₂.Subset l₃
a✝ : l₃.Subset l₂
h₂' : ⟨true, l₂⟩ ~ ⟨true, l₃⟩
hl₁ : l₁ ⊆ l₂
hr₁ : l₂ ⊆ l₁
hl₂ : l₂ ⊆ l₃
hr₂ : l₃ ⊆ l₂
a₁ : Lists α
m₁ : a₁ ∈ l₁.toList
⊢ a₁ ∈ l₃
state_after: case C1.antisymm.antisymm.intro.intro.left.intro.intro
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
l₁ : Lists' α true
IH : ∀ l' ∈ l₁.toList, trans l'
l₂ : Lists' α true
a✝³ : l₁.Subset l₂
a✝² : l₂.Subset l₁
h₁' : of' l₁ ~ ⟨true, l₂⟩
l₃ : Lists' α true
a✝¹ : l₂.Subset l₃
a✝ : l₃.Subset l₂
h₂' : ⟨true, l₂⟩ ~ ⟨true, l₃⟩
hl₁ : l₁ ⊆ l₂
hr₁ : l₂ ⊆ l₁
hl₂ : l₂ ⊆ l₃
hr₂ : l₃ ⊆ l₂
a₁ : Lists α
m₁ : a₁ ∈ l₁.toList
a₂ : Lists α
m₂ : a₂ ∈ l₂.toList
e₁₂ : a₁ ~ a₂
⊢ a₁ ∈ l₃

tactic: rcases Lists'.mem_of_subset' hl₂ m₂ with ⟨a₃, m₃, e₂₃⟩
state_before: case C1.antisymm.antisymm.intro.intro.left.intro.intro
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
l₁ : Lists' α true
IH : ∀ l' ∈ l₁.toList, trans l'
l₂ : Lists' α true
a✝³ : l₁.Subset l₂
a✝² : l₂.Subset l₁
h₁' : of' l₁ ~ ⟨true, l₂⟩
l₃ : Lists' α true
a✝¹ : l₂.Subset l₃
a✝ : l₃.Subset l₂
h₂' : ⟨true, l₂⟩ ~ ⟨true, l₃⟩
hl₁ : l₁ ⊆ l₂
hr₁ : l₂ ⊆ l₁
hl₂ : l₂ ⊆ l₃
hr₂ : l₃ ⊆ l₂
a₁ : Lists α
m₁ : a₁ ∈ l₁.toList
a₂ : Lists α
m₂ : a₂ ∈ l₂.toList
e₁₂ : a₁ ~ a₂
⊢ a₁ ∈ l₃
state_after: case C1.antisymm.antisymm.intro.intro.left.intro.intro.intro.intro
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
l₁ : Lists' α true
IH : ∀ l' ∈ l₁.toList, trans l'
l₂ : Lists' α true
a✝³ : l₁.Subset l₂
a✝² : l₂.Subset l₁
h₁' : of' l₁ ~ ⟨true, l₂⟩
l₃ : Lists' α true
a✝¹ : l₂.Subset l₃
a✝ : l₃.Subset l₂
h₂' : ⟨true, l₂⟩ ~ ⟨true, l₃⟩
hl₁ : l₁ ⊆ l₂
hr₁ : l₂ ⊆ l₁
hl₂ : l₂ ⊆ l₃
hr₂ : l₃ ⊆ l₂
a₁ : Lists α
m₁ : a₁ ∈ l₁.toList
a₂ : Lists α
m₂ : a₂ ∈ l₂.toList
e₁₂ : a₁ ~ a₂
a₃ : Lists α
m₃ : a₃ ∈ l₃.toList
e₂₃ : a₂ ~ a₃
⊢ a₁ ∈ l₃

tactic: exact ⟨a₃, m₃, IH _ m₁ e₁₂ e₂₃⟩
state_before: case C1.antisymm.antisymm.intro.intro.left.intro.intro.intro.intro
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
l₁ : Lists' α true
IH : ∀ l' ∈ l₁.toList, trans l'
l₂ : Lists' α true
a✝³ : l₁.Subset l₂
a✝² : l₂.Subset l₁
h₁' : of' l₁ ~ ⟨true, l₂⟩
l₃ : Lists' α true
a✝¹ : l₂.Subset l₃
a✝ : l₃.Subset l₂
h₂' : ⟨true, l₂⟩ ~ ⟨true, l₃⟩
hl₁ : l₁ ⊆ l₂
hr₁ : l₂ ⊆ l₁
hl₂ : l₂ ⊆ l₃
hr₂ : l₃ ⊆ l₂
a₁ : Lists α
m₁ : a₁ ∈ l₁.toList
a₂ : Lists α
m₂ : a₂ ∈ l₂.toList
e₁₂ : a₁ ~ a₂
a₃ : Lists α
m₃ : a₃ ∈ l₃.toList
e₂₃ : a₂ ~ a₃
⊢ a₁ ∈ l₃
state_after: no goals

tactic: intro a₃ m₃
state_before: case C1.antisymm.antisymm.intro.intro.right
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
l₁ : Lists' α true
IH : ∀ l' ∈ l₁.toList, trans l'
l₂ : Lists' α true
a✝³ : l₁.Subset l₂
a✝² : l₂.Subset l₁
h₁' : of' l₁ ~ ⟨true, l₂⟩
l₃ : Lists' α true
a✝¹ : l₂.Subset l₃
a✝ : l₃.Subset l₂
h₂' : ⟨true, l₂⟩ ~ ⟨true, l₃⟩
hl₁ : l₁ ⊆ l₂
hr₁ : l₂ ⊆ l₁
hl₂ : l₂ ⊆ l₃
hr₂ : l₃ ⊆ l₂
⊢ ∀ a ∈ l₃.toList, a ∈ l₁
state_after: case C1.antisymm.antisymm.intro.intro.right
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
l₁ : Lists' α true
IH : ∀ l' ∈ l₁.toList, trans l'
l₂ : Lists' α true
a✝³ : l₁.Subset l₂
a✝² : l₂.Subset l₁
h₁' : of' l₁ ~ ⟨true, l₂⟩
l₃ : Lists' α true
a✝¹ : l₂.Subset l₃
a✝ : l₃.Subset l₂
h₂' : ⟨true, l₂⟩ ~ ⟨true, l₃⟩
hl₁ : l₁ ⊆ l₂
hr₁ : l₂ ⊆ l₁
hl₂ : l₂ ⊆ l₃
hr₂ : l₃ ⊆ l₂
a₃ : Lists α
m₃ : a₃ ∈ l₃.toList
⊢ a₃ ∈ l₁

tactic: rcases Lists'.mem_of_subset' hr₂ m₃ with ⟨a₂, m₂, e₃₂⟩
state_before: case C1.antisymm.antisymm.intro.intro.right
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
l₁ : Lists' α true
IH : ∀ l' ∈ l₁.toList, trans l'
l₂ : Lists' α true
a✝³ : l₁.Subset l₂
a✝² : l₂.Subset l₁
h₁' : of' l₁ ~ ⟨true, l₂⟩
l₃ : Lists' α true
a✝¹ : l₂.Subset l₃
a✝ : l₃.Subset l₂
h₂' : ⟨true, l₂⟩ ~ ⟨true, l₃⟩
hl₁ : l₁ ⊆ l₂
hr₁ : l₂ ⊆ l₁
hl₂ : l₂ ⊆ l₃
hr₂ : l₃ ⊆ l₂
a₃ : Lists α
m₃ : a₃ ∈ l₃.toList
⊢ a₃ ∈ l₁
state_after: case C1.antisymm.antisymm.intro.intro.right.intro.intro
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
l₁ : Lists' α true
IH : ∀ l' ∈ l₁.toList, trans l'
l₂ : Lists' α true
a✝³ : l₁.Subset l₂
a✝² : l₂.Subset l₁
h₁' : of' l₁ ~ ⟨true, l₂⟩
l₃ : Lists' α true
a✝¹ : l₂.Subset l₃
a✝ : l₃.Subset l₂
h₂' : ⟨true, l₂⟩ ~ ⟨true, l₃⟩
hl₁ : l₁ ⊆ l₂
hr₁ : l₂ ⊆ l₁
hl₂ : l₂ ⊆ l₃
hr₂ : l₃ ⊆ l₂
a₃ : Lists α
m₃ : a₃ ∈ l₃.toList
a₂ : Lists α
m₂ : a₂ ∈ l₂.toList
e₃₂ : a₃ ~ a₂
⊢ a₃ ∈ l₁

tactic: rcases Lists'.mem_of_subset' hr₁ m₂ with ⟨a₁, m₁, e₂₁⟩
state_before: case C1.antisymm.antisymm.intro.intro.right.intro.intro
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
l₁ : Lists' α true
IH : ∀ l' ∈ l₁.toList, trans l'
l₂ : Lists' α true
a✝³ : l₁.Subset l₂
a✝² : l₂.Subset l₁
h₁' : of' l₁ ~ ⟨true, l₂⟩
l₃ : Lists' α true
a✝¹ : l₂.Subset l₃
a✝ : l₃.Subset l₂
h₂' : ⟨true, l₂⟩ ~ ⟨true, l₃⟩
hl₁ : l₁ ⊆ l₂
hr₁ : l₂ ⊆ l₁
hl₂ : l₂ ⊆ l₃
hr₂ : l₃ ⊆ l₂
a₃ : Lists α
m₃ : a₃ ∈ l₃.toList
a₂ : Lists α
m₂ : a₂ ∈ l₂.toList
e₃₂ : a₃ ~ a₂
⊢ a₃ ∈ l₁
state_after: case C1.antisymm.antisymm.intro.intro.right.intro.intro.intro.intro
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
l₁ : Lists' α true
IH : ∀ l' ∈ l₁.toList, trans l'
l₂ : Lists' α true
a✝³ : l₁.Subset l₂
a✝² : l₂.Subset l₁
h₁' : of' l₁ ~ ⟨true, l₂⟩
l₃ : Lists' α true
a✝¹ : l₂.Subset l₃
a✝ : l₃.Subset l₂
h₂' : ⟨true, l₂⟩ ~ ⟨true, l₃⟩
hl₁ : l₁ ⊆ l₂
hr₁ : l₂ ⊆ l₁
hl₂ : l₂ ⊆ l₃
hr₂ : l₃ ⊆ l₂
a₃ : Lists α
m₃ : a₃ ∈ l₃.toList
a₂ : Lists α
m₂ : a₂ ∈ l₂.toList
e₃₂ : a₃ ~ a₂
a₁ : Lists α
m₁ : a₁ ∈ l₁.toList
e₂₁ : a₂ ~ a₁
⊢ a₃ ∈ l₁

tactic: exact ⟨a₁, m₁, (IH _ m₁ e₂₁.symm e₃₂.symm).symm⟩
state_before: case C1.antisymm.antisymm.intro.intro.right.intro.intro.intro.intro
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
l₁ : Lists' α true
IH : ∀ l' ∈ l₁.toList, trans l'
l₂ : Lists' α true
a✝³ : l₁.Subset l₂
a✝² : l₂.Subset l₁
h₁' : of' l₁ ~ ⟨true, l₂⟩
l₃ : Lists' α true
a✝¹ : l₂.Subset l₃
a✝ : l₃.Subset l₂
h₂' : ⟨true, l₂⟩ ~ ⟨true, l₃⟩
hl₁ : l₁ ⊆ l₂
hr₁ : l₂ ⊆ l₁
hl₂ : l₂ ⊆ l₃
hr₂ : l₃ ⊆ l₂
a₃ : Lists α
m₃ : a₃ ∈ l₃.toList
a₂ : Lists α
m₂ : a₂ ∈ l₂.toList
e₃₂ : a₃ ~ a₂
a₁ : Lists α
m₁ : a₁ ∈ l₁.toList
e₂₁ : a₂ ~ a₁
⊢ a₃ ∈ l₁
state_after: no goals

tactic: rintro _ ⟨⟩
state_before: case D0
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
⊢ ∀ l' ∈ Lists'.nil.toList, trans l'
state_after: no goals

tactic: intro a l IH₁ IH
state_before: case D1
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
⊢ ∀ (a : Lists α) (l : Lists' α true), trans a → (∀ l' ∈ l.toList, trans l') → ∀ l' ∈ (Lists'.cons a l).toList, trans l'
state_after: case D1
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
a : Lists α
l : Lists' α true
IH₁ : trans a
IH : ∀ l' ∈ l.toList, trans l'
⊢ ∀ l' ∈ (Lists'.cons a l).toList, trans l'

tactic: simp only [Lists'.toList, Sigma.eta, List.find?, List.mem_cons, forall_eq_or_imp]
state_before: case D1
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
a : Lists α
l : Lists' α true
IH₁ : trans a
IH : ∀ l' ∈ l.toList, trans l'
⊢ ∀ l' ∈ (Lists'.cons a l).toList, trans l'
state_after: case D1
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
a : Lists α
l : Lists' α true
IH₁ : trans a
IH : ∀ l' ∈ l.toList, trans l'
⊢ trans a ∧ ∀ a ∈ l.toList, trans a

tactic: constructor
state_before: case D1
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
a : Lists α
l : Lists' α true
IH₁ : trans a
IH : ∀ l' ∈ l.toList, trans l'
⊢ trans a ∧ ∀ a ∈ l.toList, trans a
state_after: case D1.left
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
a : Lists α
l : Lists' α true
IH₁ : trans a
IH : ∀ l' ∈ l.toList, trans l'
⊢ trans a

case D1.right
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
a : Lists α
l : Lists' α true
IH₁ : trans a
IH : ∀ l' ∈ l.toList, trans l'
⊢ ∀ a ∈ l.toList, trans a

tactic: intros l₂ l₃ h₁ h₂
state_before: case D1.left
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
a : Lists α
l : Lists' α true
IH₁ : trans a
IH : ∀ l' ∈ l.toList, trans l'
⊢ trans a
state_after: case D1.left
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
a : Lists α
l : Lists' α true
IH₁ : trans a
IH : ∀ l' ∈ l.toList, trans l'
l₂ l₃ : Lists α
h₁ : a ~ l₂
h₂ : l₂ ~ l₃
⊢ a ~ l₃

tactic: exact IH₁ h₁ h₂
state_before: case D1.left
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
a : Lists α
l : Lists' α true
IH₁ : trans a
IH : ∀ l' ∈ l.toList, trans l'
l₂ l₃ : Lists α
h₁ : a ~ l₂
h₂ : l₂ ~ l₃
⊢ a ~ l₃
state_after: no goals

tactic: intros a h₁ l₂ l₃ h₂ h₃
state_before: case D1.right
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
a : Lists α
l : Lists' α true
IH₁ : trans a
IH : ∀ l' ∈ l.toList, trans l'
⊢ ∀ a ∈ l.toList, trans a
state_after: case D1.right
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
a✝ : Lists α
l : Lists' α true
IH₁ : trans a✝
IH : ∀ l' ∈ l.toList, trans l'
a : Lists α
h₁ : a ∈ l.toList
l₂ l₃ : Lists α
h₂ : a ~ l₂
h₃ : l₂ ~ l₃
⊢ a ~ l₃

tactic: exact IH _ h₁ h₂ h₃
state_before: case D1.right
α : Type u_1
trans : Lists α → Prop := fun l₁ => ∀ ⦃l₂ l₃ : Lists α⦄, l₁ ~ l₂ → l₂ ~ l₃ → l₁ ~ l₃
a✝ : Lists α
l : Lists' α true
IH₁ : trans a✝
IH : ∀ l' ∈ l.toList, trans l'
a : Lists α
h₁ : a ∈ l.toList
l₂ l₃ : Lists α
h₂ : a ~ l₂
h₃ : l₂ ~ l₃
⊢ a ~ l₃
state_after: no goals