tricu/lib/base.tri

151 lines
2.9 KiB
Plaintext
Raw Permalink Normal View History

false = t
_ = t
true = t t
k = t t
i = t (t k) t
s = t (t (k t)) t
m = s i i
b = s (k s) k
c = s (s (k s) (s (k k) s)) (k k)
id = \a : a
pair = t
if = \cond then else : t (t else (t t then)) t cond
y = ((\mut wait fun : wait mut (\x : fun (wait mut x)))
(\x : x x)
(\a0 a1 a2 : t (t a0) (t t a2) a1))
compose = \f g x : f (g x)
triage = \leaf stem fork : t (t leaf stem) fork
test = triage "Leaf" (\_ : "Stem") (\_ _ : "Fork")
2025-01-20 19:20:29 -06:00
matchBool = (\ot of : triage
of
(\_ : ot)
2025-01-20 19:20:29 -06:00
(\_ _ : ot)
)
matchList = \a b : triage a _ b
2025-01-20 19:20:29 -06:00
matchPair = \a : triage _ _ a
2025-01-20 19:20:29 -06:00
not? = matchBool false true
and? = matchBool id (\_ : false)
emptyList? = matchList true (\_ _ : false)
2025-01-20 19:20:29 -06:00
head = matchList t (\head _ : head)
tail = matchList t (\_ tail : tail)
2025-01-20 19:20:29 -06:00
or? = (\x y :
matchBool
(matchBool (t t) (t t) y)
(matchBool (t t) 0 y)
x)
xor? = matchBool id not?
append = y (\self : matchList
(\k : k)
2025-01-20 19:20:29 -06:00
(\h r k : pair h (self r k)))
lAnd = (triage
(\_ : false)
(\_ x : x)
(\_ _ x : x))
2025-01-20 19:20:29 -06:00
lOr = (triage
(\x : x)
(\_ _ : true)
(\_ _ _ : true))
2025-01-20 19:20:29 -06:00
map_ = y (\self :
matchList
(\_ : t)
(\head tail f : pair (f head) (self tail f)))
map = \f l : map_ l f
2025-01-20 19:20:29 -06:00
equal? = y (\self : triage
(triage
true
(\_ : false)
(\_ _ : false))
(\ax :
triage
false
(self ax)
(\_ _ : false))
(\ax ay :
triage
false
(\_ : false)
(\bx by : lAnd (self ax bx) (self ay by))))
2025-01-20 19:20:29 -06:00
lExist? = y (\self x : matchList
false
(\h z : or? (equal? x h) (self x z)))
filter_ = y (\self : matchList
(\_ : t)
(\head tail f : matchBool (t head) i (f head) (self tail f)))
filter = \f l : filter_ l f
2025-01-20 19:20:29 -06:00
foldl_ = y (\self f l x : matchList (\acc : acc) (\head tail acc : self f tail (f acc head)) l x)
foldl = \f x l : foldl_ f l x
2025-01-20 19:20:29 -06:00
foldr_ = y (\self x f l : matchList x (\head tail : f (self x f tail) head) l)
foldr = \f x l : foldr_ x f l
succ = y (\self :
triage
1
t
(triage
(t (t t))
(\_ tail : t t (self tail))
t))
length = y (\self : matchList
0
(\_ tail : succ (self tail)))
reverse = y (\self : matchList
t
(\head tail : append (self tail) (pair head t)))
snoc = y (\self x : matchList
(pair x t)
(\h z : pair h (self x z)))
count = y (\self x : matchList
0
(\h z : matchBool
(succ (self x z))
(self x z)
(equal? x h)))
last = y (\self : matchList
t
(\hd tl : matchBool
hd
(self tl)
(emptyList? tl)))
all? = y (\self pred : matchList
true
(\h z : and? (pred h) (self pred z)))
any? = y (\self pred : matchList
false
(\h z : or? (pred h) (self pred z)))
unique_ = y (\self seen : matchList
t
(\head rest : matchBool
(self seen rest)
(pair head (self (pair head seen) rest))
(lExist? head seen)))
unique = \xs : unique_ t xs
intersect = \xs ys : filter (\x : lExist? x ys) xs
union = \xs ys : unique (append xs ys)