clojure - 使用 clojure 的 core.logic/minikanren 查找相似集

标签 clojure constraint-programming logic-programming clojure-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 共享两个和一个成员相比。

问题一:

逻辑编程能解决这类问题吗?

问题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}

关于clojure - 使用 clojure 的 core.logic/minikanren 查找相似集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30558297/

相关文章:

clojure - 在Clojure中遍历,迭代和参观树木

emacs - 如何在SLIME REPL中停止正在运行的操作?

prolog - 将递归转换为尾递归?

clojure - 在 core.logic 中使用 apply Clojure (CLP) 加密算术

logic - 关于逻辑和Curry-Howard对应的问题

clojure - 如何制作累积序列?

java - 禁用 SSL 连接的主机名检查?

optimization - 设置分区

algorithm - 是否可以仅通过查看整个拼字游戏中玩过的牌来推断每个玩家拥有的牌?

c# - 取决于 MSF 中决策的参数