2016-10-01 2 views
3

Я диковинку, если это возможно (и если да, то как следует реализовать) что-то вроде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") 

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

Boogie

ответ

4

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

Это так здорово :) thx много для отличного ответа – boogie666