MiniKanren memo

mem

(define mem
  lambda (x l)
    (cond
    ((null? l) #f)
    ((eq-car? l x) l)
    (else (mem x (cdr l)))))

memo

(define memo
  (lambda (x l out)
    (conde
      ((nullo l) #u)
      ((eq-caro l x) (== l out))
      (else
        fresh (d)
        (cdro l d)
        (memo x d out)))))