2016-10-01 2 views
3

은 (만약 그렇다면 어떻게 구현해야한다) core.logic에서core.logic 쿼리가 포함

string-containso 

과 같이 가능하다면 나는 골동품을 해요. 편리 당신이 검색하는 문자열을 알고 있다면

답변

4

, 당신은 pred을 사용할 수 있습니다 사전에

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

감사와 같은

예를 들어 사용이 될 뭔가

부기, 술어를 들어 올리는 경우 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

멋진 답변입니다. 훌륭한 답변을 많이 드리겠습니다. – boogie666

관련 문제