11module Week6 where
22
3+ open import Data.Empty using (⊥)
34open 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_)
56open import Data.List.Base using (List; []; _∷_)
67
8+ open import Relation.Binary.PropositionalEquality using (_≡_; refl)
9+
710data Ty : Set where
811 bool nat : Ty
912
@@ -12,9 +15,16 @@ data Ty : Set where
1215infix 0 _∈_
1316data _∈_ {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 ∈ (0 ∷ 0 ∷ [])
25+ _ = here
26+
27+
1828data 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+
3248TVal : Ty → Set
3349TVal bool = Bool
3450TVal nat = ℕ
3551
3652Env : (Γ : List Ty) → Set
3753Env Γ = (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