-
1
-
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
-
18
-
19
-
20
-
21
-
22
-
23
-
24
-
25
-
26
-
27
-
28
-
29
-
30
-
31
-
32
-
33
-
34
-
35
-
36
-
37
-
38
-
39
-
40
-
41
-
42
-
43
-
44
-
45
-
46
-
47
-
48
-
49
-
50
-
51
-
52
-
53
-
54
-
55
-
56
-
57
-
58
-
59
-
60
-
61
-
62
-
63
-
64
-
65
-
66
-
67
-
68
-
69
-
70
-
71
-
72
-
73
-
74
-
75
-
76
-
77
-
78
-
79
-
80
-
81
-
82
-
83
-
84
-
85
-
86
-
87
-
88
-
89
-
90
-
91
-
92
-
93
-
94
-
95
-
96
-
97
-
98
-
99
-
100
-
101
-
102
-
103
-
104
-
105
-
106
-
107
-
108
-
109
-
110
-
111
-
112
-
113
-
114
-
115
-
116
-
117
-
118
-
119
-
120
-
121
-
122
-
123
-
124
-
125
-
126
-
127
-
128
-
129
-
130
-
131
-
132
-
133
-
134
-
135
-
136
-
137
-
138
-
139
-
140
-
141
-
142
-
143
-
144
-
145
-
146
-
147
-
148
-
149
-
150
-
151
-
152
-
153
-
154
-
155
-
156
-
157
-
158
import Mathlib.Data.Set.Lattice
import Mathlib.Data.Nat.Prime
import Mathlib.Data.Nat.Parity
import Mathlib.Tactic
section
variable {α : Type _}
variable (s t u : Set α)
open Set
example : s ∩ t ∪ s ∩ u ⊆ s ∩ (t ∪ u) := by
rintro x (⟨xs, xt⟩ | ⟨xs, xu⟩)
· use xs
left
exact xt
use xs; right; exact xu
example : s \ (t ∪ u) ⊆ (s \ t) \ u := by
rintro x ⟨xs, xntu⟩
constructor
use xs
· intro xt
exact xntu (Or.inl xt)
intro xu
apply xntu (Or.inr xu)
example : s ∩ t = t ∩ s :=
Subset.antisymm
(fun x ⟨xs, xt⟩ ↦ ⟨xt, xs⟩) fun x ⟨xt, xs⟩ ↦ ⟨xs, xt⟩
example : s ∩ (s ∪ t) = s := by
ext x; constructor
· rintro ⟨xs, _⟩
exact xs
intro xs
use xs; left; exact xs
example : s ∪ s ∩ t = s := by
ext x; constructor
· rintro (xs | ⟨xs, xt⟩) <;> exact xs
intro xs; left; exact xs
example : s \ t ∪ t = s ∪ t := by
ext x; constructor
· rintro (⟨xs, nxt⟩ | xt)
· left
exact xs
right
exact xt
by_cases h : x ∈ t
· intro
right
exact h
rintro (xs | xt)
· left
use xs
exact h
right; exact xt
example : s \ t ∪ t \ s = (s ∪ t) \ (s ∩ t) := by
ext x; constructor
· rintro (⟨xs, xnt⟩ | ⟨xt, xns⟩)
· constructor
left
exact xs
rintro ⟨_, xt⟩
contradiction
constructor
right
exact xt
rintro ⟨xs, _⟩
contradiction
rintro ⟨xs | xt, nxst⟩
· left
use xs
intro xt
apply nxst
constructor <;> assumption
right; use xt; intro xs
apply nxst
constructor <;> assumption
example : { n | Nat.Prime n } ∩ { n | n > 2 } ⊆ { n | ¬Even n } := by
intro n
simp
intro nprime
cases' Nat.Prime.eq_two_or_odd nprime with h h
· rw [h]
intro
linarith
rw [Nat.even_iff, h]
norm_num
end
section
variable (s t : Set ℕ)
section
variable (ssubt : s ⊆ t)
example (h₀ : ∀ x ∈ t, ¬Even x) (h₁ : ∀ x ∈ t, Prime x) : ∀ x ∈ s, ¬Even x ∧ Prime x := by
intro x xs
constructor
· apply h₀ x (ssubt xs)
apply h₁ x (ssubt xs)
example (h : ∃ x ∈ s, ¬Even x ∧ Prime x) : ∃ x ∈ t, Prime x := by
rcases h with ⟨x, xs, _, px⟩
use x, ssubt xs
exact px
end
end
section
variable {α I : Type _}
variable (A B : I → Set α)
variable (s : Set α)
open Set
example : (s ∪ ⋂ i, A i) = ⋂ i, A i ∪ s := by
ext x
simp only [mem_union, mem_iInter]
constructor
· rintro (xs | xI)
· intro i
right
exact xs
intro i
left
exact xI i
intro h
by_cases xs : x ∈ s
· left
exact xs
right
intro i
cases h i
· assumption
contradiction
def primes : Set ℕ :=
{ x | Nat.Prime x }
example : (⋃ p ∈ primes, { x | x ≤ p }) = univ := by
apply eq_univ_of_forall
intro x
simp
rcases Nat.exists_infinite_primes x with ⟨p, primep, pge⟩
use p, pge
exact primep
end