Theorem: List.exists_perm_sublist
File: .lake/packages/batteries/Batteries/Data/List/Perm.lean

tactic: induction p generalizing l₁ with
| nil => exact ⟨[], sublist_nil.mp s ▸ .rfl, nil_sublist _⟩
| cons x _ IH =>
  match s with
  | .cons _ s => let ⟨l₁', p', s'⟩ := IH s; exact ⟨l₁', p', s'.cons _⟩
  | .cons₂ _ s => let ⟨l₁', p', s'⟩ := IH s; exact ⟨x :: l₁', p'.cons x, s'.cons₂ _⟩
| swap x y l' =>
  match s with
  | .cons _ (.cons _ s) => exact ⟨_, .rfl, (s.cons _).cons _⟩
  | .cons _ (.cons₂ _ s) => exact ⟨x :: _, .rfl, (s.cons _).cons₂ _⟩
  | .cons₂ _ (.cons _ s) => exact ⟨y :: _, .rfl, (s.cons₂ _).cons _⟩
  | .cons₂ _ (.cons₂ _ s) => exact ⟨x :: y :: _, .swap .., (s.cons₂ _).cons₂ _⟩
| trans _ _ IH₁ IH₂ =>
  let ⟨m₁, pm, sm⟩ := IH₁ s
  let ⟨r₁, pr, sr⟩ := IH₂ sm
  exact ⟨r₁, pr.trans pm, sr⟩
state_before: α : Type u_1
l₁ l₂ l₂' : List α
s : l₁ <+ l₂
p : l₂ ~ l₂'
⊢ ∃ l₁', l₁' ~ l₁ ∧ l₁' <+ l₂'
state_after: no goals

tactic: exact ⟨[], sublist_nil.mp s ▸ .rfl, nil_sublist _⟩
state_before: case nil
α : Type u_1
l₂ l₂' l₁ : List α
s : l₁ <+ []
⊢ ∃ l₁', l₁' ~ l₁ ∧ l₁' <+ []
state_after: no goals

tactic: match s with
| .cons _ s => let ⟨l₁', p', s'⟩ := IH s; exact ⟨l₁', p', s'.cons _⟩
| .cons₂ _ s => let ⟨l₁', p', s'⟩ := IH s; exact ⟨x :: l₁', p'.cons x, s'.cons₂ _⟩
state_before: case cons
α : Type u_1
l₂ l₂' : List α
x : α
l₁✝ l₂✝ : List α
a✝ : l₁✝ ~ l₂✝
IH : ∀ {l₁ : List α}, l₁ <+ l₁✝ → ∃ l₁', l₁' ~ l₁ ∧ l₁' <+ l₂✝
l₁ : List α
s : l₁ <+ x :: l₁✝
⊢ ∃ l₁', l₁' ~ l₁ ∧ l₁' <+ x :: l₂✝
state_after: no goals

tactic: let ⟨l₁', p', s'⟩ := IH s
state_before: α : Type u_1
l₂ l₂' : List α
x : α
l₁✝¹ l₂✝ : List α
a✝ : l₁✝¹ ~ l₂✝
IH : ∀ {l₁ : List α}, l₁ <+ l₁✝¹ → ∃ l₁', l₁' ~ l₁ ∧ l₁' <+ l₂✝
l₁✝ : List α
s✝ : l₁✝ <+ x :: l₁✝¹
l₁ : List α
s : l₁ <+ l₁✝¹
⊢ ∃ l₁', l₁' ~ l₁ ∧ l₁' <+ x :: l₂✝
state_after: α : Type u_1
l₂ l₂' : List α
x : α
l₁✝¹ l₂✝ : List α
a✝ : l₁✝¹ ~ l₂✝
IH : ∀ {l₁ : List α}, l₁ <+ l₁✝¹ → ∃ l₁', l₁' ~ l₁ ∧ l₁' <+ l₂✝
l₁✝ : List α
s✝ : l₁✝ <+ x :: l₁✝¹
l₁ : List α
s : l₁ <+ l₁✝¹
l₁' : List α
p' : l₁' ~ l₁
s' : l₁' <+ l₂✝
⊢ ∃ l₁', l₁' ~ l₁ ∧ l₁' <+ x :: l₂✝

tactic: exact ⟨l₁', p', s'.cons _⟩
state_before: α : Type u_1
l₂ l₂' : List α
x : α
l₁✝¹ l₂✝ : List α
a✝ : l₁✝¹ ~ l₂✝
IH : ∀ {l₁ : List α}, l₁ <+ l₁✝¹ → ∃ l₁', l₁' ~ l₁ ∧ l₁' <+ l₂✝
l₁✝ : List α
s✝ : l₁✝ <+ x :: l₁✝¹
l₁ : List α
s : l₁ <+ l₁✝¹
l₁' : List α
p' : l₁' ~ l₁
s' : l₁' <+ l₂✝
⊢ ∃ l₁', l₁' ~ l₁ ∧ l₁' <+ x :: l₂✝
state_after: no goals

