List Permutations #
This file introduces the List.Perm relation, which is true if two lists are permutations of one
another.
Notation #
The notation ~ is used for permutation equivalence.
theorem List.Perm.recOnSwap' {α : Type u_1} {motive : (l₁ l₂ : List α) → l₁.Perm l₂ → Prop} {l₁ l₂ : List α} (p : l₁.Perm l₂) (nil : motive [] [] ⋯) (cons : ∀ (x : α) {l₁ l₂ : List α} (h : l₁.Perm l₂), motive l₁ l₂ h → motive (x :: l₁) (x :: l₂) ⋯) (swap' : ∀ (x y : α) {l₁ l₂ : List α} (h : l₁.Perm l₂), motive l₁ l₂ h → motive (y :: x :: l₁) (x :: y :: l₂) ⋯) (trans : ∀ {l₁ l₂ l₃ : List α} (h₁ : l₁.Perm l₂) (h₂ : l₂.Perm l₃), motive l₁ l₂ h₁ → motive l₂ l₃ h₂ → motive l₁ l₃ ⋯) :
motive l₁ l₂ p
Similar to Perm.recOn, but the swap case is generalized to Perm.swap',
where the tail of the lists are not necessarily the same.
@[instance_reducible]
Equations
- List.isSetoid α = { r := List.Perm, iseqv := ⋯ }
theorem List.Perm.filterMap {α : Type u_1} {β : Type u_2} (f : α → Option β) {l₁ l₂ : List α} (p : l₁.Perm l₂) :
(List.filterMap f l₁).Perm (List.filterMap f l₂)
theorem List.Perm.filter {α : Type u_1} (p : α → Bool) {l₁ l₂ : List α} (s : l₁.Perm l₂) :
(List.filter p l₁).Perm (List.filter p l₂)
theorem List.Perm.foldl_eq' {β : Type u_1} {α : Type u_2} {f : β → α → β} {l₁ l₂ : List α} (p : l₁.Perm l₂) (comm : ∀ (x : α), x ∈ l₁ → ∀ (y : α), y ∈ l₁ → ∀ (z : β), f (f z x) y = f (f z y) x) (init : β) :
This theorem is a variant of Perm.foldl_eq defined in Mathlib which uses typeclasses rather
than the explicit comm argument.
theorem List.Perm.foldr_eq' {α : Type u_1} {β : Type u_2} {f : α → β → β} {l₁ l₂ : List α} (p : l₁.Perm l₂) (comm : ∀ (x : α), x ∈ l₁ → ∀ (y : α), y ∈ l₁ → ∀ (z : β), f y (f x z) = f x (f y z)) (init : β) :
This theorem is a variant of Perm.foldr_eq defined in Mathlib which uses typeclasses rather
than the explicit comm argument.
theorem List.Perm.rec_heq {α : Type u_1} {β : List α → Sort u_2} {f : (a : α) → (l : List α) → β l → β (a :: l)} {b : β []} {l l' : List α} (hl : l.Perm l') (f_congr : ∀ {a : α} {l l' : List α} {b : β l} {b' : β l'}, l.Perm l' → b ≍ b' → f a l b ≍ f a l' b') (f_swap : ∀ {a a' : α} {l : List α} {b : β l}, f a (a' :: l) (f a' l b) ≍ f a' (a :: l) (f a l b)) :
@[instance_reducible]
Equations
- l₁.decidablePerm l₂ = decidable_of_iff (l₁.isPerm l₂ = true) ⋯
theorem List.Perm.insert {α : Type u_1} [BEq α] [LawfulBEq α] (a : α) {l₁ l₂ : List α} (p : l₁.Perm l₂) :
(List.insert a l₁).Perm (List.insert a l₂)
theorem List.perm_insert_swap {α : Type u_1} [BEq α] [LawfulBEq α] (x y : α) (l : List α) :
(List.insert x (List.insert y l)).Perm (List.insert y (List.insert x l))
If two lists are sorted by an antisymmetric relation, and permutations of each other, they must be equal.
theorem List.Perm.eraseP {α : Type u_1} (f : α → Bool) {l₁ l₂ : List α} (H : Pairwise (fun (a b : α) => f a = true → f b = true → False) l₁) (p : l₁.Perm l₂) :
(List.eraseP f l₁).Perm (List.eraseP f l₂)