@@ -20,7 +20,9 @@ open ≡-Reasoning
2020
2121data 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- {-
4648plus-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
5557data 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
6263three : Fin 5
63- three = ?
64+ three = zero
6465
65- {-
6666-- Vectors (length-indexed lists).
6767-- Vec : Set → Nat → Set
6868
6969data 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 = 4 ∷ 2 ∷ 1 ∷ []
75+
7376-- Reading an element of a vector.
7477
7578lookup : ∀ {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
8284variable
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
105106Value = Num
106107Env = Vec Num
107108
108- {-
109109-- Interpretation of expressions.
110110
111111eval : (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
146147infixr 10 _∙_
147148
148- {-
149149-- Compilation of expressions
150150---------------------------------------------------------------------------
151151
152152-- The code for an expression leaves one additional value on the stack.
153153
154154compile : (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
173172open State
174173
175- {-
176174-- Executing a JVM instruction.
177175
178176step : (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
188187steps : (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
196194push : 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