-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathIR.agda
More file actions
56 lines (44 loc) · 1.62 KB
/
Copy pathIR.agda
File metadata and controls
56 lines (44 loc) · 1.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
open import Data.Empty
open import Data.Unit
open import Data.Bool
open import Data.Product
open import Data.Nat hiding ( _⊔_ )
open import Data.Fin hiding ( _+_ )
open import Function
open import Relation.Binary.PropositionalEquality
module IR where
----------------------------------------------------------------------
data W (A : Set) (B : A → Set) : Set where
sup : (a : A) (t : B a → W A B) → W A B
mutual
data Lang : Set where
Zero One Two : Lang
Pair Fun Tree : (A : Lang) (B : ⟦ A ⟧ → Lang) → Lang
⟦_⟧ : Lang → Set
⟦ Zero ⟧ = ⊥
⟦ One ⟧ = ⊤
⟦ Two ⟧ = Bool
⟦ Pair A B ⟧ = Σ ⟦ A ⟧ λ a → ⟦ B a ⟧
⟦ Fun A B ⟧ = (a : ⟦ A ⟧) → ⟦ B a ⟧
⟦ Tree A B ⟧ = W ⟦ A ⟧ λ a → ⟦ B a ⟧
----------------------------------------------------------------------
sum : (n : ℕ) (f : Fin n → ℕ) → ℕ
sum zero f = zero
sum (suc n) f = f zero + sum n (f ∘ suc)
prod : (n : ℕ) (f : Fin n → ℕ) → ℕ
prod zero f = suc zero
prod (suc n) f = f zero * prod n (f ∘ suc)
mutual
data Arith : Set where
Num : ℕ → Arith
Sum : (A : Arith) (f : Fin (eval A) → Arith) → Arith
Prod : (A : Arith) (f : Fin (eval A) → Arith) → Arith
eval : Arith → ℕ
eval (Num n) = n
eval (Sum A f) = sum (eval A) λ a → sum (toℕ a) λ b → eval (f (inject b))
eval (Prod A f) = prod (eval A) λ a → sum (toℕ a) λ b → eval (f (inject b))
sum-lt-5 : Arith
sum-lt-5 = Sum (Num 5) λ a → Num (toℕ a)
test-eval : eval sum-lt-5 ≡ 10
test-eval = refl
----------------------------------------------------------------------