2016-10-01 71 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