Если вы знаете подстроку вы ищете, вы можете использовать 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