2016-10-01 66 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") 

感謝,

不羈

回答

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