From d013b539303237df76081855de84906f78310e53 Mon Sep 17 00:00:00 2001
From: Nada Amin <namin@alum.mit.edu>
Date: Mon, 7 Jan 2013 14:20:15 +0100
Subject: [PATCH] LOGIC-100

---
 src/main/clojure/clojure/core/logic.clj       |    8 +++++---
 src/test/clojure/clojure/core/logic/tests.clj |   20 ++++++++++++++++++++
 2 files changed, 25 insertions(+), 3 deletions(-)

diff --git a/src/main/clojure/clojure/core/logic.clj b/src/main/clojure/clojure/core/logic.clj
index 73b1152..4261a43 100644
--- a/src/main/clojure/clojure/core/logic.clj
+++ b/src/main/clojure/clojure/core/logic.clj
@@ -3906,7 +3906,7 @@
                            vv (walk* a v)]
                        (cond
                          (= xv vv) (recur (next sp) (dissoc p x))
-                         (and (ground-term? xv a) (ground-term? vv a) (not= xv vv)) nil
+                         (nil? (unify a xv vv)) nil
                          :else (recur (next sp) (assoc (dissoc p x) xv vv))))
                      p))]
            (if p
@@ -3976,7 +3976,9 @@
       (if-not (nil? cs)
         (let [p (:prefixc cs)]
           (when-not (empty? p)
-            ((cgoal (!=c p)) a)))
+            (if  (some (fn [[u v]] (nil? (unify a u v))) p)
+              a
+              ((cgoal (!=c p)) a))))
         a))))
 
 (defne distincto
@@ -4268,4 +4270,4 @@
         (lcons? t) (seqc (lnext t))
         :else fail))
     (fn [_ v _ r a]
-      `(seqc ~(-reify a v r)))))
\ No newline at end of file
+      `(seqc ~(-reify a v r)))))
diff --git a/src/test/clojure/clojure/core/logic/tests.clj b/src/test/clojure/clojure/core/logic/tests.clj
index bb4f72b..dfb6edd 100644
--- a/src/test/clojure/clojure/core/logic/tests.clj
+++ b/src/test/clojure/clojure/core/logic/tests.clj
@@ -974,6 +974,26 @@
              (== z 'bar)))
         '(_0))))
 
+(deftest test-logic-100-disequality-1
+  (is (= (run* [q]
+           (fresh [a b]
+             (== q [a b])
+             (!= a q)
+             (== a 1)))
+        '([1 _0]))))
+
+(deftest test-logic-100-disequality-2
+  (is (= (run* [q]
+           (fresh [a b]
+             (!= a q)
+             (== q [a b])))
+        '([_0 _1])))
+  (is (= (run* [q]
+           (fresh [a b]
+             (== q [a b])
+             (!= a q)))
+        '([_0 _1]))))
+
 ;; -----------------------------------------------------------------------------
 ;; tabled
 
-- 
1.7.10.4

