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")

Заранее спасибо,

Буги-вуги


person boogie666    schedule 01.10.2016    source источник


Ответы (1)


Если вы знаете подстроку, которую ищете, вы можете использовать pred< /a>, который удобен для подъема любого предиката в 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)
person Beyamor    schedule 04.10.2016