mk: subo — contiguous sublist relation
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 32s
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:
@@ -73,6 +73,15 @@
|
|||||||
(define suffixo (fn (s l) (fresh (front) (appendo front s l))))
|
(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
|
(define
|
||||||
lengtho
|
lengtho
|
||||||
(fn
|
(fn
|
||||||
|
|||||||
60
lib/minikanren/tests/subo.sx
Normal file
60
lib/minikanren/tests/subo.sx
Normal 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!)
|
||||||
@@ -173,6 +173,7 @@ _(none yet)_
|
|||||||
|
|
||||||
_Newest first._
|
_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** — **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** — **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".
|
- **2026-05-08** — **not-membero**: relational "x is not a member of l".
|
||||||
|
|||||||
Reference in New Issue
Block a user