-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathExamples.agda
62 lines (42 loc) · 1.54 KB
/
Examples.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
module Examples where
open import Term hiding (η; _◇_)
open import Type hiding (add)
import Type as Ty
open import Relation.Binary.PropositionalEquality
⊢_ = Tm ε
id : ⊢ ∀' ⋆ (η vz ⇒ η vz)
id = Λ ƛ var vz
const : ⊢ ∀' ⋆ (∀' ⋆ (η (vs vz) ⇒ η vz ⇒ η (vs vz)))
const = Λ Λ ƛ ƛ var (vsₜ vz)
nat : ∀ {Γ} → Ty Γ ⋆
nat = ∀' ⋆ ((η vz ⇒ η vz) ⇒ η vz ⇒ η vz)
list : ∀ {Γ} → Ty Γ (⋆ ⇒ ⋆)
list = ƛ ∀' ⋆ ((η (vs vz) ⇒ η vz ⇒ η vz) ⇒ η vz ⇒ η vz)
zero : ⊢ nat
zero = Λ ƛ ƛ var vz
suc : ⊢ (nat ⇒ nat)
suc = ƛ Λ ƛ ƛ (var (vsₜ vz) ∙ (var (vsₜ vsₜ vsₖ vz) ∙ₜ η vz ∙ var (vsₜ vz) ∙ var vz))
one : ⊢ nat
one = suc ∙ zero
two : ⊢ nat
two = suc ∙ one
add : ⊢ (nat ⇒ nat ⇒ nat)
add = ƛ ƛ Λ ƛ ƛ (
var (vsₜ vsₜ vsₖ vsₜ vz) ∙ₜ η vz ∙ var (vsₜ vz)
∙ (var (vsₜ vsₜ vsₖ vz) ∙ₜ η vz ∙ var (vsₜ vz) ∙ var vz)
)
two' : Nf ε nat
two' = Λ (ƛ (ƛ ne ((vsₜ vz) , (ne ((vsₜ vz) , (ne (vz , ε) ∷ ε)) ∷ ε))))
test : nf two ≡ two'
test = refl
nil : ⊢ ∀' ⋆ (list ◇ (η vz ∷ ε))
nil = Λ (Λ (ƛ (ƛ var vz)))
cons : ⊢ ∀' ⋆ (η vz ⇒ (list ◇ (η vz ∷ ε)) ⇒ (list ◇ (η vz ∷ ε)))
cons = Λ ƛ ƛ Λ ƛ ƛ
(var (vsₜ vz) ∙ var (vsₜ vsₜ vsₖ vsₜ vz)
∙ (var (vsₜ vsₜ vsₖ vz) ∙ₜ η vz ∙ var (vsₜ vz) ∙ var vz))
natList : ⊢ (list ◇ (nat ∷ ε))
natList =
cons ∙ₜ nat ∙ one ∙
(cons ∙ₜ nat ∙ two ∙
(nil ∙ₜ nat))