From 08f4a7babdfec9ada4a8254b672d0408e29241eb Mon Sep 17 00:00:00 2001 From: giles Date: Fri, 8 May 2026 12:20:03 +0000 Subject: [PATCH] =?UTF-8?q?mk:=20enumerate-i=20/=20enumerate-from-i=20?= =?UTF-8?q?=E2=80=94=20501/501=20milestone?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (enumerate-i l result): result is l with each element paired with its 0-based index. (enumerate-from-i n l result): same but starts at n. (enumerate-i (list :a :b :c) q) -> (((0 :a) (1 :b) (2 :c))) 5 new tests, 501/501 cumulative. --- lib/minikanren/intarith.sx | 10 ++++++++++ lib/minikanren/tests/enumerate.sx | 31 +++++++++++++++++++++++++++++++ plans/minikanren-on-sx.md | 1 + 3 files changed, 42 insertions(+) create mode 100644 lib/minikanren/tests/enumerate.sx diff --git a/lib/minikanren/intarith.sx b/lib/minikanren/intarith.sx index e9548b4b..85b2cb69 100644 --- a/lib/minikanren/intarith.sx +++ b/lib/minikanren/intarith.sx @@ -117,3 +117,13 @@ (conde ((nullo l) (== n 0)) ((fresh (a d n-1) (conso a d l) (lengtho-i d n-1) (pluso-i 1 n-1 n)))))) + +(define + enumerate-from-i + (fn + (start l result) + (conde + ((nullo l) (nullo result)) + ((fresh (a d r-rest start-prime) (conso a d l) (conso (list start a) r-rest result) (pluso-i 1 start start-prime) (enumerate-from-i start-prime d r-rest)))))) + +(define enumerate-i (fn (l result) (enumerate-from-i 0 l result))) diff --git a/lib/minikanren/tests/enumerate.sx b/lib/minikanren/tests/enumerate.sx new file mode 100644 index 00000000..bc1dd74a --- /dev/null +++ b/lib/minikanren/tests/enumerate.sx @@ -0,0 +1,31 @@ +;; lib/minikanren/tests/enumerate.sx — index-each-element relation. + +(mk-test + "enumerate-i-empty" + (run* q (enumerate-i (list) q)) + (list (list))) + +(mk-test + "enumerate-i-three" + (run* q (enumerate-i (list :a :b :c) q)) + (list + (list (list 0 :a) (list 1 :b) (list 2 :c)))) + +(mk-test + "enumerate-i-strings" + (run* q (enumerate-i (list "x" "y" "z") q)) + (list + (list (list 0 "x") (list 1 "y") (list 2 "z")))) + +(mk-test + "enumerate-from-i-100" + (run* q (enumerate-from-i 100 (list :x :y :z) q)) + (list + (list (list 100 :x) (list 101 :y) (list 102 :z)))) + +(mk-test + "enumerate-from-i-singleton" + (run* q (enumerate-from-i 0 (list :only) q)) + (list (list (list 0 :only)))) + +(mk-tests-run!) diff --git a/plans/minikanren-on-sx.md b/plans/minikanren-on-sx.md index b4a77a5c..1c382418 100644 --- a/plans/minikanren-on-sx.md +++ b/plans/minikanren-on-sx.md @@ -173,6 +173,7 @@ _(none yet)_ _Newest first._ +- **2026-05-08** — **enumerate-i / enumerate-from-i — 500-test milestone**: index-each-element relations. (enumerate-i l result) -> result is l with each element paired with its 0-based index. (enumerate-from-i n l result) starts at n. 5 new tests, **501/501** cumulative. - **2026-05-08** — **partitiono**: relational partition. (partitiono pred l yes no) splits l so yes contains elements where pred succeeds and no contains the rest. Composes with intarith for numeric predicates. 5 new tests, 496/496 cumulative. - **2026-05-08** — **appendo3**: 3-list append via two appendos. (appendo3 a b c r) is (appendo a b mid) ∧ (appendo mid c r). Recovers any of the three lists given the other two and the result. 5 new tests, 491/491 cumulative. - **2026-05-08** — **lengtho-i**: integer-indexed length (intarith). Empty list -> 0; recurse with pluso-i. Drop-in fast replacement for Peano lengtho when the count fits in a host integer. 5 new tests, 486/486 cumulative.