core.logic查询字符串包含

时间:2016-10-01 18:12:12

标签: clojure clojure-core.logic

如果有可能(如果是这样的话,应该如何实施的话)我可以使用像

这样的东西。
string-containso
核心.logic中的

示例用法类似于

(db-rel person x)

(def database
  (db
    [person "John"]
    [person "Jane"]
    [person "Jim"]
    [person "Dan"]
    [person "Bob"]))

(with-db database
  (run* [q]
    (string-containso q "o")))

;would return ("John" "Bob")

提前致谢,

布吉

1 个答案:

答案 0 :(得分:4)

如果您知道要搜索的子字符串,可以使用pred,这对于将任何谓词解除为core.logic非常方便:

(defn string-containso
  [string substring]
  (pred string #(.contains % substring)))

(with-db database
  (run* [q]
    (person q)
    (string-containso q "o")))
; => (John Bob)

如果您还希望能够搜索子字符串,那会更有趣。您可以尝试枚举所有字符串的子字符串并检查它是否包含给定的字符串:

(defn substrings
  [s]
  (for [start (range (inc .length s))
        end (range (inc start) (inc (.length s)))]
    (.substring s start end)))

(defn string-containso
  [string substring]
  (fresh [all-substrings]
    (is all-substrings string substrings)
    (membero substring all-substrings)))

现在,你仍然可以像以前那样使用它:

(with-db database
  (run* [q]
    (person q)
    (string-containso q "o")))
; => (John Bob)

但您也可以使用它来获取所有子字符串:

(with-db database
  (run* [q]
    (fresh [p]
      (person p)
      (string-containso p q))))
; => (J Jo J Joh John Ji o J oh Jim ohn h i hn Ja n im D m Jan B Jane Da a Bo an Dan ane Bob n a ne o e an ob n b)