151 lines
5 KiB
Text
151 lines
5 KiB
Text
/-
|
||
Copyright (c) 2016 Jeremy Avigad. All rights reserved.
|
||
Released under Apache 2.0 license as described in the file LICENSE.
|
||
|
||
Temporary file; move in Lean3.
|
||
-/
|
||
import data.set algebra.order_bigops
|
||
import data.finset data.list.sort
|
||
|
||
-- move to data.set
|
||
|
||
namespace set
|
||
|
||
lemma inter_eq_self_of_subset {X : Type} {s t : set X} (Hst : s ⊆ t) : s ∩ t = s :=
|
||
ext (take x, iff.intro
|
||
(assume H, !inter_subset_left H)
|
||
(assume H, and.intro H (Hst H)))
|
||
|
||
lemma inter_eq_self_of_subset_right {X : Type} {s t : set X} (Hst : t ⊆ s) : s ∩ t = t :=
|
||
by rewrite [inter_comm]; apply inter_eq_self_of_subset Hst
|
||
|
||
proposition diff_self_inter {X : Type} (s t : set X) : s \ (s ∩ t) = s \ t :=
|
||
by rewrite [*diff_eq, compl_inter, inter_distrib_left, inter_compl_self, empty_union]
|
||
|
||
proposition diff_eq_diff {X : Type} {s t u : set X} (H : s ∩ u = s ∩ t) :
|
||
s \ u = s \ t :=
|
||
by rewrite [-diff_self_inter, H, diff_self_inter]
|
||
|
||
-- classical
|
||
proposition inter_eq_inter_of_diff_eq_diff {X : Type} {s t u : set X} (H : s \ u = s \ t) :
|
||
s ∩ u = s ∩ t :=
|
||
by rewrite [-compl_compl u, -compl_compl t]; apply diff_eq_diff H
|
||
|
||
proposition compl_inter_eq_compl_inter {X : Type} {s t u : set X}
|
||
(H : u ∩ s = t ∩ s) :
|
||
-u ∩ s = -t ∩ s :=
|
||
by rewrite [*inter_comm _ s]; apply diff_eq_diff; rewrite [*inter_comm s, H]
|
||
|
||
proposition inter_eq_inter_of_compl_inter_eq_compl_inter {X : Type} {s t u : set X}
|
||
(H : -u ∩ s = -t ∩ s) :
|
||
u ∩ s = t ∩ s :=
|
||
begin
|
||
rewrite [*inter_comm _ s], apply inter_eq_inter_of_diff_eq_diff,
|
||
rewrite [*diff_eq, *inter_comm s, H]
|
||
end
|
||
|
||
proposition singleton_subset_of_mem {X : Type} {x : X} {s : set X} (xs : x ∈ s) : '{x} ⊆ s :=
|
||
take y, assume yx,
|
||
have y = x, from eq_of_mem_singleton yx,
|
||
by rewrite this; exact xs
|
||
|
||
proposition mem_of_singleton_subset {X : Type} {x : X} {s : set X} (xs : '{x} ⊆ s) : x ∈ s :=
|
||
xs !mem_singleton
|
||
|
||
proposition singleton_subset_iff {X : Type} (x : X) (s : set X) : '{x} ⊆ s ↔ x ∈ s :=
|
||
iff.intro mem_of_singleton_subset singleton_subset_of_mem
|
||
|
||
lemma inter_eq_inter_left {X : Type} {s t u : set X} (H₁ : s ∩ t ⊆ u) (H₂ : s ∩ u ⊆ t) :
|
||
s ∩ t = s ∩ u :=
|
||
eq_of_subset_of_subset
|
||
(subset_inter (inter_subset_left _ _) H₁)
|
||
(subset_inter (inter_subset_left _ _) H₂)
|
||
|
||
lemma inter_eq_inter_right {X : Type} {s t u : set X} (H₁ : s ∩ t ⊆ u) (H₂ : u ∩ t ⊆ s) :
|
||
s ∩ t = u ∩ t :=
|
||
eq_of_subset_of_subset
|
||
(subset_inter H₁ (inter_subset_right _ _))
|
||
(subset_inter H₂ (inter_subset_right _ _))
|
||
|
||
proposition sUnion_subset {X : Type} {S : set (set X)} {t : set X} (H : ∀₀ u ∈ S, u ⊆ t) :
|
||
⋃₀ S ⊆ t :=
|
||
take x, assume Hx,
|
||
obtain u [uS xu], from Hx,
|
||
H uS xu
|
||
|
||
proposition subset_of_sUnion_subset {X : Type} {S : set (set X)} {t : set X}
|
||
(H : ⋃₀ S ⊆ t) {u : set X} (Hu : u ∈ S) : u ⊆ t :=
|
||
λ x xu, H (exists.intro u (and.intro Hu xu))
|
||
|
||
proposition preimage_Union {I X Y : Type} (f : X → Y) (u : I → set Y) :
|
||
f '- (⋃ i, u i) = ⋃ i, (f '- (u i)) :=
|
||
ext (take x, !iff.refl)
|
||
|
||
lemma finite_sUnion {A : Type} {S : set (set A)} [H : finite S] :
|
||
(∀s, s ∈ S → finite s) → finite ⋃₀S :=
|
||
induction_on_finite S
|
||
(by intro H; rewrite sUnion_empty; apply finite_empty)
|
||
(take a s, assume fins anins ih h,
|
||
begin
|
||
rewrite sUnion_insert,
|
||
apply finite_union,
|
||
{apply h _ (mem_insert a s)},
|
||
apply ih (forall_of_forall_insert h)
|
||
end)
|
||
|
||
lemma subset_powerset_sUnion {A : Type} (S : set (set A)) : S ⊆ 𝒫 (⋃₀ S) :=
|
||
take u, suppose u ∈ S, show u ⊆ ⋃₀ S, from subset_sUnion_of_mem this
|
||
|
||
lemma finite_of_finite_sUnion {A : Type} (S : set (set A)) (H : finite ⋃₀S) : finite S :=
|
||
have finite (𝒫 (⋃₀ S)), from finite_powerset _,
|
||
show finite S, from finite_subset (subset_powerset_sUnion S)
|
||
|
||
end set
|
||
|
||
|
||
-- move to data.finset
|
||
|
||
namespace finset
|
||
|
||
section
|
||
variables {A : Type} [decidable_linear_order A]
|
||
|
||
definition finset_to_list (s : finset A) : list A :=
|
||
quot.lift_on s
|
||
(take l, list.sort le (subtype.elt_of l))
|
||
(take a b, assume eqab, list.sort_eq_of_perm eqab)
|
||
|
||
proposition to_finset_finset_to_list (s : finset A) : to_finset (finset_to_list s) = s :=
|
||
quot.induction_on s
|
||
begin
|
||
intro l,
|
||
have H : list.nodup (list.sort le (subtype.elt_of l)),
|
||
from perm.nodup_of_perm_of_nodup (perm.symm !list.sort_perm) (subtype.has_property l),
|
||
rewrite [↑finset_to_list, -to_finset_eq_of_nodup H],
|
||
apply quot.sound,
|
||
apply list.sort_perm
|
||
end
|
||
|
||
proposition nodup_finset_to_list (s : finset A) : list.nodup (finset_to_list s) :=
|
||
quot.induction_on s
|
||
(take l, perm.nodup_of_perm_of_nodup (perm.symm !list.sort_perm) (subtype.has_property l))
|
||
|
||
proposition sorted_finset_to_list (s : finset A) : list.sorted le (finset_to_list s) :=
|
||
quot.induction_on s
|
||
(take l, list.sorted_of_strongly_sorted (list.strongly_sorted_sort _))
|
||
end
|
||
|
||
end finset
|
||
|
||
|
||
-- move to data.nat?
|
||
|
||
namespace nat
|
||
open finset
|
||
|
||
theorem succ_Max₀_not_mem (s : finset ℕ) : succ (Max₀ s) ∉ s :=
|
||
suppose succ (Max₀ s) ∈ s,
|
||
have succ (Max₀ s) ≤ Max₀ s, from le_Max₀ this,
|
||
show false, from not_succ_le_self this
|
||
|
||
end nat
|