Skip to content

Commit d405045

Browse files
committed
Lecture on Agda 2025: live coding finish
1 parent 5d5ab77 commit d405045

1 file changed

Lines changed: 47 additions & 35 deletions

File tree

live/2025/agda/JVM.agda

Lines changed: 47 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ open ≡-Reasoning
2020

2121
data List (A : Set) : Set where
2222
[] : List A
23-
_∷_ : (x : A) (xs : List A) List A
23+
_∷_ : (x : A) (xs : List A) List A -- \ : :
24+
25+
{-# BUILTIN LIST List #-}
2426

2527
-- Natural numbers in unary notation.
2628

@@ -40,50 +42,49 @@ infixr 6 _∷_
4042
-- Addition.
4143

4244
_+_ : (n m : Nat) Nat
43-
n + m = {!!}
45+
zero + m = m
46+
suc n + m = suc (n + m)
4447

45-
{-
4648
plus-0 : (n : Nat) n + 0 ≡ n
47-
plus-0 n = {!!}
49+
plus-0 zero = refl
50+
plus-0 (suc n) = cong suc (plus-0 n)
4851

4952
-- Indexed types: Fin, Vec
5053
---------------------------------------------------------------------------
5154

52-
{-
53-
-- Bounded numbers: Fin n = { m | n < m }.
55+
-- Bounded numbers: Fin n = { m | m < n }.
5456

5557
data Fin : Nat Set where
5658
zero : {n : Nat} Fin (suc n)
5759
suc : {n : Nat} (i : Fin n) Fin (suc n)
5860

59-
{-
6061
-- Example with hidden arguments.
6162

6263
three : Fin 5
63-
three = ?
64+
three = zero
6465

65-
{-
6666
-- Vectors (length-indexed lists).
6767
-- Vec : Set → Nat → Set
6868

6969
data Vec (A : Set) : Nat Set where
7070
[] : Vec A zero
7171
_∷_ : {n : Nat} (x : A) (xs : Vec A n) Vec A (suc n)
7272

73+
v3 : Vec Nat 3
74+
v3 = 421 ∷ []
75+
7376
-- Reading an element of a vector.
7477

7578
lookup : {n A} (i : Fin n) (xs : Vec A n) A
76-
lookup i xs = {!!}
77-
78-
{-
79+
lookup zero (x ∷ xs) = x
80+
lookup (suc i) (x ∷ xs) = lookup i xs
7981

8082
-- Automatic quantification over hidden arguments.
8183

8284
variable
8385
n : Nat
8486
A : Set
8587

86-
{-
8788
-- Expressions and interpretation: "Hutton's razor"
8889
---------------------------------------------------------------------------
8990

@@ -105,13 +106,13 @@ data Exp (n : Nat) : Set where
105106
Value = Num
106107
Env = Vec Num
107108

108-
{-
109109
-- Interpretation of expressions.
110110

111111
eval : (e : Exp n) (γ : Env n) Value
112-
eval e γ = ?
112+
eval (var x) γ = lookup x γ
113+
eval (num w) γ = w
114+
eval (plus e e₁) γ = eval e γ + eval e₁ γ
113115

114-
{-
115116
-- A fragment of JVM
116117
---------------------------------------------------------------------------
117118

@@ -145,18 +146,16 @@ data Inss (n : StoreSize) (m : StackSize) : (m' : StackSize) → Set where
145146

146147
infixr 10 _∙_
147148

148-
{-
149149
-- Compilation of expressions
150150
---------------------------------------------------------------------------
151151

152152
-- The code for an expression leaves one additional value on the stack.
153153

154154
compile : (e : Exp n) Inss n m (suc m)
155-
compile (var x) = ?
156-
compile (num w) = ?
157-
compile (plus e e') = ?
155+
compile (var x) = ins (load x)
156+
compile (num w) = ins (ldc w)
157+
compile (plus e e') = compile e ∙ compile e' ∙ ins add
158158

159-
{-
160159
-- JVM small-step semantics
161160
---------------------------------------------------------------------------
162161

@@ -172,25 +171,24 @@ record State (n : StoreSize) (m : StackSize) : Set where
172171
S : Stack m
173172
open State
174173

175-
{-
176174
-- Executing a JVM instruction.
177175

178176
step : (i : Ins n m m') (s : State n m) State n m'
179-
step i s = {!!}
180-
181-
{-
177+
step (load a) (state V S) = state V (lookup a V ∷ S)
178+
step add (state V (a ∷ b ∷ S)) = state V ((b + a) ∷ S)
179+
step (ldc w) (state V S) = state V (w ∷ S)
180+
step pop (state V (_ ∷ S)) = state V S
182181

183182
-- Compiler correctness
184183
---------------------------------------------------------------------------
185184

186185
-- Executing a series of JVM instructions.
187186

188187
steps : (is : Inss n m m') (s : State n m) State n m'
189-
steps (ins i) s = {!!}
190-
steps [] s = {!!}
191-
steps (is ∙ is') s = {!!}
188+
steps (ins i) s = step i s
189+
steps [] s = s
190+
steps (is ∙ is') s = steps is' (steps is s)
192191

193-
{-
194192
-- Pushing a word onto the stack.
195193

196194
push : Word State n m State n (suc m)
@@ -210,20 +208,34 @@ sound : (e : Exp n) (s : State n m) →
210208
steps (compile e) s ≡ push-eval e s
211209

212210
-- Case: variables
213-
sound (var x) s = {!!}
211+
sound (var x) s = refl
214212

215213
-- Case: number literals.
216-
sound (num w) s = {!!}
214+
sound (num w) s = refl
217215

218216
-- Case: addition expression.
219-
sound (plus e e') s = begin
220-
steps (compile (plus e e')) s ≡⟨ {!!} ⟩
221-
push-eval (plus e e') s
217+
sound (plus e e') s@(state V S) = begin
218+
219+
steps (compile (plus e e')) s ≡⟨ refl ⟩
220+
steps (compile e ∙ compile e' ∙ ins add) s ≡⟨ refl ⟩
221+
steps (compile e' ∙ ins add) (steps (compile e) s) ≡⟨ cong (steps (compile e' ∙ ins add)) (sound e s) ⟩
222+
steps (compile e' ∙ ins add) (push-eval e s) ≡⟨ refl ⟩
223+
steps (ins add) (steps (compile e') (push-eval e s)) ≡⟨ cong (steps (ins add)) (sound e' (push-eval e s)) ⟩
224+
steps (ins add) (push-eval e' (push-eval e s)) ≡⟨ refl ⟩
225+
step add (push-eval e' (push-eval e s)) ≡⟨ refl ⟩
226+
step add (push-eval e' (push-eval e (state V S))) ≡⟨ refl ⟩
227+
step add (push-eval e' (state V (eval e V ∷ S))) ≡⟨ refl ⟩
228+
step add (state V (eval e' V ∷ eval e V ∷ S)) ≡⟨ refl ⟩
229+
state V ((eval e V + eval e' V) ∷ S) ≡⟨ refl ⟩
230+
state V (eval (plus e e') V ∷ S) ≡⟨ refl ⟩
231+
push-eval (plus e e') (state V S) ≡⟨ refl ⟩
232+
push-eval (plus e e') s
233+
222234
223235
where s' = push-eval e s
224236

225-
-- steps (compile (plus e e') s)
226237
-- = steps (compile e ∙ compile e' ∙ ins add) s
238+
-- steps (compile (plus e e') s)
227239
-- = steps (compile e' ∙ ins add) (steps (compile e) s) -- by ind.hyp.
228240
-- = steps (compile e' ∙ ins add) (push-eval e s)
229241
-- = steps (ins add) (steps (compile e') (push-eval e s))

0 commit comments

Comments
 (0)