magic square with mini-kanren (broken) added by saeftl on Mon Nov 13 13:02:45 2017

(use mini-kanren)
(use srfi-1)

(define (notino x l)
    (conde ((nullo l))
        ((fresh (h t) (conso h t l)
            (=/= h x)
            (notino x t)))))

(define (=/= a b)
    (conde ((pairo a) (== b '()))
           ((pairo b) (== a '()))
           ((caro a 0) (caro b 1))
           ((caro a 1) (caro b 0))
           ((fresh (at bt)
                (cdro a at)
                (cdro b bt)
                (=/= at bt)))))

(set! sum9 (let ((n 3))
    (build-num (/ (* n (+ (* n n) 1)) 2))))
(set! sq9 (map build-num (iota 9 1)))


(define blah
 (run 1
     (q)
     (fresh (x11 x12 x13 
             x21 x22 x23
             x31 x32 x33)
            (== q (list x11 x12 x13 x21 x22 x23 x31 x32 x33))
            (membero x11 sq9)
            (=/= x12 x11)
            (membero x12 sq9)
            (membero x13 sq9)
            (notino x13 (list x11 x12))
            (membero x21 sq9)
            (notino x21 (list x11 x12 x13))
            (membero x22 sq9)
            (notino x22 (list x11 x12 x13 x21))
            (membero x23 sq9)
            (notino x23 (list x11 x12 x13 x21 x22))
            (membero x31 sq9)
            (notino x31 (list x11 x12 x13 x21 x22 x23 ))
            (membero x32 sq9)
            (notino x32 (list x11 x12 x13 x21 x22 x23 x31))
            (membero x33 sq9)
            (notino x33 (list x11 x12 x13 x21 x22 x23 x31 x32))
;           (distincto (list x11 x12 x13 x21 x22 x23 x31 x32 x33))
            (addero x11 x12 x13 sum9)
            (addero x21 x22 x23 sum9)
            (addero x31 x32 x33 sum9)
            (addero x11 x21 x31 sum9)
            (addero x12 x22 x32 sum9)
            (addero x13 x23 x33 sum9))))