tactic: let ⟨l₁', p', s'⟩ := IH s
state_before: α : Type u_1
l₂ l₂' : List α
x : α
l₁✝¹ l₂✝ : List α
a✝ : l₁✝¹ ~ l₂✝
IH : ∀ {l₁ : List α}, l₁ <+ l₁✝¹ → ∃ l₁', l₁' ~ l₁ ∧ l₁' <+ l₂✝
l₁ : List α
s✝ : l₁ <+ x :: l₁✝¹
l₁✝ : List α
s : l₁✝ <+ l₁✝¹
⊢ ∃ l₁', l₁' ~ x :: l₁✝ ∧ l₁' <+ x :: l₂✝
state_after: α : Type u_1
l₂ l₂' : List α
x : α
l₁✝¹ l₂✝ : List α
a✝ : l₁✝¹ ~ l₂✝
IH : ∀ {l₁ : List α}, l₁ <+ l₁✝¹ → ∃ l₁', l₁' ~ l₁ ∧ l₁' <+ l₂✝
l₁ : List α
s✝ : l₁ <+ x :: l₁✝¹
l₁✝ : List α
s : l₁✝ <+ l₁✝¹
l₁' : List α
p' : l₁' ~ l₁✝
s' : l₁' <+ l₂✝
⊢ ∃ l₁', l₁' ~ x :: l₁✝ ∧ l₁' <+ x :: l₂✝

tactic: exact ⟨x :: l₁', p'.cons x, s'.cons₂ _⟩
state_before: α : Type u_1
l₂ l₂' : List α
x : α
l₁✝¹ l₂✝ : List α
a✝ : l₁✝¹ ~ l₂✝
IH : ∀ {l₁ : List α}, l₁ <+ l₁✝¹ → ∃ l₁', l₁' ~ l₁ ∧ l₁' <+ l₂✝
l₁ : List α
s✝ : l₁ <+ x :: l₁✝¹
l₁✝ : List α
s : l₁✝ <+ l₁✝¹
l₁' : List α
p' : l₁' ~ l₁✝
s' : l₁' <+ l₂✝
⊢ ∃ l₁', l₁' ~ x :: l₁✝ ∧ l₁' <+ x :: l₂✝
state_after: no goals

tactic: match s with
| .cons _ (.cons _ s) => exact ⟨_, .rfl, (s.cons _).cons _⟩
| .cons _ (.cons₂ _ s) => exact ⟨x :: _, .rfl, (s.cons _).cons₂ _⟩
| .cons₂ _ (.cons _ s) => exact ⟨y :: _, .rfl, (s.cons₂ _).cons _⟩
| .cons₂ _ (.cons₂ _ s) => exact ⟨x :: y :: _, .swap .., (s.cons₂ _).cons₂ _⟩
state_before: case swap
α : Type u_1
l₂ l₂' : List α
x y : α
l' l₁ : List α
s : l₁ <+ y :: x :: l'
⊢ ∃ l₁', l₁' ~ l₁ ∧ l₁' <+ x :: y :: l'
state_after: no goals

tactic: exact ⟨_, .rfl, (s.cons _).cons _⟩
state_before: α : Type u_1
l₂ l₂' : List α
x y : α
l' l₁✝ : List α
s✝ : l₁✝ <+ y :: x :: l'
l₁ : List α
s : l₁ <+ l'
⊢ ∃ l₁', l₁' ~ l₁ ∧ l₁' <+ x :: y :: l'
state_after: no goals

tactic: exact ⟨x :: _, .rfl, (s.cons _).cons₂ _⟩
state_before: α : Type u_1
l₂ l₂' : List α
x y : α
l' l₁ : List α
s✝ : l₁ <+ y :: x :: l'
tail✝ : List α
s : tail✝ <+ l'
⊢ ∃ l₁', l₁' ~ x :: tail✝ ∧ l₁' <+ x :: y :: l'
state_after: no goals

tactic: exact ⟨y :: _, .rfl, (s.cons₂ _).cons _⟩
state_before: α : Type u_1
l₂ l₂' : List α
x y : α
l' l₁ : List α
s✝ : l₁ <+ y :: x :: l'
l₁✝ : List α
s : l₁✝ <+ l'
⊢ ∃ l₁', l₁' ~ y :: l₁✝ ∧ l₁' <+ x :: y :: l'
state_after: no goals

