Interleaving lists #
This file defines interleaving of lists as an operation.
@[irreducible]
Interleave two lists l₁ and l₂, starting with an element of l₁.
This operation fully interleave the two lists when the length of l₁ is either the length of l₂
or one more. If one of the lists runs out early, the remainder of the other list is kept without
further interleaving, so that l₁.interleave l₂ is always a permutation of l₁ ++ l₂.
See interleave_perm_append.
#eval interleave [0, 2, 4] [1] -- [0, 1, 2, 4] -- The second list is too short
#eval interleave [0, 2, 4] [1, 3] -- [0, 1, 2, 3, 4]
#eval interleave [0, 2] [1, 3] -- [0, 1, 2, 3]
#eval interleave [0] [1, 3] -- [0, 1, 3] -- The first list is too short
Equations
- [].interleave x✝ = x✝
- (a :: l₁).interleave x✝ = a :: x✝.interleave l₁
Instances For
@[simp]
@[simp]
theorem
List.interleave_perm_append
{α : Type u_1}
{l₁ l₂ : List α}
:
(l₁.interleave l₂).Perm (l₁ ++ l₂)
theorem
List.Perm.interleave
{α✝ : Type u_1}
{l₁ l₃ l₂ l₄ : List α✝}
(h₁₃ : l₁.Perm l₃)
(h₂₄ : l₂.Perm l₄)
:
(l₁.interleave l₂).Perm (l₃.interleave l₄)
@[simp]
@[simp]
theorem
List.reverse_interleave_of_length_eq_length
{α : Type u_1}
{l₁ l₂ : List α}
:
l₁.length = l₂.length → (l₁.interleave l₂).reverse = l₂.reverse.interleave l₁.reverse
@[simp]
theorem
List.reverse_interleave_of_length_eq_length_add_one
{α : Type u_1}
{l₁ l₂ : List α}
:
l₁.length = l₂.length + 1 → (l₁.interleave l₂).reverse = l₁.reverse.interleave l₂.reverse
@[simp]
theorem
List.right_sublist_interleave
{α : Type u_1}
{l₁ l₂ : List α}
:
l₂.Sublist (l₁.interleave l₂)
@[simp]
theorem
List.left_sublist_interleave
{α✝ : Type u_1}
{l₁ l₂ : List α✝}
:
l₁.Sublist (l₁.interleave l₂)