我使用 clojure 有一段时间了,但刚开始使用 core.logic。
给定一个域,1 2 3 4
我想得到一个由两个向量组成的向量,比如([[1 2] [3 4]])
.
注意:这只是我真正想做的简化版本。:) 见:https ://github.com/adamhoward/lineup
我在网上找到了非会员的定义:
(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 中运行它会给我一条Evaluation aborted.
消息。
当我尝试退出时membero
,not-membero
我会回来([[1 2] [1 2]])
,这对我来说很有意义。第一个向量中的每个元素[w x]
都是第二个向量的成员[y z]
。
但是,当我打电话时,run 2
我会回来([[1 2] [1 2]] [[1 2] [1 3]])
。我不明白[[1 2] [1 3]]
上述规则如何正确。我理解不everyg
正确吗?任何指导(包括 rtfmanual、rtfbook、rtfdissertation)将不胜感激。
谢谢。
编辑:可能已经解决了这个问题。
仍然不确定来自membero
但不是not-membero
目标的奇怪结果,我发现我可以这样做:
(everyg #(distinctfd (conj [y z] %)) [w x])
[w x]
conj'd to的每个元素都[y z]
包含所有不同的值。这可能比非会员效率低,所以我仍然愿意接受任何帮助。