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