如果你知道你要搜索的字符串,就可以使用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