;; lib/minikanren/fd.sx — Phase 6 piece A: minimal finite-domain helpers.
;;
;; A full CLP(FD) engine (arc consistency, native integer domains, fd-plus
;; etc.) is Phase 6 proper. For now we expose two small relations layered
;; on the existing list machinery — they're sufficient for permutation
;; puzzles, the N-queens-style core of constraint solving:
;;
;;   (ino x dom)         — x is a member of dom (alias for membero with the
;;                         constraint-store-friendly argument order).
;;   (all-distincto l)   — all elements of l are pairwise distinct.
;;
;; all-distincto uses nafc + membero on the tail — it requires the head
;; element of each recursive step to be ground enough for membero to be
;; finitary, so order matters: prefer (in x dom) goals BEFORE
;; (all-distincto (list x ...)) so values get committed first.

(define ino (fn (x dom) (membero x dom)))

(define
  all-distincto
  (fn
    (l)
    (conde
      ((nullo l))
      ((fresh (a d) (conso a d l) (nafc (membero a d)) (all-distincto d))))))
