diff --git a/lib/minikanren/tests/simplifyo.sx b/lib/minikanren/tests/simplifyo.sx new file mode 100644 index 00000000..02a56e0b --- /dev/null +++ b/lib/minikanren/tests/simplifyo.sx @@ -0,0 +1,47 @@ +;; lib/minikanren/tests/simplifyo.sx — algebraic expression simplifier +;; demo using conda for first-match-wins dispatch. + +(define + simplify-step-o + (fn + (expr result) + (conda + ((fresh (x) (== expr (list :+ 0 x)) (== result x))) + ((fresh (x) (== expr (list :+ x 0)) (== result x))) + ((fresh (y) (== expr (list :* 0 y)) (== result 0))) + ((fresh (x) (== expr (list :* x 0)) (== result 0))) + ((fresh (x) (== expr (list :* 1 x)) (== result x))) + ((fresh (x) (== expr (list :* x 1)) (== result x))) + ((== result expr))))) ;; default: unchanged + +(mk-test + "simplify-zero-plus" + (run* q (simplify-step-o (list :+ 0 :y) q)) + (list :y)) + +(mk-test + "simplify-plus-zero" + (run* q (simplify-step-o (list :+ :x 0) q)) + (list :x)) + +(mk-test + "simplify-zero-times" + (run* q (simplify-step-o (list :* 0 :y) q)) + (list 0)) + +(mk-test + "simplify-one-times" + (run* q (simplify-step-o (list :* 1 :y) q)) + (list :y)) + +(mk-test + "simplify-no-rule-applies" + (run* q (simplify-step-o (list :+ :x :y) q)) + (list (list :+ :x :y))) + +(mk-test + "simplify-non-identity-form" + (run* q (simplify-step-o (list :+ 5 7) q)) + (list (list :+ 5 7))) + +(mk-tests-run!)