Skip to content

Commit 85d5c4d

Browse files
After Week 6 lec 2
1 parent 17707ba commit 85d5c4d

File tree

1 file changed

+86
-8
lines changed

1 file changed

+86
-8
lines changed

lectures/Week6.agda

Lines changed: 86 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
module Week6 where
22

3+
open import Data.Empty using (⊥)
34
open import Data.Nat.Base using (ℕ; _+_)
4-
open import Data.Bool.Base using (Bool; if_then_else_)
5+
open import Data.Bool.Base using (Bool; true; false; if_then_else_)
56
open import Data.List.Base using (List; []; _∷_)
67

8+
open import Relation.Binary.PropositionalEquality using (_≡_; refl)
9+
710
data Ty : Set where
811
bool nat : Ty
912

@@ -12,9 +15,16 @@ data Ty : Set where
1215
infix 0 _∈_
1316
data _∈_ {A : Set} (a : A) : List A Set where
1417
-- nonsense : a ∈ []
15-
here : {xs} a ∈ (a ∷ xs)
18+
here : {xs} a ∈ (a ∷ xs)
1619
there : {x xs} a ∈ xs a ∈ (x ∷ xs)
1720

21+
_ : 0 ∈ []
22+
_ = λ ()
23+
24+
_ : 0 ∈ (00 ∷ [])
25+
_ = here
26+
27+
1828
data TExpr: List Ty) : Ty -> Set where
1929
var : {σ} σ ∈ Γ TExpr Γ σ
2030
------------------------ old same
@@ -29,16 +39,84 @@ data TExpr (Γ : List Ty) : Ty -> Set where
2939
------------------------------------
3040
TExpr Γ T
3141

42+
boolToNat : TExpr (bool ∷ []) nat
43+
boolToNat = ifte (var here) (nat 1) (nat 0)
44+
45+
double : {Γ} nat ∈ Γ TExpr Γ nat
46+
double x = add (var x) (var x)
47+
3248
TVal : Ty Set
3349
TVal bool = Bool
3450
TVal nat =
3551

3652
Env :: List Ty) Set
3753
Env Γ = (x : Ty) x ∈ Γ TVal x
3854

39-
teval : forall {T Γ} -> Env Γ TExpr Γ T -> TVal T
40-
teval {T} ρ (var x) = ρ T x
41-
teval ρ (nat n) = n
42-
teval ρ (bool b) = b
43-
teval ρ (add en em) = teval ρ en + teval ρ em
44-
teval ρ (ifte eb et ee) = if teval ρ eb then teval ρ et else teval ρ ee
55+
myBool : Env (bool ∷ [])
56+
myBool x here = false
57+
58+
myNats : Env (nat ∷ bool ∷ nat ∷ [])
59+
myNats x here = 10
60+
myNats x (there here) = false
61+
myNats x (there (there here)) = 21
62+
63+
teval : forall {T Γ} ->
64+
TExpr Γ T -> -- syntax
65+
(Env Γ TVal T) -- meaning
66+
teval {T} (var x) ρ = ρ T x
67+
teval (nat n) ρ = n
68+
teval (bool b) ρ = b
69+
teval (add en em) ρ = teval en ρ + teval em ρ
70+
teval (ifte eb et ee) ρ = if teval eb ρ then teval et ρ else teval ee ρ
71+
72+
_ : teval boolToNat myBool ≡ 0
73+
_ = refl
74+
75+
_ : teval (double here) myNats ≡ 20
76+
_ = refl
77+
78+
_ : teval (double (there (there here))) myNats ≡ 21 + 21
79+
_ = refl
80+
81+
boringIf : {Γ} TExpr Γ nat
82+
boringIf = ifte (bool true) (nat 0) (nat 1)
83+
84+
Transformation : Set
85+
Transformation = {Γ T} TExpr Γ T TExpr Γ T
86+
87+
88+
foldIf : Transformation
89+
foldIf (var x) = var x
90+
foldIf (nat n) = nat n
91+
foldIf (bool b) = bool b
92+
foldIf (add m n) = add (foldIf m) (foldIf n)
93+
foldIf (ifte b l r) with foldIf b
94+
... | bool lb = if lb then foldIf l else foldIf r -- static -> if ... then ... else ...
95+
... | b′ = ifte b′ (foldIf l) (foldIf r) -- dynamic -> ifte
96+
97+
_≋_ : {Γ T} TExpr Γ T TExpr Γ T Set
98+
s ≋ t =: Env _) teval s ρ ≡ teval t ρ
99+
100+
Correct : Transformation Set
101+
Correct transformation = {Γ T} (t : TExpr Γ T) t ≋ transformation t
102+
103+
foldIf-correct : Correct foldIf
104+
foldIf-correct (var x) ρ = refl
105+
foldIf-correct (nat n) ρ = refl
106+
foldIf-correct (bool b) ρ = refl
107+
foldIf-correct (add m n) ρ rewrite foldIf-correct m ρ | foldIf-correct n ρ = refl
108+
foldIf-correct (ifte b l r) ρ with foldIf b | foldIf-correct b ρ
109+
foldIf-correct (ifte b l r) ρ | bool lb | refl with teval b ρ
110+
... | false = foldIf-correct r ρ
111+
... | true = foldIf-correct l ρ
112+
foldIf-correct (ifte b l r) ρ | var x | qq
113+
rewrite qq | foldIf-correct l ρ | foldIf-correct r ρ = refl
114+
foldIf-correct (ifte b l r) ρ | ifte p p₁ p₂ | qq
115+
rewrite qq | foldIf-correct l ρ | foldIf-correct r ρ = refl
116+
117+
118+
foldAdd : Transformation
119+
foldAdd = {!!}
120+
121+
foldAdd-correct : Correct foldAdd
122+
foldAdd-correct = {!!}

0 commit comments

Comments
 (0)