2014-01-05 20:05:08 +00:00
|
|
|
import macros
|
2013-12-27 00:00:42 +00:00
|
|
|
|
2014-01-05 20:05:08 +00:00
|
|
|
definition Set (A : Type) : Type := A → Bool
|
2013-12-19 05:03:16 +00:00
|
|
|
|
2014-01-05 20:05:08 +00:00
|
|
|
definition element {A : Type} (x : A) (s : Set A) := s x
|
|
|
|
infix 60 ∈ : element
|
2013-12-19 05:03:16 +00:00
|
|
|
|
2014-01-05 20:05:08 +00:00
|
|
|
definition subset {A : Type} (s1 : Set A) (s2 : Set A) := ∀ x, x ∈ s1 ⇒ x ∈ s2
|
|
|
|
infix 50 ⊆ : subset
|
2013-12-19 05:03:16 +00:00
|
|
|
|
2014-01-06 03:10:21 +00:00
|
|
|
theorem subset::trans (A : Type) : ∀ s1 s2 s3 : Set A, s1 ⊆ s2 ⇒ s2 ⊆ s3 ⇒ s1 ⊆ s3 :=
|
|
|
|
take s1 s2 s3, assume (H1 : s1 ⊆ s2) (H2 : s2 ⊆ s3),
|
2014-01-05 19:25:58 +00:00
|
|
|
have s1 ⊆ s3 :
|
2014-01-06 03:10:21 +00:00
|
|
|
take x, assume Hin : x ∈ s1,
|
2014-01-05 19:25:58 +00:00
|
|
|
have x ∈ s3 :
|
2014-01-06 03:10:21 +00:00
|
|
|
let L1 : x ∈ s2 := H1 ↓ x ◂ Hin
|
|
|
|
in H2 ↓ x ◂ L1
|
2013-12-27 06:37:44 +00:00
|
|
|
|
2014-01-06 03:10:21 +00:00
|
|
|
theorem subset::ext (A : Type) : ∀ s1 s2 : Set A, (∀ x, x ∈ s1 = x ∈ s2) ⇒ s1 = s2 :=
|
|
|
|
take s1 s2, assume (H : ∀ x, x ∈ s1 = x ∈ s2),
|
|
|
|
abst (λ x, H ↓ x)
|
2013-12-27 06:37:44 +00:00
|
|
|
|
2014-01-06 03:10:21 +00:00
|
|
|
theorem subset::antisym (A : Type) : ∀ s1 s2 : Set A, s1 ⊆ s2 ⇒ s2 ⊆ s1 ⇒ s1 = s2 :=
|
|
|
|
take s1 s2, assume (H1 : s1 ⊆ s2) (H2 : s2 ⊆ s1),
|
2014-01-05 19:25:58 +00:00
|
|
|
have s1 = s2 :
|
2014-01-06 03:10:21 +00:00
|
|
|
(have (∀ x, x ∈ s1 = x ∈ s2) ⇒ s1 = s2 :
|
|
|
|
(subset::ext A) ↓ s1 ↓ s2)
|
|
|
|
◂ (have (∀ x, x ∈ s1 = x ∈ s2) :
|
|
|
|
take x, have x ∈ s1 = x ∈ s2 :
|
|
|
|
iff::intro (have x ∈ s1 ⇒ x ∈ s2 : H1 ↓ x)
|
|
|
|
(have x ∈ s2 ⇒ x ∈ s1 : H2 ↓ x))
|
|
|
|
|
2013-12-27 06:37:44 +00:00
|
|
|
|
2014-01-05 16:52:46 +00:00
|
|
|
-- Compact (but less readable) version of the previous theorem
|
2014-01-06 03:10:21 +00:00
|
|
|
theorem subset::antisym2 (A : Type) : ∀ s1 s2 : Set A, s1 ⊆ s2 ⇒ s2 ⊆ s1 ⇒ s1 = s2 :=
|
|
|
|
take s1 s2, assume H1 H2,
|
|
|
|
(subset::ext A) ↓ s1 ↓ s2 ◂ (take x, iff::intro (H1 ↓ x) (H2 ↓ x))
|