Skip to content

Commit 475ba51

Browse files
committed
Try to add an inductive definition of a multivector
1 parent fcb198a commit 475ba51

File tree

1 file changed

+126
-3
lines changed

1 file changed

+126
-3
lines changed

src/geometric_algebra/nursery/chisolm.lean

+126-3
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,133 @@ namespace geometric_algebra
3434

3535
section
3636

37+
3738
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)
41164

42165
def fᵥ : G₁ →+ G := f₁ G₀
43166

0 commit comments

Comments
 (0)