【问题标题】:Finding similar sets with clojure's core.logic / minikanren使用 clojure 的 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 constraint-programming logic-programming clojure-core.logic minikanren


【解决方案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}

【讨论】:

  • 这没有回答所问的问题。
  • 我手头的问题实际上更复杂。但我认为我必须简化它以使其适合 Stackoverflow。也许这是这个问题的最佳解决方案?因为我觉得作为一个初学者,你通常会学习一些技巧,然后你会尝试将其应用于所有问题。就像您学习如何使用锤子,然后您尝试用锤子解决所有问题,即使还有其他更好甚至更简单的方法。我想我会再次发布这个问题,但会更加复杂,但尽量保持一般性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-02
  • 2012-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多