Eval optimization! Tests for demos
All checks were successful
Test, Build, and Release / test (push) Successful in 1m30s
Test, Build, and Release / build (push) Successful in 1m26s

This commit is contained in:
James Eversole
2025-01-25 09:18:13 -06:00
parent 1f5a910fb2
commit 2bd388c871
6 changed files with 70 additions and 45 deletions

View File

@ -1,19 +1,19 @@
-- We represent `false` with a Leaf and `true` with a Stem Leaf
false = t
true = t t
demo_false = t
demo_true = t t
-- Tree Calculus representation of the Boolean `not` function
not_TC? = t (t (t t) (t t t)) (t t (t t t))
-- /demos/toSource.tri contains an explanation of `triage`
triage = (\a b c : t (t a b) c)
matchBool = (\ot of : triage
demo_triage = (\a b c : t (t a b) c)
demo_matchBool = (\ot of : demo_triage
of
(\_ : ot)
(\_ _ : ot)
)
-- Lambda representation of the Boolean `not` function
not_Lambda? = matchBool false true
not_Lambda? = demo_matchBool demo_false demo_true
-- Since tricu eliminates Lambda terms to SKI combinators, the tree form of many
-- functions defined via Lambda terms are larger than the most efficient TC
@ -25,11 +25,11 @@ not_Lambda? = matchBool false true
lambdaEqualsTC = equal? not_TC? not_Lambda?
-- Here are some checks to verify their extensional behavior is the same:
true_TC? = not_TC? false
false_TC? = not_TC? true
true_TC? = not_TC? demo_false
false_TC? = not_TC? demo_true
true_Lambda? = not_Lambda? false
false_Lambda? = not_Lambda? true
true_Lambda? = not_Lambda? demo_false
false_Lambda? = not_Lambda? demo_true
bothTrueEqual? = equal? true_TC? true_Lambda?
bothFalseEqual? = equal? false_TC? false_Lambda?

View File

@ -4,7 +4,7 @@
-- NOTICE: This demo relies on tricu base library functions
--
-- We model labelled binary trees as sublists where values act as labels. We
-- require explicit notation of empty nodes. Empty nodes can be represented
-- require explicit not?ation of empty nodes. Empty nodes can be represented
-- with an empty list, `[]`, which is equivalent to a single node `t`.
--
-- Example tree inputs:
@ -19,33 +19,33 @@
label = (\node : head node)
left = (\node : if (emptyList node)
left = (\node : if (emptyList? node)
[]
(if (emptyList (tail node))
(if (emptyList? (tail node))
[]
(head (tail node))))
right = (\node : if (emptyList node)
right = (\node : if (emptyList? node)
[]
(if (emptyList (tail node))
(if (emptyList? (tail node))
[]
(if (emptyList (tail (tail node)))
(if (emptyList? (tail (tail node)))
[]
(head (tail (tail node))))))
processLevel = y (\self queue : if (emptyList queue)
processLevel = y (\self queue : if (emptyList? queue)
[]
(pair (map label queue) (self (filter
(\node : not (emptyList node))
(\node : not? (emptyList? node))
(lconcat (map left queue) (map right queue))))))
levelOrderTraversal_ = (\a : processLevel (t a t))
toLineString = y (\self levels : if (emptyList levels)
toLineString = y (\self levels : if (emptyList? levels)
""
(lconcat
(lconcat (map (\x : lconcat x " ") (head levels)) "")
(if (emptyList (tail levels)) "" (lconcat (t (t 10 t) t) (self (tail levels))))))
(if (emptyList? (tail levels)) "" (lconcat (t (t 10 t) t) (self (tail levels))))))
levelOrderToString = (\s : toLineString (levelOrderTraversal_ s))

View File

@ -17,3 +17,5 @@ size = (\x :
self
(\x y : compose (self x) (self y))
x)) x 0))
size size

View File

@ -8,7 +8,7 @@
-- the Tree Calculus term, `triage` enables branching logic based on the term's
-- shape, making it possible to perform structure-specific operations such as
-- reconstructing the terms' source code representation.
triage = (\leaf stem fork : t (t leaf stem) fork)
-- triage = (\leaf stem fork : t (t leaf stem) fork)
-- Base case of a single Leaf
sourceLeaf = t (head "t")