feat(library/data/list/perm): add perm_filter
This commit is contained in:
parent
86a039b6d5
commit
9e26dddaf3
1 changed files with 31 additions and 3 deletions
|
@ -1,11 +1,9 @@
|
||||||
/-
|
/-
|
||||||
Copyright (c) 2015 Microsoft Corporation. All rights reserved.
|
Copyright (c) 2015 Microsoft Corporation. All rights reserved.
|
||||||
Released under Apache 2.0 license as described in the file LICENSE.
|
Released under Apache 2.0 license as described in the file LICENSE.
|
||||||
|
|
||||||
Module: data.list.perm
|
|
||||||
Author: Leonardo de Moura
|
Author: Leonardo de Moura
|
||||||
|
|
||||||
List permutations
|
List permutations.
|
||||||
-/
|
-/
|
||||||
import data.list.basic data.list.set
|
import data.list.basic data.list.set
|
||||||
open list setoid nat binary
|
open list setoid nat binary
|
||||||
|
@ -752,4 +750,34 @@ list.induction_on l
|
||||||
theorem perm_cross_product {l₁ l₂ : list A} {t₁ t₂ : list B} : l₁ ~ l₂ → t₁ ~ t₂ → (cross_product l₁ t₁) ~ (cross_product l₂ t₂) :=
|
theorem perm_cross_product {l₁ l₂ : list A} {t₁ t₂ : list B} : l₁ ~ l₂ → t₁ ~ t₂ → (cross_product l₁ t₁) ~ (cross_product l₂ t₂) :=
|
||||||
assume p₁ p₂, trans (perm_cross_product_left t₁ p₁) (perm_cross_product_right l₂ p₂)
|
assume p₁ p₂, trans (perm_cross_product_left t₁ p₁) (perm_cross_product_right l₂ p₂)
|
||||||
end cross_product
|
end cross_product
|
||||||
|
|
||||||
|
/- filter -/
|
||||||
|
theorem perm_filter {l₁ l₂ : list A} {p : A → Prop} [decp : decidable_pred p] :
|
||||||
|
l₁ ~ l₂ → (filter p l₁) ~ (filter p l₂) :=
|
||||||
|
assume u, perm.induction_on u
|
||||||
|
perm.nil
|
||||||
|
(take x l₁' l₂',
|
||||||
|
assume u' : l₁' ~ l₂',
|
||||||
|
assume u'' : filter p l₁' ~ filter p l₂',
|
||||||
|
decidable.by_cases
|
||||||
|
(assume H : p x, by rewrite [*filter_cons_of_pos _ H]; apply perm.skip; apply u'')
|
||||||
|
(assume H : ¬ p x, by rewrite [*filter_cons_of_neg _ H]; apply u''))
|
||||||
|
(take x y l,
|
||||||
|
decidable.by_cases
|
||||||
|
(assume H1 : p x,
|
||||||
|
decidable.by_cases
|
||||||
|
(assume H2 : p y,
|
||||||
|
begin
|
||||||
|
rewrite [filter_cons_of_pos _ H1, *filter_cons_of_pos _ H2, filter_cons_of_pos _ H1],
|
||||||
|
apply perm.swap
|
||||||
|
end)
|
||||||
|
(assume H2 : ¬ p y,
|
||||||
|
by rewrite [filter_cons_of_pos _ H1, *filter_cons_of_neg _ H2, filter_cons_of_pos _ H1]))
|
||||||
|
(assume H1 : ¬ p x,
|
||||||
|
decidable.by_cases
|
||||||
|
(assume H2 : p y,
|
||||||
|
by rewrite [filter_cons_of_neg _ H1, *filter_cons_of_pos _ H2, filter_cons_of_neg _ H1])
|
||||||
|
(assume H2 : ¬ p y,
|
||||||
|
by rewrite [filter_cons_of_neg _ H1, *filter_cons_of_neg _ H2, filter_cons_of_neg _ H1])))
|
||||||
|
(λ l₁ l₂ l₃ p₁ p₂ r₁ r₂, trans r₁ r₂)
|
||||||
end perm
|
end perm
|
||||||
|
|
Loading…
Reference in a new issue