字符串core.logic查询包含
问题描述:
我珍玩,如果有可能(如果有的话应该怎么一个实现)像字符串core.logic查询包含
string-containso
在core.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")
感谢,
不羁
答
如果你知道你要搜索的字符串,就可以使用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)
这太酷了:) thx很多伟大的答案 – boogie666