forked from hazelgrove/hazelnut-dynamics-agda
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcore-exp.agda
121 lines (111 loc) · 4.17 KB
/
core-exp.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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
open import Prelude
open import Nat
open import core-type
module core-exp where
-- external expressions
data hexp : Set where
c : hexp
_·:_ : hexp → htyp → hexp
X : Nat → hexp
·λ : hexp → hexp
·λ[_]_ : htyp → hexp → hexp
·Λ : hexp → hexp
⦇-⦈ : hexp
⦇⌜_⌟⦈ : hexp → hexp
_∘_ : hexp → hexp → hexp
_<_> : hexp → htyp → hexp
-- internal expressions
data ihexp : Set where
c : ihexp
X : Nat → ihexp
·λ[_]_ : htyp → ihexp → ihexp
·Λ : ihexp → ihexp
⦇-⦈ : ihexp
⦇⌜_⌟⦈ : ihexp → ihexp
_∘_ : ihexp → ihexp → ihexp
_<_> : ihexp → htyp → ihexp
_⟨_⇒_⟩ : ihexp → htyp → htyp → ihexp
_⟨_⇒⦇-⦈⇏_⟩ : ihexp → htyp → htyp → ihexp
-- convenient notation for chaining together two agreeable casts
_⟨_⇒_⇒_⟩ : ihexp → htyp → htyp → htyp → ihexp
d ⟨ t1 ⇒ t2 ⇒ t3 ⟩ = d ⟨ t1 ⇒ t2 ⟩ ⟨ t2 ⇒ t3 ⟩
-- precision for external expressions
data _⊑_ : (e1 e2 : hexp) → Set where
PConst : c ⊑ c
PVar : ∀{n} → (X n) ⊑ (X n)
PAsc : ∀{e1 e2 τ1 τ2} → e1 ⊑ e2 → τ1 ⊑t τ2 → (e1 ·: τ1) ⊑ (e2 ·: τ2)
PEHole : ∀{e} → e ⊑ ⦇-⦈
PLam1 : ∀{e1 e2} → e1 ⊑ e2 → (·λ e1) ⊑ (·λ e2)
PLam2 : ∀{e1 e2 τ1 τ2} → e1 ⊑ e2 → τ1 ⊑t τ2 → (·λ[ τ1 ] e1) ⊑ (·λ[ τ2 ] e2)
PTLam : ∀{e1 e2} → e1 ⊑ e2 → (·Λ e1) ⊑ (·Λ e2)
PNEHole : ∀{e1 e2} → e1 ⊑ e2 → (⦇⌜ e1 ⌟⦈) ⊑ (⦇⌜ e2 ⌟⦈)
PAp : ∀{e1 e2 e3 e4} → e1 ⊑ e3 → e2 ⊑ e4 → (e1 ∘ e2) ⊑ (e3 ∘ e4)
PTAp : ∀{e1 e2 τ1 τ2} → e1 ⊑ e2 → τ1 ⊑t τ2 → (e1 < τ1 >) ⊑ (e2 < τ2 >)
data _subsumable : (e : hexp) → Set where
Subsumable : ∀{e} → ((e' : hexp) → e ≠ ·Λ e') → e subsumable
-- values
data _val : (d : ihexp) → Set where
VConst : c val
VLam : ∀{τ d} → (·λ[ τ ] d) val
VTLam : ∀{d} → (·Λ d) val
-- boxed values
data _boxedval : (d : ihexp) → Set where
BVVal : ∀{d} →
d val →
d boxedval
BVArrCast : ∀{ d τ1 τ2 τ3 τ4 } →
τ1 ==> τ2 ≠ τ3 ==> τ4 →
d boxedval →
d ⟨ (τ1 ==> τ2) ⇒ (τ3 ==> τ4) ⟩ boxedval
BVForallCast : ∀{ d τ1 τ2 } →
(·∀ τ1) ≠ (·∀ τ2) →
d boxedval →
d ⟨ (·∀ τ1) ⇒ (·∀ τ2) ⟩ boxedval
BVHoleCast : ∀{ τ d } →
τ ground →
d boxedval →
d ⟨ τ ⇒ ⦇-⦈ ⟩ boxedval
mutual
-- indeterminate forms
data _indet : (d : ihexp) → Set where
IEHole : ⦇-⦈ indet
INEHole : ∀{d} →
d final →
⦇⌜ d ⌟⦈ indet
IAp : ∀{d1 d2} →
((τ1 τ2 τ3 τ4 : htyp) (d1' : ihexp) →
d1 ≠ (d1' ⟨(τ1 ==> τ2) ⇒ (τ3 ==> τ4)⟩)) →
d1 indet →
d2 final →
(d1 ∘ d2) indet
ITAp : ∀{d τ} →
((τ1 τ2 : htyp) (d' : ihexp) → d ≠ (d' ⟨(·∀ τ1) ⇒ (·∀ τ2)⟩)) →
d indet →
(d < τ >) indet
ICastArr : ∀{d τ1 τ2 τ3 τ4} →
τ1 ==> τ2 ≠ τ3 ==> τ4 →
d indet →
d ⟨ (τ1 ==> τ2) ⇒ (τ3 ==> τ4) ⟩ indet
ICastForall : ∀{ d τ1 τ2 } →
(·∀ τ1) ≠ (·∀ τ2) →
d indet →
d ⟨ (·∀ τ1) ⇒ (·∀ τ2) ⟩ indet
ICastGroundHole : ∀{ τ d } →
τ ground →
d indet →
d ⟨ τ ⇒ ⦇-⦈ ⟩ indet
ICastHoleGround : ∀ { d τ } →
((d' : ihexp) (τ' : htyp) → d ≠ (d' ⟨ τ' ⇒ ⦇-⦈ ⟩)) →
d indet →
τ ground →
d ⟨ ⦇-⦈ ⇒ τ ⟩ indet
IFailedCast : ∀{ d τ1 τ2 } →
d final →
τ1 ground →
τ2 ground →
τ1 ≠ τ2 →
d ⟨ τ1 ⇒⦇-⦈⇏ τ2 ⟩ indet
-- final expressions
data _final : (d : ihexp) → Set where
FBoxedVal : ∀{d} → d boxedval → d final
FIndet : ∀{d} → d indet → d final