diff --git a/lib/minikanren/intarith.sx b/lib/minikanren/intarith.sx index 51b2ee1e..6aaf57bb 100644 --- a/lib/minikanren/intarith.sx +++ b/lib/minikanren/intarith.sx @@ -135,3 +135,17 @@ (conde ((nullo l) (== n 0)) ((fresh (a d n-rest) (conso a d l) (conde ((== a x) (counto x d n-rest) (pluso-i 1 n-rest n)) ((nafc (== a x)) (counto x d n)))))))) + +(define + mk-arith-prog + (fn + (start step len) + (cond + ((= len 0) (list)) + (:else (cons start (mk-arith-prog (+ start step) step (- len 1))))))) + +(define + arith-progo + (fn + (start step len result) + (project (start step len) (== result (mk-arith-prog start step len))))) diff --git a/lib/minikanren/tests/arith-prog.sx b/lib/minikanren/tests/arith-prog.sx new file mode 100644 index 00000000..2b1b7843 --- /dev/null +++ b/lib/minikanren/tests/arith-prog.sx @@ -0,0 +1,33 @@ +;; lib/minikanren/tests/arith-prog.sx — arithmetic progression generation. + +(mk-test + "arith-progo-zero-len" + (run* q (arith-progo 5 1 0 q)) + (list (list))) + +(mk-test + "arith-progo-1-to-5" + (run* q (arith-progo 1 1 5 q)) + (list (list 1 2 3 4 5))) + +(mk-test + "arith-progo-evens-from-0" + (run* q (arith-progo 0 2 5 q)) + (list (list 0 2 4 6 8))) + +(mk-test + "arith-progo-descending" + (run* q (arith-progo 10 -1 4 q)) + (list (list 10 9 8 7))) + +(mk-test + "arith-progo-zero-step" + (run* q (arith-progo 7 0 3 q)) + (list (list 7 7 7))) + +(mk-test + "arith-progo-negative-start" + (run* q (arith-progo -3 2 4 q)) + (list (list -3 -1 1 3))) + +(mk-tests-run!)