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