152 lines
5 KiB
Text
152 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
|