@@ -34,10 +34,133 @@ namespace geometric_algebra
34
34
35
35
section
36
36
37
+
37
38
parameters
38
- {G₀ : Type *} [field G₀]
39
- {G₁ : Type *} [add_comm_group G₁] [vector_space G₀ G₁]
40
- {G : Type *} [ring G] [algebra G₀ G] [geometric_algebra G₀ G₁ G]
39
+ {G₀ : Type u} [field G₀]
40
+ {G₁ : Type u} [add_comm_group G₁] [vector_space G₀ G₁]
41
+ {G : Type u} [ring G] [algebra G₀ G] [geometric_algebra G₀ G₁ G]
42
+
43
+
44
+ -- define a blade representation
45
+ -- TODO: how to describe the fact that the vector argument to `graded` must be orthogonal?
46
+ inductive blade : nat → Type u
47
+ | scalar : G₀ → blade 0
48
+ | vector : G₁ → blade 1
49
+ | graded {n : ℕ} : G₁ → blade (n + 1 ) → blade (n + 2 )
50
+ namespace blade
51
+ instance g0_coe : has_coe G₀ (blade 0 ) := { coe := blade.scalar }
52
+ instance g1_coe : has_coe G₁ (blade 1 ) := { coe := blade.vector }
53
+
54
+ -- define zero and one on the blades
55
+ def zero : Π (n : ℕ), blade n
56
+ | 0 := blade.scalar (0 : G₀)
57
+ | 1 := blade.vector (0 : G₁)
58
+ | (nat.succ $ nat.succ n) := blade.graded (0 : G₁) (zero $ nat.succ n)
59
+ instance has_zero {n : ℕ} : has_zero (blade n) := { zero := zero n }
60
+ instance r0_has_one : has_one (blade 0 ) := { one := (1 : G₀) }
61
+
62
+ -- define add on the blades
63
+ def r0_add (a : blade 0 ) (b : blade 0 ) : blade 0 := begin
64
+ cases a with a',
65
+ cases b with b',
66
+ exact blade.scalar (a' + b')
67
+ end
68
+ instance r0_has_add : has_add (blade 0 ) := { add := r0_add }
69
+ def r1_add (a : blade 1 ) (b : blade 1 ) : blade 1 := begin
70
+ cases a,
71
+ cases b,
72
+ exact blade.vector (a_1 + b_1)
73
+ end
74
+ instance r1_has_add : has_add (blade 1 ) := { add := r1_add }
75
+ end blade
76
+
77
+ -- define a sum-of-blades representation
78
+ inductive hom_mv : nat → Type u
79
+ | scalar : blade 0 -> hom_mv 0
80
+ | vector : blade 1 -> hom_mv 1
81
+ | graded {n : ℕ} : list (blade $ nat.succ $ nat.succ n) → (hom_mv $ nat.succ $ nat.succ n)
82
+
83
+ namespace hom_mv
84
+ def coe : Π {n : ℕ}, (blade n) → hom_mv n
85
+ | 0 := hom_mv.scalar
86
+ | 1 := hom_mv.vector
87
+ | (r + 2 ) := λ b, hom_mv.graded [b]
88
+ instance has_blade_coe {r : ℕ} : has_coe (blade r) (hom_mv r) := { coe := coe }
89
+ instance has_g0_coe : has_coe G₀ (hom_mv 0 ) := { coe := λ s, coe s }
90
+ instance has_g1_coe : has_coe G₁ (hom_mv 1 ) := { coe := λ s, coe s }
91
+
92
+ -- define zero and one on the hom_mvs
93
+ instance has_zero {n : ℕ} : has_zero (hom_mv n) := { zero := (0 : blade n) }
94
+ instance r0_has_one : has_one (hom_mv 0 ) := { one := (1 : blade 0 ) }
95
+
96
+ def add : Π {n : ℕ}, hom_mv n → hom_mv n → hom_mv n
97
+ | 0 := λ a b, begin
98
+ cases a with a',
99
+ cases b with b',
100
+ exact hom_mv.scalar (a' + b'),
101
+ end
102
+ | 1 := λ a b, begin
103
+ cases a,
104
+ cases b,
105
+ exact hom_mv.vector (a_1 + b_1)
106
+ end
107
+ | (n + 2 ) := λ a b,begin
108
+ cases a,
109
+ cases b,
110
+ exact hom_mv.graded (a_a ++ b_a),
111
+ end
112
+ instance has_add {n : ℕ} : has_add (hom_mv n) := { add := add }
113
+ end hom_mv
114
+
115
+ inductive multivector : nat → Type u
116
+ | scalar : hom_mv 0 → multivector 0
117
+ | augment {n : ℕ} : multivector n → hom_mv (nat.succ n) → multivector (nat.succ n)
118
+
119
+
120
+ namespace mv
121
+ -- define zero and one on the multivectors
122
+ def mv_zero : Π (n : ℕ), multivector n
123
+ | 0 := multivector.scalar (0 : G₀)
124
+ | 1 := multivector.augment (mv_zero 0 ) 0
125
+ | (nat.succ $ nat.succ n) := multivector.augment (mv_zero $ nat.succ n) (hom_mv.graded [])
126
+ def mv_one : Π (n : ℕ), multivector n
127
+ | 0 := multivector.scalar (1 : G₀)
128
+ | 1 := multivector.augment (mv_one 0 ) 0
129
+ | (nat.succ $ nat.succ n) := multivector.augment (mv_one $ nat.succ n) (hom_mv.graded [])
130
+ instance mv_has_zero {n : ℕ} : has_zero (multivector n) := { zero := mv_zero n }
131
+ instance mv_has_one {n : ℕ} : has_one (multivector n) := { one := mv_one n }
132
+
133
+ -- blades are coercible to multivectors
134
+ def hom_mv_coe : Π {n : ℕ}, (hom_mv n) -> (multivector n)
135
+ | nat.zero := λ b, multivector.scalar b
136
+ | (nat.succ n) := λ b, multivector.augment (mv_zero n) b
137
+ instance has_hom_mv_coe {n : ℕ} : has_coe (hom_mv n) (multivector n) := { coe := hom_mv_coe }
138
+ instance has_g0_coe : has_coe G₀ (multivector 0 ) := { coe := λ s, hom_mv_coe $ hom_mv.scalar $ blade.scalar s }
139
+ instance has_g1_coe : has_coe G₁ (multivector 1 ) := { coe := λ v, hom_mv_coe $ hom_mv.vector $ blade.vector v }
140
+
141
+ -- multivectors are up-coercible
142
+ def augment_coe {n : ℕ} (mv : multivector n) : multivector (nat.succ n) := multivector.augment mv 0
143
+ instance has_augment_coe {n : ℕ} : has_coe (multivector n) (multivector (nat.succ n)) := { coe := augment_coe }
144
+
145
+ def mv_add : Π {n : ℕ}, multivector n → multivector n → multivector n
146
+ | 0 := λ a b, begin
147
+ cases a,
148
+ cases b,
149
+ exact multivector.scalar (a_1 + b_1)
150
+ end
151
+ | (nat.succ n) := λ a b, begin
152
+ cases a with z z a' ar,
153
+ cases b with z z b' br,
154
+ exact multivector.augment (mv_add a' b') (ar + br)
155
+ end
156
+ instance has_add {n: ℕ} : has_add (multivector n) := { add := mv_add }
157
+ end mv
158
+
159
+ parameter v : G₁
160
+
161
+ -- Addition!
162
+ #check ((2 + v) : multivector 1 )
163
+ #check ((2 + v) : multivector 2 )
41
164
42
165
def fᵥ : G₁ →+ G := f₁ G₀
43
166
0 commit comments