-
Notifications
You must be signed in to change notification settings - Fork 41
/
types.shen
198 lines (189 loc) · 7.75 KB
/
types.shen
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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
\\ Copyright (c) 2010-2019, Mark Tarver
\\ All rights reserved.
(package shen [occurs? factorise? optimise? hush? system-S? hush userdefs tracked included datatypes]
(define declare
F A -> (let Rectify (rectify-type A)
Variant? (prolog? (variancy (receive F) (receive Rectify)))
Abstraction (eval-kl (prolog-abstraction A))
UpDate (set *sigf* (assoc-> F Abstraction (value *sigf*)))
F))
(defprolog variancy
F Rectify <-- (system-S-h F A [])
(variants? F A Rectify);)
(defprolog variants?
F symbol _ <-- !;
F A A <-- ;
F _ _ <-- (is Warning (output "warning: changing the type of ~A may create errors~%" F));)
(define prolog-abstraction
A -> (let Bindings (gensym (protect B))
Lock (gensym (protect L))
Key (gensym (protect Key))
Continuation (gensym (protect C))
V (gensym (protect V))
Vs (extract-vars A)
[lambda V [lambda Bindings [lambda Lock [lambda Key [lambda Continuation
(stpart Vs [is! V (rcons_form A) Bindings Lock Key Continuation] Bindings)]]]]]))
(define demod
X -> (let F (value *demodulation-function*)
(F X)))
(declare abort [--> A])
(declare absvector? [A --> boolean])
(declare adjoin [A --> [[list A] --> [list A]]])
(declare and [boolean --> [boolean --> boolean]])
(declare app [A --> [string --> [symbol --> string]]])
(declare append [[list A] --> [[list A] --> [list A]]])
(declare arity [A --> number])
(declare assoc [A --> [[list [list A]] --> [list A]]])
(declare atom? [A --> boolean])
(declare boolean? [A --> boolean])
(declare bootstrap [string --> string])
(declare bound? [symbol --> boolean])
(declare ccons? [[list A] --> boolean])
(declare cd [string --> string])
(declare close [[stream A] --> [list B]])
(declare cn [string --> [string --> string]])
(declare compile [[[list A] --> [str [list A] B]] --> [[list A] --> B]])
(declare cons? [A --> boolean])
(declare datatypes [--> [list symbol]])
(declare destroy [symbol --> symbol])
(declare difference [[list A] --> [[list A] --> [list A]]])
(declare do [A --> [B --> B]])
(declare <e> [[list A] --> [str [list A] [list B]]])
(declare <!> [[list A] --> [str [list B] [list A]]])
(declare <end> [[list A] --> [str [list A] [list B]]])
(declare parse-failure? [[str [list A] B] --> boolean])
(declare parse-failure [--> [str [list A] B]])
(declare <-out [[str [list A] B] --> B])
(declare in-> [[str [list A] B] --> [list A]])
(declare comb [[list A] --> [B --> [str [list A] B]]])
(declare element? [A --> [[list A] --> boolean]])
(declare empty? [A --> boolean])
(declare enable-type-theory [symbol --> boolean])
(declare external [symbol --> [list symbol]])
(declare error-to-string [exception --> string])
(declare explode [A --> [list string]])
(declare factorise [symbol --> symbol])
(declare factorise? [--> boolean])
(declare fail [--> symbol])
(declare fix [[A --> A] --> [A --> A]])
(declare freeze [A --> [lazy A]])
(declare fst [[A * B] --> A])
(declare gensym [symbol --> symbol])
(declare hds=? [[list A] --> [A --> boolean]])
(declare hush [symbol --> boolean])
(declare hush? [--> boolean])
(declare <-vector [[vector A] --> [number --> A]])
(declare vector-> [[vector A] --> [number --> [A --> [vector A]]]])
(declare vector [number --> [vector A]])
(declare get-time [symbol --> number])
(declare hash [A --> [number --> number]])
(declare head [[list A] --> A])
(declare hdv [[vector A] --> A])
(declare hdstr [string --> string])
(declare if [boolean --> [A --> [A --> A]]])
(declare in-package [symbol --> symbol])
(declare it [--> string])
(declare implementation [--> string])
(declare include [[list symbol] --> [list symbol]])
(declare include-all-but [[list symbol] --> [list symbol]])
(declare included [--> [list symbol]])
(declare inferences [--> number])
(declare insert [A --> [string --> string]])
(declare integer? [A --> boolean])
(declare internal [symbol --> [list symbol]])
(declare intersection [[list A] --> [[list A] --> [list A]]])
(declare language [--> string])
(declare length [[list A] --> number])
(declare limit [[vector A] --> number])
(declare lineread [[stream in] --> [list unit]])
(declare load [string --> symbol])
(declare map [[A --> B] --> [[list A] --> [list B]]])
(declare mapcan [[A --> [list B]] --> [[list A] --> [list B]]])
(declare maxinferences [number --> number])
(declare n->string [number --> string])
(declare nl [number --> number])
(declare not [boolean --> boolean])
(declare nth [number --> [[list A] --> A]])
(declare number? [A --> boolean])
(declare occurrences [A --> [B --> number]])
(declare occurs-check [symbol --> boolean])
(declare occurs? [--> boolean])
(declare optimise [symbol --> boolean])
(declare optimise? [--> boolean])
(declare or [boolean --> [boolean --> boolean]])
(declare os [--> string])
(declare package? [symbol --> boolean])
(declare port [--> string])
(declare porters [--> string])
(declare pos [string --> [number --> string]])
(declare pr [string --> [[stream out] --> string]])
(declare print [A --> A])
(declare profile [symbol --> symbol])
(declare preclude [[list symbol] --> [list symbol]])
(declare proc-nl [string --> string])
(declare profile-results [symbol --> [symbol * number]])
(declare protect [A --> A])
(declare preclude-all-but [[list symbol] --> [list symbol]])
(declare prhush [string --> [[stream out] --> string]])
(declare prolog-memory [number --> number])
(declare ps [symbol --> [list unit]])
(declare read [[stream in] --> unit])
(declare read-byte [[stream in] --> number])
(declare read-file-as-bytelist [string --> [list number]])
(declare read-file-as-string [string --> string])
(declare read-file [string --> [list unit]])
(declare read-from-string [string --> [list unit]])
(declare read-from-string-unprocessed [string --> [list unit]])
(declare release [--> string])
(declare remove [A --> [[list A] --> [list A]]])
(declare reverse [[list A] --> [list A]])
(declare simple-error [string --> A])
(declare snd [[A * B] --> B])
(declare specialise [symbol --> [number --> symbol]])
(declare spy [symbol --> boolean])
(declare spy? [--> boolean])
(declare step [symbol --> boolean])
(declare step? [--> boolean])
(declare stinput [--> [stream in]])
(declare sterror [--> [stream out]])
(declare stoutput [--> [stream out]])
(declare string? [A --> boolean])
(declare str [A --> string])
(declare string->n [string --> number])
(declare string->symbol [string --> symbol])
(declare sum [[list number] --> number])
(declare symbol? [A --> boolean])
(declare systemf [symbol --> symbol])
(declare system-S? [--> boolean])
(declare tail [[list A] --> [list A]])
(declare tlstr [string --> string])
(declare tlv [[vector A] --> [vector A]])
(declare tc [symbol --> boolean])
(declare tc? [--> boolean])
(declare thaw [[lazy A] --> A])
(declare track [symbol --> symbol])
(declare tracked [--> [list symbol]])
(declare trap-error [A --> [[exception --> A] --> A]])
(declare tuple? [A --> boolean])
(declare undefmacro [symbol --> symbol])
(declare union [[list A] --> [[list A] --> [list A]]])
(declare unprofile [symbol --> symbol])
(declare untrack [symbol --> symbol])
(declare userdefs [--> [list symbol]])
(declare variable? [A --> boolean])
(declare vector? [A --> boolean])
(declare version [--> string])
(declare write-to-file [string --> [A --> A]])
(declare write-byte [number --> [[stream out] --> number]])
(declare y-or-n? [string --> boolean])
(declare > [number --> [number --> boolean]])
(declare < [number --> [number --> boolean]])
(declare >= [number --> [number --> boolean]])
(declare <= [number --> [number --> boolean]])
(declare = [A --> [A --> boolean]])
(declare + [number --> [number --> number]])
(declare / [number --> [number --> number]])
(declare - [number --> [number --> number]])
(declare * [number --> [number --> number]])
(declare == [A --> [B --> boolean]])
)