The (aux kanren micro) module

test/find: pass

(define (test/find _)
  (let* ((v1 (make-µkanren-var 0))
         (v2 (make-µkanren-var 1))
         (s0 µkanren-state-empty)
         (s1 (make-µkanren-state
               (cons/sbral 'a (µkanren-state-substitution s0))
               1))
         (s2 (make-µkanren-state
               (cons/sbral v1 (µkanren-state-substitution s1))
               2)))
    (⊦= 5 (µkanren-state-find 5 s2))
    (⊦= 'a (µkanren-state-find v1 s2))
    (⊦= 'a (µkanren-state-find v2 s2))))
((eta 0.002) (memory #(12582912 2268016 1048576)) (stdout "") (stderr ""))

test/=°: pass

(define (test/=° _) (⊦= '(#t) (°->list/ground (=° 'z 'z))))
((eta 0.002) (memory #(12582912 2264608 1048576)) (stdout "") (stderr ""))

test/sharing: pass

(define (test/sharing _)
  (⊦= '(((_0 z) z (_0 _1)))
        (°->list/ground
          (fresh°
            r
            (n q x)
            (=° q 'z)
            (fresh° (w r) (=° n (list w q)) (=° x (list w r)))))))
((eta 0.003) (memory #(12582912 2268024 1048576)) (stdout "") (stderr ""))

test/peano°: pass

(define (test/peano° _)
  (define-relation
    (peano° n)
    (or° (=° n 'z) (fresh° (r) (=° n `(s ,r)) (peano° r))))
  (define-relation
    (church° n)
    (fresh° (b) (=° n `(λ (s) (λ (z) ,b))) (peano° b)))
  (⊦= '(z (s z)
            (s (s z))
            (s (s (s z)))
            (s (s (s (s z))))
            (s (s (s (s (s z)))))
            (s (s (s (s (s (s z))))))
            (s (s (s (s (s (s (s z)))))))
            (s (s (s (s (s (s (s (s z))))))))
            (s (s (s (s (s (s (s (s (s z))))))))))
        (°->list/ground (take° 10 (fresh° (n) (peano° n)))))
  (⊦= '((λ (s) (λ (z) z))
          (λ (s) (λ (z) (s z)))
          (λ (s) (λ (z) (s (s z))))
          (λ (s) (λ (z) (s (s (s z)))))
          (λ (s) (λ (z) (s (s (s (s z))))))
          (λ (s) (λ (z) (s (s (s (s (s z)))))))
          (λ (s) (λ (z) (s (s (s (s (s (s z))))))))
          (λ (s) (λ (z) (s (s (s (s (s (s (s z)))))))))
          (λ (s) (λ (z) (s (s (s (s (s (s (s (s z))))))))))
          (λ (s) (λ (z) (s (s (s (s (s (s (s (s (s z))))))))))))
        (°->list/ground (take° 10 (fresh° (n) (church° n))))))
((eta 0.008) (memory #(12582912 2278664 1048576)) (stdout "") (stderr ""))

test/append°: pass

(define (test/append° _)
  (define-relation
    (append° r s rs)
    (cond°
      ((null° r) (=° s rs))
      ((fresh° (a d c) (cons° a d r) (append° d s c) (cons° a c rs)))))
  (⊦ equal?
       (list '_0
             (cons '_0 '_1)
             '(_0 _1)
             '(_0 _1 _2)
             '(_0 _1 _2 _3)
             '(_0 _1 _2 _3 _4)
             '(_0 _1 _2 _3 _4 _5)
             '(_0 _1 _2 _3 _4 _5 _6)
             '(_0 _1 _2 _3 _4 _5 _6 _7)
             '(_0 _1 _2 _3 _4 _5 _6 _7 _8))
       (µkanren-run (l 10 #t) (fresh° (a d) (append° a d l)))))
((eta 0.002) (memory #(12582912 2272176 1048576)) (stdout "") (stderr ""))

test/project°: pass

(define (test/project° _)
  (⊦= '(4700 6500 5000 5700 5700 4400 4000 5500 5300 5300)
        (°->list/ground
          (fresh°
            (r)
            (fresh°
              (d e s)
              (empsalary° d e s)
              (project° ((s* s)) (=° r (+ s* 500))))))))
((eta 0.0) (memory #(12582912 2267352 1048576)) (stdout "") (stderr ""))

test/groupby°/empty: pass

The following table has been kept from the PostgreSQL documentation example on window functions [1]:

  depname  | empno | salary |          avg
-----------+-------+--------+-----------------------
 develop   |    11 |   5200 | 5020.0000000000000000
 develop   |     7 |   4200 | 5020.0000000000000000
 develop   |     9 |   4500 | 5020.0000000000000000
 develop   |     8 |   6000 | 5020.0000000000000000
 develop   |    10 |   5200 | 5020.0000000000000000
 personnel |     5 |   3500 | 3700.0000000000000000
 personnel |     2 |   3900 | 3700.0000000000000000
 sales     |     3 |   4800 | 4866.6666666666666667
 sales     |     1 |   5000 | 4866.6666666666666667
 sales     |     4 |   4800 | 4866.6666666666666667
(10 rows)
with respect to the following query:
SELECT depname, empno, salary, avg(salary) OVER (PARTITION BY depname) FROM empsalary;

(define (test/groupby°/empty _)
  (⊦= '(47100)
        (°->list/ground
          (fresh°
            (r)
            (fresh°
              (d e s)
              (groupby°
                (((s* foldr/add) s))
                over
                ()
                from
                (empsalary° d e s)
                =>
                (=° r s*)))))))
((eta 0.001) (memory #(12582912 2284352 1048576)) (stdout "") (stderr ""))

test/groupby°/one-column: pass

(define (test/groupby°/one-column _)
  (⊦= '((personnel 7400) (sales 14600) (develop 25100))
        (sort (°->list/ground
                (fresh°
                  (r)
                  (fresh°
                    (d e s)
                    (groupby°
                      (((s* foldr/add) s))
                      over
                      (d)
                      from
                      (empsalary° d e s)
                      =>
                      (=° r `(,d ,s*))))))
              (λ (a b) (< (cadr a) (cadr b))))))
((eta 0.001) (memory #(12582912 2270488 1048576)) (stdout "") (stderr ""))

test/set°: pass

(define (test/set° _)
  (⊦= '((personnel 2) (sales 3) (develop 5))
        (sort (°->list/ground
                (fresh°
                  (r)
                  (fresh°
                    (d e s)
                    (set° (c (λ (k v) (add1 v)) 0)
                           over
                           ((d* d))
                           from
                           (empsalary° d e s)
                           =>
                           (=° r `(,d* ,c))))))
              (λ (a b) (< (cadr a) (cadr b))))))
((eta 0.001) (memory #(12582912 2270320 1048576)) (stdout "") (stderr ""))

test/enumerate°: pass

(define (test/enumerate° _)
  (⊦= '(((0 (sales))
           (1 (sales))
           (2 (sales))
           (3 (personnel))
           (4 (personnel))
           (5 (develop))
           (6 (develop))
           (7 (develop))
           (8 (develop))
           (9 (develop))))
        (°->list/ground
          (fresh°
            (r)
            (fresh°
              (d e s)
              (enumerate°
                (c (λ (i k) (list i (list k))))
                over
                (d)
                from
                (empsalary° d e s)
                =>
                (=° r c)))))))
((eta 0.001) (memory #(12582912 2283472 1048576)) (stdout "") (stderr ""))

test/window°: pass

(define (test/window° _)
  (⊦= '((develop 7 4200 5020)
          (develop 8 6000 5020)
          (develop 9 4500 5020)
          (develop 10 5200 5020)
          (develop 11 5200 5020)
          (personnel 2 3900 3700)
          (personnel 5 3500 3700)
          (sales 1 5000 14600/3)
          (sales 3 4800 14600/3)
          (sales 4 4800 14600/3))
        (°->list/ground
          (fresh°
            (r)
            (fresh°
              (d e s)
              (window°
                (((s* foldr/avg) s))
                over
                (d)
                from
                (empsalary° d e s)
                =>
                (=° r `(,d ,e ,s ,s*)))))))
  (⊦= '((develop 7 4200 4710)
          (develop 8 6000 4710)
          (develop 9 4500 4710)
          (develop 10 5200 4710)
          (develop 11 5200 4710)
          (personnel 2 3900 4710)
          (personnel 5 3500 4710)
          (sales 1 5000 4710)
          (sales 3 4800 4710)
          (sales 4 4800 4710))
        (°->list/ground
          (fresh°
            (r)
            (fresh°
              (d e s)
              (window°
                (((s* foldr/avg) s))
                over
                ()
                from
                (empsalary° d e s)
                =>
                (=° r `(,d ,e ,s ,s*))))))))
((eta 0.002) (memory #(12582912 2272832 1048576)) (stdout "") (stderr ""))

test/=°/structure: pass

(define (test/=°/structure _)
  (define-record person name age)
  (define p (make-person 'alice 30))
  (⊦= #t (record-instance? p))
  (⊦= `((record ,p))
        (°->list/ground (fresh° (r) (=° r (list 'record p)))))
  (⊦= `((record ,(make-person '_0 30)))
        (°->list/ground
          (fresh° (r a) (=° r (list 'record (make-person a 30)))))))
((eta 0.001) (memory #(12582912 2272432 1048576)) (stdout "") (stderr ""))

test/=°/structure/vector: pass

(define (test/=°/structure/vector _)
  (define-record person name age)
  (define p (make-person 'alice 30))
  (⊦= #t (record-instance? p))
  (⊦= #(person alice 30) (record->vector p))
  (⊦= '((person alice 30))
        (°->list/ground (fresh° r (t n a) (=° `#(,t ,n ,a) p)))))
((eta 0.001) (memory #(12582912 2274104 1048576)) (stdout "") (stderr ""))

See also