;; lib/minikanren/tests/latin.sx — 2x2 Latin square via ino + all-distincto. ;; ;; A 2x2 Latin square has 2 distinct fillings: ;; ((1 2) (2 1)) and ((2 1) (1 2)). ;; The 3x3 version has 12 fillings but takes minutes under naive search; ;; full CLP(FD) (Phase 6 proper) would handle it in milliseconds. (define latin-2x2 (fn (cells) (let ((c11 (nth cells 0)) (c12 (nth cells 1)) (c21 (nth cells 2)) (c22 (nth cells 3)) (dom (list 1 2))) (mk-conj (ino c11 dom) (ino c12 dom) (ino c21 dom) (ino c22 dom) (all-distincto (list c11 c12)) (all-distincto (list c21 c22)) (all-distincto (list c11 c21)) (all-distincto (list c12 c22)))))) ;; col 2 (mk-test "latin-2x2-count" (let ((squares (run* q (fresh (a b c d) (== q (list a b c d)) (latin-2x2 (list a b c d)))))) (len squares)) 2) (mk-test "latin-2x2-as-set" (let ((squares (run* q (fresh (a b c d) (== q (list a b c d)) (latin-2x2 (list a b c d)))))) (and (= (len squares) 2) (and (some (fn (s) (= s (list 1 2 2 1))) squares) (some (fn (s) (= s (list 2 1 1 2))) squares)))) true) (mk-test "latin-2x2-with-clue" (run* q (fresh (a b c d) (== a 1) (== q (list a b c d)) (latin-2x2 (list a b c d)))) (list (list 1 2 2 1))) (mk-tests-run!)