lean2/library/data/set/basic.lean

109 lines
2.8 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/-
copyright (c) 2014 Jeremy Avigad. All rights reserved.
Released under Apache 2.0 license as described in the file LIcENSE.
Module: data.set.basic
Author: Jeremy Avigad, Leonardo de Moura
-/
import logic
open eq.ops
definition set (T : Type) := T → Prop
namespace set
variable {T : Type}
definition mem [reducible] (x : T) (a : set T) := a x
notation e ∈ a := mem e a
theorem setext {a b : set T} (H : ∀x, x ∈ a ↔ x ∈ b) : a = b :=
funext (take x, propext (H x))
definition subset (a b : set T) := ∀ x, x ∈ a → x ∈ b
infix `⊆`:50 := subset
definition eq_of_subset_of_subset (a b : set T) (H₁ : a ⊆ b) (H₂ : b ⊆ a) : a = b :=
setext (take x, iff.intro (H₁ x) (H₂ x))
/- empty -/
definition empty [reducible] : set T := λx, false
notation `∅` := empty
theorem mem_empty (x : T) : ¬ (x ∈ ∅) :=
assume H : x ∈ ∅, H
/- univ -/
definition univ : set T := λx, true
theorem mem_univ (x : T) : x ∈ univ := trivial
/- inter -/
definition inter [reducible] (a b : set T) : set T := λx, x ∈ a ∧ x ∈ b
notation a ∩ b := inter a b
theorem mem_inter (x : T) (a b : set T) : x ∈ a ∩ b ↔ (x ∈ a ∧ x ∈ b) := !iff.refl
theorem inter_self (a : set T) : a ∩ a = a :=
setext (take x, iff.intro
(assume H, and.elim_left H)
(assume H, and.intro H H))
theorem inter_empty (a : set T) : a ∩ ∅ = ∅ :=
setext (take x, iff.intro
(assume H, and.elim_right H)
(assume H, false.elim H))
theorem empty_inter (a : set T) : ∅ ∩ a = ∅ :=
setext (take x, iff.intro
(assume H, and.elim_left H)
(assume H, false.elim H))
theorem inter.comm (a b : set T) : a ∩ b = b ∩ a :=
setext (take x, !and.comm)
theorem inter.assoc (a b c : set T) : (a ∩ b) ∩ c = a ∩ (b ∩ c) :=
setext (take x, !and.assoc)
/- union -/
definition union [reducible] (a b : set T) : set T := λx, x ∈ a x ∈ b
notation a b := union a b
theorem mem_union (x : T) (a b : set T) : x ∈ a b ↔ (x ∈ a x ∈ b) := !iff.refl
theorem union_self (a : set T) : a a = a :=
setext (take x, iff.intro
(assume H,
match H with
| or.inl H₁ := H₁
| or.inr H₂ := H₂
end)
(assume H, or.inl H))
theorem union_empty (a : set T) : a ∅ = a :=
setext (take x, iff.intro
(assume H, match H with
| or.inl H₁ := H₁
| or.inr H₂ := false.elim H₂
end)
(assume H, or.inl H))
theorem union_empty_left (a : set T) : ∅ a = a :=
setext (take x, iff.intro
(assume H, match H with
| or.inl H₁ := false.elim H₁
| or.inr H₂ := H₂
end)
(assume H, or.inr H))
theorem union.comm (a b : set T) : a b = b a :=
setext (take x, or.comm)
theorem union_assoc (a b c : set T) : (a b) c = a (b c) :=
setext (take x, or.assoc)
end set