From d1e00e2e9e7570c353826caffd73e2541b25be40 Mon Sep 17 00:00:00 2001 From: giles Date: Fri, 8 May 2026 12:29:34 +0000 Subject: [PATCH] =?UTF-8?q?mk:=20arith-progo=20=E2=80=94=20arithmetic=20pr?= =?UTF-8?q?ogression=20generation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (arith-progo start step len result): result is the list (start, start+step, ..., start+(len-1)*step). Length 0 yields the empty list. Negative steps and zero step are supported. Useful for FD-style domain construction: (arith-progo 1 1 9 dom) -> (1 2 3 4 5 6 7 8 9) 6 new tests, 538/538 cumulative. --- lib/minikanren/intarith.sx | 14 +++++++++++++ lib/minikanren/tests/arith-prog.sx | 33 ++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 lib/minikanren/tests/arith-prog.sx 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!)