/
2020-05-18-stlc-test.agda
82 lines (57 loc) · 2.2 KB
/
2020-05-18-stlc-test.agda
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
module Test where
#zero : ∀ {Γ} → Term Γ #Nat
#zero = wrap (intr (intrNat (#inl #unit)))
#succ : ∀ {Γ} → Term Γ #Nat → Term Γ #Nat
#succ n = wrap (intr (intrNat (#inr n)))
#add : Term ε (#Nat ⇒ #Nat ⇒ #Nat)
#add = #lambda (#elimNat (#lambda (#maybe (var $1) (#lambda (#succ (var $0))) (var $0))))
data ℕ : Set where
zero : ℕ
succ : ℕ → ℕ
{-# BUILTIN NATURAL ℕ #-}
fromNat : ℕ → Term ε #Nat
fromNat zero = #zero
fromNat (succ n) = #succ (fromNat n)
toNat : Value #Nat → ℕ
toNat (construct (intrNat (construct (intrSum (here x))))) = zero
toNat (construct (intrNat (construct (intrSum (there (here n)))))) = succ (toNat n)
test : ℕ → ℕ → Term ε #Nat
test n m = #apply (#apply #add (fromNat n)) (fromNat m)
-- _ : {!!}
-- _ = {!toNat (evaluate (test 23 15))!}
{-
module Test where
data ℕ : Set where
zero : ℕ
succ : ℕ → ℕ
{-# BUILTIN NATURAL ℕ #-}
&succ : ∀ {Γ} → Term Γ #Nat → Term Γ #Nat
&succ n = wrap (intr (intrNat (&inr n)))
#zero : ∀ {Γ} → Term Γ #Nat
#zero = wrap (intr (intrNat (&inl #unit)))
#add : Term ε (#Nat ⇒ #Nat ⇒ #Nat)
#add = #lambda (#lambda (&foldNat (var $1) (#lambda (&succ (var $0))) (var $0)))
fromNat : ℕ → Term ε #Nat
fromNat zero = #zero
fromNat (succ n) = &succ (fromNat n)
toNat : Value #Nat → ℕ
toNat (construct (intrNat (construct (intrSum (here x))))) = zero
toNat (construct (intrNat (construct (intrSum (there (here n)))))) = succ (toNat n)
test : ℕ → ℕ → Term ε #Nat
test n m = &apply (&apply #add (fromNat n)) (fromNat m)
data Bool : Set where
false true : Bool
toBool : Value #Bool → Bool
toBool (construct (intrSum (here _))) = false
toBool (construct (intrSum (there (here _)))) = true
record _↔_ (A B : Set) : Set where
field
to : A → B
from : B → A
IsDecider : Term ε ((#Nat ⇒ #Bool) ⇒ #Bool) → Set
IsDecider all =
(f : Term ε (#Nat ⇒ #Bool))
→ (toBool (evaluate (&apply all f)) ≡ true) ↔ ((n : Term ε #Nat) → toBool (evaluate (&apply f n)) ≡ true)
--_ : {!!}
--_ = {!toNat (result (run' (compile (test 5 9))))!}
-}