Clojure 将两个向量约束在同一个域中但不是成员';彼此的爱

Clojure 将两个向量约束在同一个域中但不是成员';彼此的爱,clojure,clojure-core.logic,Clojure,Clojure Core.logic,我使用clojure已经有一段时间了,但只是从core.logic开始 给定一个域,如1234,我想得到一个由两个向量组成的向量,如([[12][34]]) 注意:这只是我真正想做的事情的简化版本。:)见: 我在网上找到了not membero的定义: (defne not-membero [x l] ([_ []]) ([_ [?y . ?r]] (!= x ?y) (not-membero x ?r))) 我试着这样使用它: (run 1 [q] (fre

我使用clojure已经有一段时间了,但只是从core.logic开始

给定一个域,如
1234
,我想得到一个由两个向量组成的向量,如
([[12][34]])

注意:这只是我真正想做的事情的简化版本。:)见:

我在网上找到了not membero的定义:

(defne not-membero [x l]
  ([_ []])
  ([_ [?y . ?r]]
    (!= x ?y)
    (not-membero x ?r)))
我试着这样使用它:

(run 1 [q]
     (fresh [w x
             y z]
            (== q [[w x]
                   [y z]])
            (infd w x y z (domain 1 2 3 4))
            (everyg distinctfd [[w x] [y z]])
            (everyg #(not-membero % [y z]) [w x])))
在Emacs中运行此命令会给我一个
评估中止。
消息

当我尝试退出
membero
而选择
notmembero
时,我得到了
([[12][12]])
,这对我来说很有意义。第一个向量
[wx]
中的每个元素都是第二个向量
[yz]
的成员

但是,当我调用
运行2时
我会返回
([[12][12]][[12][13]])
。我不明白
[[1 2][1 3]]
对于上述规则是如何正确的。我不是正确地理解了
每件事吗?任何指导(包括RTF手册、rtfbook、rtfdissertation)都将不胜感激

谢谢

编辑:可能已解决此问题

仍然不确定
membero
的奇怪结果,但我发现我可以做到这一点,而不是
notmembero
目标:

(everyg #(distinctfd (conj [y z] %)) [w x])

[y z]
相连的
[w x]
的每个元素都包含所有不同的值。这可能比不使用membero效率低,因此我仍然愿意接受任何帮助。

您的示例似乎也在这样做:

(run* [q]
  (fresh [w x y z]
    (fd/in w x y z (fd/domain 1 2 3 4))
    (== q [[w x] [y z]])
    (fd/distinct [w x y z])))
但是看到足球问题

(ns test
  (:refer-clojure :exclude [==])
  (:use clojure.core.logic)
  (require [clojure.core.logic.fd :as fd]))

(defn game [g] (fresh [a b c d e] (== g [a b c d e])))

(def players (range 1 11))

(defne not-membero [x l]
  ([_ []])
  ([_ [?y . ?r]]
    (!= x ?y)
    (not-membero x ?r)))

(defne plays [player games]
  ([_ []])
  ([_ [?f ?s . ?r]]
   (membero player ?f) ; if you play this game
   (not-membero player ?s) ; do not play next game
   (plays player ?r))
  ([_ [?f ?s . ?r]]
   (membero player ?s)
   (not-membero player ?f)
   (plays player ?r)))

(defne goalies [games]
  ([[[_ _ _ _ ?a]
     [_ _ _ _ ?b]
     [_ _ _ _ ?c]
     [_ _ _ _ ?d]]]
    (fd/in ?a ?b ?c ?d (apply fd/domain players))
    (not-membero 1 [?a ?b ?c ?d]) ; star player != goalie
    (fd/distinct [?a ?b ?c ?d]))) ; not goalie twice

(defn -main [& args]
  (run 1 [q]
    (fresh [a b c d]
      (game a)
      (game b)
      (game c)
      (game d)
      (== q [a b c d])
      (goalies q)
      (everyg #(plays % q) players))))

如果你认为你已经解决了这个问题,请把它作为一个答案发布(是的,回答你自己的问题是可以的)!