MiniKanren pmembero
(define pmembero
(lambda (x l)
(conde
((nullo l) #u)
((eq-caro l x) (cdro l ()) ;; force evaluation of list tail to ()
;; rather than building a thunk,
;; as we do in member
;; This means that it prefers to give us the last member of list
((eq-caro l x) #s)
(else
(fresh (d)
(cdro l d)
(pmembero x d)))))))
Refined ver.
(define pmembero
(lambda (x l)
(conde
((nullo l) #u)
((eq-caro l x) (cdro l ()) ;; case where it is an empty list
((eq-caro l x)
(fresh (a d)
(cdro l (a . d)))) ;; Separate case where it is a non-empty list
(else
(fresh (d)
(cdro l d)
(pmembero x d)))))))