-
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
import MIL.Common
import Mathlib.Data.Real.Basic
namespace C06S02
structure AddGroup₁ (α : Type*) where
add : α → α → α
zero : α
neg : α → α
add_assoc : ∀ x y z : α, add (add x y) z = add x (add y z)
add_zero : ∀ x : α, add x zero = x
zero_add : ∀ x : α, add x zero = x
neg_add_cancel : ∀ x : α, add (neg x) x = zero
@[ext]
structure Point where
x : ℝ
y : ℝ
z : ℝ
namespace Point
def add (a b : Point) : Point :=
⟨a.x + b.x, a.y + b.y, a.z + b.z⟩
def neg (a : Point) : Point :=
⟨-a.x, -a.y, -a.z⟩
def zero : Point :=
⟨0, 0, 0⟩
def addGroupPoint : AddGroup₁ Point where
add := Point.add
zero := Point.zero
neg := Point.neg
add_assoc := by simp [Point.add, add_assoc]
add_zero := by simp [Point.add, Point.zero]
zero_add := by simp [Point.add, Point.zero]
neg_add_cancel := by simp [Point.add, Point.neg, Point.zero]
end Point
class AddGroup₂ (α : Type*) where
add : α → α → α
zero : α
neg : α → α
add_assoc : ∀ x y z : α, add (add x y) z = add x (add y z)
add_zero : ∀ x : α, add x zero = x
zero_add : ∀ x : α, add x zero = x
neg_add_cancel : ∀ x : α, add (neg x) x = zero
instance hasAddAddGroup₂ {α : Type*} [AddGroup₂ α] : Add α :=
⟨AddGroup₂.add⟩
instance hasZeroAddGroup₂ {α : Type*} [AddGroup₂ α] : Zero α :=
⟨AddGroup₂.zero⟩
instance hasNegAddGroup₂ {α : Type*} [AddGroup₂ α] : Neg α :=
⟨AddGroup₂.neg⟩
instance : AddGroup₂ Point where
add := Point.add
zero := Point.zero
neg := Point.neg
add_assoc := by simp [Point.add, add_assoc]
add_zero := by simp [Point.add, Point.zero]
zero_add := by simp [Point.add, Point.zero]
neg_add_cancel := by simp [Point.add, Point.neg, Point.zero]
section
variable (x y : Point)
#check x + -y + 0
end