使用 clojure 的 core.logic / minikanren 查找相似的集合
Posted
技术标签:
【中文标题】使用 clojure 的 core.logic / minikanren 查找相似的集合【英文标题】:Finding similar sets with clojure's core.logic / minikanren 【发布时间】:2015-08-14 00:22:03 【问题描述】:这是我关于 Stack Overflow 的第一个问题。
我是逻辑编程的新手,正在尝试评估它是否可以用来解决我正在研究的一些匹配问题。
问题:
假设我们有一个看起来像这样的集合 A。
A = 1, 2, 3, 4
然后我们还有一些看起来像这样的其他集合。
B = 1, 2
C = 3, 5, “banana"
D = 2, 3, 4
我要解决的问题是,
“找出与我们知道的其他集合相比,与集合 A 共享最多成员的集合。”
这种情况下的答案应该是集合 D,因为它与集合 A 共享三个成员。与其他仅与 A 共享两个和一个成员的集合相比。
问题一:
逻辑编程能解决这类问题吗?
问题2:
如果可以,你会如何在例如 Clojure 的 core.logic 中做到这一点?
【问题讨论】:
我不明白为什么这里需要逻辑编程。您只需要一个简单的集合交叉点。查看clojure.github.io/clojure/clojure.set-api.html 【参考方案1】:棋士
以下显示使用clojure.set
获得最佳拟合结果:
(ns
sample.sandbox
(:require [clojure.set :as set])
)
(def A # 1, 2, 3, 4)
(def B #1, 2)
(def C #3, 5, "banana")
(def D #2, 3, 4)
(defn best-fit-set
[control & sets]
(apply max-key count (map #(set/intersection control %) sets )))
(best-fit-set A B C D) => #4 3 2
【讨论】:
这没有回答所问的问题。 我手头的问题实际上更复杂。但我认为我必须简化它以使其适合 ***。也许这是这个问题的最佳解决方案?因为我觉得作为一个初学者,你通常会学习一些技巧,然后你会尝试将其应用于所有问题。就像您学习如何使用锤子,然后您尝试用锤子解决所有问题,即使还有其他更好甚至更简单的方法。我想我会再次发布这个问题,但会更加复杂,但尽量保持一般性。以上是关于使用 clojure 的 core.logic / minikanren 查找相似的集合的主要内容,如果未能解决你的问题,请参考以下文章
使用 clojure 的 core.logic / minikanren 查找相似的集合
为啥会返回这个矛盾的 clojure.core.logic/featurec 结果?
core.logic lvars 上的算术和 clojure 函数