;; 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))))))