tactic: exact ⟨x :: y :: _, .swap .., (s.cons₂ _).cons₂ _⟩
state_before: α : Type u_1
l₂ l₂' : List α
x y : α
l' l₁ : List α
s✝ : l₁ <+ y :: x :: l'
tail✝ : List α
s : tail✝ <+ l'
⊢ ∃ l₁', l₁' ~ y :: x :: tail✝ ∧ l₁' <+ x :: y :: l'
state_after: no goals

tactic: let ⟨m₁, pm, sm⟩ := IH₁ s
state_before: case trans
α : Type u_1
l₂ l₂' l₁✝ l₂✝ l₃✝ : List α
a✝¹ : l₁✝ ~ l₂✝
a✝ : l₂✝ ~ l₃✝
IH₁ : ∀ {l₁ : List α}, l₁ <+ l₁✝ → ∃ l₁', l₁' ~ l₁ ∧ l₁' <+ l₂✝
IH₂ : ∀ {l₁ : List α}, l₁ <+ l₂✝ → ∃ l₁', l₁' ~ l₁ ∧ l₁' <+ l₃✝
l₁ : List α
s : l₁ <+ l₁✝
⊢ ∃ l₁', l₁' ~ l₁ ∧ l₁' <+ l₃✝
state_after: case trans
α : Type u_1
l₂ l₂' l₁✝ l₂✝ l₃✝ : List α
a✝¹ : l₁✝ ~ l₂✝
a✝ : l₂✝ ~ l₃✝
IH₁ : ∀ {l₁ : List α}, l₁ <+ l₁✝ → ∃ l₁', l₁' ~ l₁ ∧ l₁' <+ l₂✝
IH₂ : ∀ {l₁ : List α}, l₁ <+ l₂✝ → ∃ l₁', l₁' ~ l₁ ∧ l₁' <+ l₃✝
l₁ : List α
s : l₁ <+ l₁✝
m₁ : List α
pm : m₁ ~ l₁
sm : m₁ <+ l₂✝
⊢ ∃ l₁', l₁' ~ l₁ ∧ l₁' <+ l₃✝

tactic: let ⟨r₁, pr, sr⟩ := IH₂ sm
state_before: case trans
α : Type u_1
l₂ l₂' l₁✝ l₂✝ l₃✝ : List α
a✝¹ : l₁✝ ~ l₂✝
a✝ : l₂✝ ~ l₃✝
IH₁ : ∀ {l₁ : List α}, l₁ <+ l₁✝ → ∃ l₁', l₁' ~ l₁ ∧ l₁' <+ l₂✝
IH₂ : ∀ {l₁ : List α}, l₁ <+ l₂✝ → ∃ l₁', l₁' ~ l₁ ∧ l₁' <+ l₃✝
l₁ : List α
s : l₁ <+ l₁✝
m₁ : List α
pm : m₁ ~ l₁
sm : m₁ <+ l₂✝
⊢ ∃ l₁', l₁' ~ l₁ ∧ l₁' <+ l₃✝
state_after: case trans
α : Type u_1
l₂ l₂' l₁✝ l₂✝ l₃✝ : List α
a✝¹ : l₁✝ ~ l₂✝
a✝ : l₂✝ ~ l₃✝
IH₁ : ∀ {l₁ : List α}, l₁ <+ l₁✝ → ∃ l₁', l₁' ~ l₁ ∧ l₁' <+ l₂✝
IH₂ : ∀ {l₁ : List α}, l₁ <+ l₂✝ → ∃ l₁', l₁' ~ l₁ ∧ l₁' <+ l₃✝
l₁ : List α
s : l₁ <+ l₁✝
m₁ : List α
pm : m₁ ~ l₁
sm : m₁ <+ l₂✝
r₁ : List α
pr : r₁ ~ m₁
sr : r₁ <+ l₃✝
⊢ ∃ l₁', l₁' ~ l₁ ∧ l₁' <+ l₃✝

tactic: exact ⟨r₁, pr.trans pm, sr⟩
state_before: case trans
α : Type u_1
l₂ l₂' l₁✝ l₂✝ l₃✝ : List α
a✝¹ : l₁✝ ~ l₂✝
a✝ : l₂✝ ~ l₃✝
IH₁ : ∀ {l₁ : List α}, l₁ <+ l₁✝ → ∃ l₁', l₁' ~ l₁ ∧ l₁' <+ l₂✝
IH₂ : ∀ {l₁ : List α}, l₁ <+ l₂✝ → ∃ l₁', l₁' ~ l₁ ∧ l₁' <+ l₃✝
l₁ : List α
s : l₁ <+ l₁✝
m₁ : List α
pm : m₁ ~ l₁
sm : m₁ <+ l₂✝
r₁ : List α
pr : r₁ ~ m₁
sr : r₁ <+ l₃✝
⊢ ∃ l₁', l₁' ~ l₁ ∧ l₁' <+ l₃✝
state_after: no goals