Clojure 在core.logic中设置成员身份,无CLP(Set)-定义行为

Clojure 在core.logic中设置成员身份,无CLP(Set)-定义行为,clojure,clojure-core.logic,Clojure,Clojure Core.logic,由于CLP(set)似乎被困在“即时”路线图中长达7年之久,我正在尝试制作一个不完整、低效的替代品,以至少能够反映set成员的语义。其主要思想是检查类membero函数的成员资格,并使用CLP(fd)强制整数列表中的顺序,以便“集合”列表的排列不会使可能的解的数量呈指数级增长。我得出了以下结论: (defne set-membero [elt set both] ([elt set both] (== set both) (membero elt set)) ([elt []

由于CLP(set)似乎被困在“即时”路线图中长达7年之久,我正在尝试制作一个不完整、低效的替代品,以至少能够反映set成员的语义。其主要思想是检查类membero函数的成员资格,并使用CLP(fd)强制整数列表中的顺序,以便“集合”列表的排列不会使可能的解的数量呈指数级增长。我得出了以下结论:

(defne set-membero [elt set both]
  ([elt set both]
   (== set both)
   (membero elt set))
  ([elt [] [elt]])
  ([elt [x . smallrest] [x . bigrest]]
   (fd/in elt x Integer/MIN_VALUE Integer/MAX_VALUE)
   (fd/< x elt)
   (set-membero elt smallrest bigrest))
  ([elt [x . _] [elt . set]]
   (fd/in elt x Integer/MIN_VALUE Integer/MAX_VALUE)
   (fd/< elt x)))
(run 2 [q] (set-membero 1 [2 3] q)) "=> ((1 2 3))"   ; adds non existing members as membero                                                                                                                      
(run 2 [q] (set-membero 1 [1 2] q)) "=> ((1 2))"     ; but does not add existing elements                                                                                                                        
(run 2 [q] (set-membero q [1 2] [1 2 3])) "=> (3)"   ; substracts sets as expected                                                                                                                               
(run 2 [q] (set-membero q [1] [1 2 3])) "=> ()"      ; remember it is not set-difference!                                                                                                                        
(run 2 [q] (set-membero 1 q [1 2])) "=> ((1 2))"     ; extracts elements as expected
(run 2 [q] (set-membero 2 [3 1] q)) "=> ()"          ; fails with non-compliant "sets" (unordered)
但我一直在想为什么会发生这种情况:

(run 2 [q] (set-membero 4 [3] q))
=> () ; expected ([3 4])
这个更简单的例子适用于:

(run 2 [q] (set-membero 4 [] q))
=> ([4]) ; as expected

如果你对如何覆盖CLP(set)的不存在有更广泛的评论,那就太棒了。早期的关于core.logic中集合的问答,这可能对您有帮助,也可能对您没有帮助:与为什么我的代码不起作用的直接答案相切,如果您对如何涵盖CLP(set)的不存在有更广泛的评论,那将是非常棒的。关于core.logic中sets的早期问答,可能对您有帮助,也可能没有帮助,请参见: