使用 clojure 的 core.logic / minikanren 查找相似集
Finding similar sets with clojure's core.logic / minikanren
这是我关于 Stack Overflow 的第一个问题。
我是逻辑编程的新手,正在尝试评估它是否可以用来解决我正在处理的一些匹配问题。
问题:
假设我们有一个看起来像这样的集合 A。
A = {1, 2, 3, 4}
然后我们还有一些看起来像这样的其他集合。
B = {1, 2}
C = {3, 5, “banana"}
D = {2, 3, 4}
我要解决的问题是,
“找出与我们已知的其他集合相比,与集合 A 共享最多成员的集合。”
本例的答案应该是D组,因为它与A组共享三个成员。相比于其他只与A共享两个和一个成员的组。
问题 1:
逻辑编程能解决这类问题吗?
问题 2:
如果可以的话,你会如何在 Clojure 中做到这一点 core.logic?
恰氏
以下显示使用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}
这是我关于 Stack Overflow 的第一个问题。
我是逻辑编程的新手,正在尝试评估它是否可以用来解决我正在处理的一些匹配问题。
问题:
假设我们有一个看起来像这样的集合 A。
A = {1, 2, 3, 4}
然后我们还有一些看起来像这样的其他集合。
B = {1, 2}
C = {3, 5, “banana"}
D = {2, 3, 4}
我要解决的问题是,
“找出与我们已知的其他集合相比,与集合 A 共享最多成员的集合。”
本例的答案应该是D组,因为它与A组共享三个成员。相比于其他只与A共享两个和一个成员的组。
问题 1:
逻辑编程能解决这类问题吗?
问题 2:
如果可以的话,你会如何在 Clojure 中做到这一点 core.logic?
恰氏
以下显示使用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}