mk: subo — contiguous sublist relation
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 32s

Composes two appendos: l = front ++ s ++ back, equivalently
  (appendo front-and-s back l) and (appendo front s front-and-s).

Goal order matters: doing the (appendo ground:l) split first makes the
search finitary; the second appendo is then deterministic given
front-and-s and ground s. Reversing the order causes divergence on
failing inputs (the front search becomes unbounded).

7 new tests, 405/405 cumulative.
This commit is contained in:
2026-05-08 11:45:31 +00:00
parent fc14a8063b
commit e202c81a0d
3 changed files with 70 additions and 0 deletions

View File

@@ -73,6 +73,15 @@
(define suffixo (fn (s l) (fresh (front) (appendo front s l))))
(define
subo
(fn
(s l)
(fresh
(front-and-s back front)
(appendo front-and-s back l)
(appendo front s front-and-s))))
(define
lengtho
(fn

View File

@@ -0,0 +1,60 @@
;; lib/minikanren/tests/subo.sx — contiguous-sublist relation.
(mk-test
"subo-simple-found"
(run*
q
(subo
(list 2 3)
(list 1 2 3 4)))
(list (make-symbol "_.0")))
(mk-test
"subo-not-contiguous-fails"
(run*
q
(subo
(list 2 4)
(list 1 2 3 4)))
(list))
(mk-test
"subo-full-list-found"
(run*
q
(subo
(list 1 2 3)
(list 1 2 3)))
(list (make-symbol "_.0")))
(mk-test
"subo-empty-list-found"
(let
((res (run* q (subo (list) (list 1 2 3)))))
(= (len res) 4))
true)
(mk-test
"subo-prefix"
(run*
q
(subo
(list 1 2)
(list 1 2 3 4)))
(list (make-symbol "_.0")))
(mk-test
"subo-suffix"
(run*
q
(subo
(list 3 4)
(list 1 2 3 4)))
(list (make-symbol "_.0")))
(mk-test
"subo-strings"
(run* q (subo (list "b" "c") (list "a" "b" "c" "d")))
(list (make-symbol "_.0")))
(mk-tests-run!)

View File

@@ -173,6 +173,7 @@ _(none yet)_
_Newest first._
- **2026-05-08** — **subo (contiguous sublist)**: Two appendos chained — l = front ++ s ++ back. Goal order matters: appendo on the ground l first, so the search is finitary; then constrain front. 7 new tests, 405/405 cumulative.
- **2026-05-08** — **prefixo + suffixo**: classic appendo-derived sublist relations. (prefixo p l) ≡ p ⊕ ? = l; (suffixo s l) ≡ ? ⊕ s = l. Both enumerate all prefixes/suffixes when given a fresh first arg. 9 new tests, 398/398 cumulative.
- **2026-05-08** — **palindromeo**: 2-line definition (reverseo + ==). Succeeds when a list reads the same forwards and backwards. 7 new tests, 389/389 cumulative.
- **2026-05-08** — **not-membero**: relational "x is not a member of l".