-
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
-
162
-
163
-
164
-
165
-
166
-
167
-
168
-
169
-
170
-
171
-
172
-
173
-
174
-
175
-
176
-
177
-
178
-
179
-
180
-
181
-
182
-
183
-
184
-
185
-
186
-
187
-
188
-
189
-
190
-
191
-
192
-
193
-
194
-
195
-
196
-
197
-
198
-
199
-
200
-
201
-
202
-
203
-
204
-
205
-
206
-
207
-
208
-
209
-
210
-
211
-
212
-
213
-
214
-
215
-
216
-
217
-
218
-
219
-
220
-
221
-
222
-
223
-
224
-
225
-
226
-
227
-
228
import algebra.big_operators.ring
import data.real.basic
@[ext] structure point := (x : ℝ) (y : ℝ) (z : ℝ)
#check point.ext
example (a b : point) (hx : a.x = b.x) (hy : a.y = b.y) (hz : a.z = b.z) :
a = b :=
begin
ext,
repeat { assumption }
end
def my_point1 : point :=
{ x := 2,
y := -1,
z := 4 }
def my_point2 :=
{ point .
x := 2,
y := -1,
z := 4 }
def my_point3 : point := ⟨2, -1, 4⟩
def my_point4 := point.mk 2 (-1) 4
structure point' := build :: (x : ℝ) (y : ℝ) (z : ℝ)
#check point'.build 2 (-1) 4
namespace point
def add (a b : point) : point := ⟨a.x + b.x, a.y + b.y, a.z + b.z⟩
def add' (a b : point) : point :=
{ x := a.x + b.x,
y := a.y + b.y,
z := a.z + b.z }
#check add my_point1 my_point2
#check my_point1.add my_point2
end point
#check point.add my_point1 my_point2
#check my_point1.add my_point2
namespace point
protected theorem add_comm (a b : point) : add a b = add b a :=
begin
rw [add, add],
ext; dsimp,
repeat { apply add_comm }
end
example (a b : point) : add a b = add b a :=
by simp [add, add_comm]
theorem add_x (a b : point) : (a.add b).x = a.x + b.x := rfl
def add_alt : point → point → point
| (point.mk x₁ y₁ z₁) (point.mk x₂ y₂ z₂) := ⟨x₁ + x₂, y₁ + y₂, z₁ + z₂⟩
def add_alt' : point → point → point
| ⟨x₁, y₁, z₁⟩ ⟨x₂, y₂, z₂⟩ := ⟨x₁ + x₂, y₁ + y₂, z₁ + z₂⟩
theorem add_alt_x (a b : point) : (a.add_alt b).x = a.x + b.x :=
by { cases a, cases b, refl }
theorem add_alt_comm (a b : point) : add_alt a b = add_alt b a :=
begin
rcases a with ⟨xa, ya, za⟩,
rcases b with ⟨xb, yb, zb⟩,
rw [add_alt, add_alt],
ext; dsimp,
apply add_comm,
repeat { apply add_comm },
end
example (a b : point) : add_alt a b = add_alt b a :=
begin
rcases a with ⟨xa, ya, za⟩,
rcases b with ⟨xb, yb, zb⟩,
simp [add_alt, add_comm]
end
example : ∀ a b : point, add_alt a b = add_alt b a :=
begin
rintros ⟨xa, ya, za⟩ ⟨xb, yb, zb⟩,
simp [add_alt, add_comm]
end
example : ∀ a b : point, add a b = add b a :=
λ ⟨xa, ya, za⟩ ⟨xb, yb, zb⟩, by simp [add, add_comm]
protected theorem add_assoc (a b c : point) :
(a.add b).add c = a.add (b.add c) :=
sorry
def smul (r : ℝ) (a : point) : point :=
sorry
theorem smul_distrib (r : ℝ) (a b : point) :
(smul r a).add (smul r b) = smul r (a.add b) :=
sorry
end point
structure standard_two_simplex :=
(x : ℝ)
(y : ℝ)
(z : ℝ)
(x_nonneg : 0 ≤ x)
(y_nonneg : 0 ≤ y)
(z_nonneg : 0 ≤ z)
(sum_eq : x + y + z = 1)
namespace standard_two_simplex
def swap_xy (a : standard_two_simplex) : standard_two_simplex :=
{ x := a.y,
y := a.x,
z := a.z,
x_nonneg := a.y_nonneg,
y_nonneg := a.x_nonneg,
z_nonneg := a.z_nonneg,
sum_eq := by rw [add_comm a.y a.x, a.sum_eq] }
noncomputable theory
def midpoint (a b : standard_two_simplex) : standard_two_simplex :=
{ x := (a.x + b.x) / 2,
y := (a.y + b.y) / 2,
z := (a.z + b.z) / 2,
x_nonneg := div_nonneg (add_nonneg a.x_nonneg b.x_nonneg) (by norm_num),
y_nonneg := div_nonneg (add_nonneg a.y_nonneg b.y_nonneg) (by norm_num),
z_nonneg := div_nonneg (add_nonneg a.z_nonneg b.z_nonneg) (by norm_num),
sum_eq := by { field_simp, linarith [a.sum_eq, b.sum_eq]} }
def weighted_average (lambda : real)
(lambda_nonneg : 0 ≤ lambda) (lambda_le : lambda ≤ 1)
(a b : standard_two_simplex) :
standard_two_simplex :=
sorry
end standard_two_simplex
open_locale big_operators
structure standard_simplex (n : ℕ) :=
(v : fin n → ℝ)
(nonneg : ∀ i : fin n, 0 ≤ v i)
(sum_eq_one : ∑ i, v i = 1)
namespace standard_simplex
def midpoint (n : ℕ) (a b : standard_simplex n) : standard_simplex n :=
{ v := λ i, (a.v i + b.v i) / 2,
nonneg :=
begin
intro i,
apply div_nonneg,
{ linarith [a.nonneg i, b.nonneg i] },
norm_num
end,
sum_eq_one :=
begin
simp [div_eq_mul_inv, ←finset.sum_mul, finset.sum_add_distrib,
a.sum_eq_one, b.sum_eq_one],
field_simp
end }
end standard_simplex
structure is_linear (f : ℝ → ℝ) :=
(is_additive : ∀ x y, f (x + y) = f x + f y)
(preserves_mul : ∀ x c, f (c * x) = c * f x)
section
variables (f : ℝ → ℝ) (linf : is_linear f)
#check linf.is_additive
#check linf.preserves_mul
end
def point'' := ℝ × ℝ × ℝ
def is_linear' (f : ℝ → ℝ) :=
(∀ x y, f (x + y) = f x + f y) ∧ (∀ x c, f (c * x) = c * f x)
def preal := { y : ℝ // 0 < y }
section
variable x : preal
#check x.val
#check x.property
#check x.1
#check x.2
end
def standard_two_simplex' :=
{ p : ℝ × ℝ × ℝ // 0 ≤ p.1 ∧ 0 ≤ p.2.1 ∧ 0 ≤ p.2.2 ∧ p.1 + p.2.1 + p.2.2 = 1 }
def standard_simplex' (n : ℕ) :=
{ v : fin n → ℝ // (∀ i : fin n, 0 ≤ v i) ∧ (∑ i, v i = 1) }
def std_simplex := Σ n : ℕ, standard_simplex n
section
variable s : std_simplex
#check s.fst
#check s.snd
#check s.1
#check s.2
end