-
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
-
159
-
160
-
161
import data.real.basic
section
variables {x y : ℝ}
namespace my_abs
theorem le_abs_self (x : ℝ) : x ≤ abs x :=
begin
cases le_or_gt 0 x with h h,
{ rw abs_of_nonneg h },
rw abs_of_neg h,
linarith
end
theorem neg_le_abs_self (x : ℝ) : -x ≤ abs x :=
begin
cases le_or_gt 0 x with h h,
{ rw abs_of_nonneg h,
linarith },
rw abs_of_neg h
end
theorem abs_add (x y : ℝ) : abs (x + y) ≤ abs x + abs y :=
begin
cases le_or_gt 0 (x + y) with h h,
{ rw abs_of_nonneg h,
linarith [le_abs_self x, le_abs_self y] },
rw abs_of_neg h,
linarith [neg_le_abs_self x, neg_le_abs_self y]
end
theorem lt_abs : x < abs y ↔ x < y ∨ x < -y :=
begin
cases le_or_gt 0 y with h h,
{ rw abs_of_nonneg h,
split,
{ intro h', left, exact h' },
intro h',
cases h' with h' h',
{ exact h' },
linarith },
rw abs_of_neg h,
split,
{ intro h', right, exact h' },
intro h',
cases h' with h' h',
{ linarith },
exact h'
end
theorem abs_lt : abs x < y ↔ - y < x ∧ x < y :=
begin
cases le_or_gt 0 x with h h,
{ rw abs_of_nonneg h,
split,
{ intro h',
split,
{ linarith },
exact h' },
intro h',
cases h' with h1 h2,
exact h2 },
rw abs_of_neg h,
split,
{ intro h',
split,
{ linarith },
linarith },
intro h',
linarith
end
end my_abs
end
example {z : ℝ} (h : ∃ x y, z = x^2 + y^2 ∨ z = x^2 + y^2 + 1) :
z ≥ 0 :=
by { rcases h with ⟨x, y, rfl | rfl⟩; linarith [sq_nonneg x, sq_nonneg y] }
example {x : ℝ} (h : x^2 = 1) : x = 1 ∨ x = -1 :=
begin
have h' : x^2 - 1 = 0,
{ rw [h, sub_self] },
have h'' : (x + 1) * (x - 1) = 0,
{ rw ← h',
ring },
cases eq_zero_or_eq_zero_of_mul_eq_zero h'' with h1 h1,
{ right,
exact eq_neg_iff_add_eq_zero.mpr h1 },
left,
exact eq_of_sub_eq_zero h1
end
example {x y : ℝ} (h : x^2 = y^2) : x = y ∨ x = -y :=
begin
have h' : x^2 - y^2 = 0,
{ rw [h, sub_self] },
have h'' : (x + y) * (x - y) = 0,
{ rw ← h',
ring },
cases eq_zero_or_eq_zero_of_mul_eq_zero h'' with h1 h1,
{ right,
exact eq_neg_iff_add_eq_zero.mpr h1 },
left,
exact eq_of_sub_eq_zero h1
end
section
variables {R : Type*} [comm_ring R] [is_domain R]
variables (x y : R)
example (h : x^2 = 1) : x = 1 ∨ x = -1 :=
begin
have h' : x^2 - 1 = 0,
{ rw [h, sub_self] },
have h'' : (x + 1) * (x - 1) = 0,
{ rw ← h',
ring },
cases eq_zero_or_eq_zero_of_mul_eq_zero h'' with h1 h1,
{ right,
exact eq_neg_iff_add_eq_zero.mpr h1 },
left,
exact eq_of_sub_eq_zero h1
end
example (h : x^2 = y^2) : x = y ∨ x = -y :=
begin
have h' : x^2 - y^2 = 0,
{ rw [h, sub_self] },
have h'' : (x + y) * (x - y) = 0,
{ rw ← h',
ring },
cases eq_zero_or_eq_zero_of_mul_eq_zero h'' with h1 h1,
{ right,
exact eq_neg_iff_add_eq_zero.mpr h1 },
left,
exact eq_of_sub_eq_zero h1
end
end
section
open_locale classical
example (P Q : Prop) : (P → Q) ↔ ¬ P ∨ Q :=
begin
split,
{ intro h,
by_cases h' : P,
{ right,
exact h h'},
left,
exact h' },
rintros (h | h),
{ intro h',
exact absurd h' h },
intro _,
exact h
end
end