;; lib/minikanren/tests/iterate-no.sx — iterated relation application.

(define
  mk-nat
  (fn (n) (if (= n 0) :z (list :s (mk-nat (- n 1))))))

(mk-test
  "iterate-no-zero"
  (run*
    q
    (iterate-no
      (fn (a b) (== b (list :wrap a)))
      (mk-nat 0)
      :seed q))
  (list :seed))

(mk-test
  "iterate-no-three-wraps"
  (run*
    q
    (iterate-no (fn (a b) (== b (list :wrap a))) (mk-nat 3) :x q))
  (list (list :wrap (list :wrap (list :wrap :x)))))

(mk-test
  "iterate-no-succ-three-times"
  (run*
    q
    (iterate-no (fn (a b) (== b (list :s a))) (mk-nat 3) :z q))
  (list (mk-nat 3)))

(mk-test
  "iterate-no-with-list-cons"
  (run*
    q
    (iterate-no (fn (a b) (conso :a a b)) (mk-nat 4) (list) q))
  (list (list :a :a :a :a)))

(mk-tests-run!)
