From 10de1d773915aee480da5db5aca3d4c42067091a Mon Sep 17 00:00:00 2001
From: Nada Amin <namin@alum.mit.edu>
Date: Mon, 7 Jan 2013 15:04:02 +0100
Subject: [PATCH] LOGIC-101

---
 src/main/clojure/clojure/core/logic/nominal.clj    |   28 +++++++++++++-------
 .../clojure/clojure/core/logic/nominal/tests.clj   |    9 +++++++
 2 files changed, 27 insertions(+), 10 deletions(-)

diff --git a/src/main/clojure/clojure/core/logic/nominal.clj b/src/main/clojure/clojure/core/logic/nominal.clj
index 038201b..743abe1 100644
--- a/src/main/clojure/clojure/core/logic/nominal.clj
+++ b/src/main/clojure/clojure/core/logic/nominal.clj
@@ -143,15 +143,15 @@
   (fn [x]
     (not (= x a))))
 
+(defn- -reify-hash [s a x]
+  (let [x (walk* s x)
+        a (walk* s a)]
+    ;; Filter constraints unrelated to reified variables.
+    (when (and (symbol? a) (empty? (->> (list x) flatten (filter lvar?))))
+      (symbol (str a "#" x)))))
+
 (defn hash [a t]
-  (let [fc #(predc % (make-nom-hash a))
-        reifier
-        (fn [_ x r s ap]
-          (let [x (walk* s x)
-                a (walk* s a)]
-            ;; Filter constraints unrelated to reified variables.
-            (when (and (symbol? a) (empty? (->> (list x) flatten (filter lvar?))))
-              (symbol (str a "#" x)))))]
+  (if (nom? a)
     (fixc t
       (fn loop [t s reifier]
         (or
@@ -159,8 +159,16 @@
           (if (tree-term? t)
             (constrain-tree t
               (fn [t s] ((fixc t loop reifier) s)))
-            (fc t))))
-      reifier)))
+            (predc t (make-nom-hash a)))))
+      (fn [_ x r s ap]
+        (-reify-hash s a x)))
+    (fixc a
+      (fn loop [a s reifier]
+        (if (nom? a)
+          (hash a t)
+          (throw (Exception. (str "nom/hash expects a nom first, not: " a)))))
+      (fn [_ _ r s ap]
+        (-reify-hash s a t)))))
 
 ;; =============================================================================
 ;; Suspensions as constraints
diff --git a/src/test/clojure/clojure/core/logic/nominal/tests.clj b/src/test/clojure/clojure/core/logic/nominal/tests.clj
index 067f42c..e3f7096 100644
--- a/src/test/clojure/clojure/core/logic/nominal/tests.clj
+++ b/src/test/clojure/clojure/core/logic/nominal/tests.clj
@@ -403,3 +403,12 @@
                (== x 'foo)
                (== [x y] q))))
         ())))
+
+(deftest test-101-variable-nom-in-hash
+  (is (= (run* [q]
+           (nom/fresh [x]
+             (fresh [y]
+               (predc y nom? `nom?)
+               (nom/hash y x)
+               (== x y))))
+        ())))
-- 
1.7.10.4

