2013-10-14 3 views
1

이것은 바보 같은 질문이어야합니다.하지만 core.logic의 목표 목록을 어떻게 처리해야합니까? run*이 목록을 기대하지 않는 core.logic에서 목표 목록을 처리하는 방법

(run* [g] 
    (f)) 

(defn f[] 
    '(succeed succeed)) 

는 예외가 발생합니다. (apply all (f)) 할 필요가 있지만 all 매크로, 그래서 작동하지 않는 느낌.

해결책은 무엇입니까? 나는 여기서 사소한 명백한 무언가를 놓치고 있다고 느낀다 ...

Adrian.

답변

1

목표가 하나의 매개 변수 만 사용하는 경우 everyg을 다른 대답에서 제안 된대로 사용할 수 있습니다. 기본적으로 (everyg g coll)은 골격 g이 coll의 각 요소에서 성공할 때 성공하는 목표입니다. 그러므로 coll은 목표의 집합이 아니라 g에 대한 단일 매개 변수의 집합입니다. project과 결합이 가능 작성할 수 있습니다, 때문에 여전히 도움 :

(defna apply-collg 
    [gcoll v] 
    ([() _]) 
    ([[gh . gt] _] (applyg gh v) (apply-collg gt v))) 

에서 목표를 만들기 위해 pred 사용 :

(defn applyg 
    [g v] 
    "Goal that succeeds when the goal g applied to v succeeds. 
    Non-relational as g must be ground." 
    (project [g] (everyg g [v]))) 

을 그리고 적용 할 목표의 모음이있는 경우

(run* [q] (apply-collg [#(pred % pos?) #(pred % odd?)] 1)) 
=> (_0) 
(run* [q] (apply-collg [#(pred % pos?) #(pred % odd?)] 2)) 
=>() 

목표는 다음 중 하나가 바로 복용 목표로 변환 할 필요가 2 개 이상의 매개 변수를 적용 할 경우 : Clojure의 술어, 그것은 테스트를 용이하게 매개 변수의 단일 모음.

저는 아직 core.logic이 새롭기 때문에 의견을 환영합니다.

+0

감사합니다. 나는 내 대답에 대해 확신하지 못했습니다. –

0

나는이 시도했지만 http://www.clojure.net/2012/10/02/More-core.logic/을 보면이 구조를 사용하여 비슷한 일을 할 수있을 것 같습니다되지 않은 :이 보인다

(def f (all 
     succeed 
     succeed)) 
+0

예,이 작업이 가능합니다. 목록을 단일 목표로 전환했습니다. 그러나 목표 목록에 알 수없는 신념이 있다면 어떨까요? 그럼 뭐하니? (제 경우에는 for 루프에 의해 생성됩니다). –

1

가 작동 :

(everyg succeed (f)) 

난 여전히 관심 더 나은 또는 적어도 더 관용적 인 해결책이 있다면.

+0

이 답변에는 혼란이 있습니다. (everyg g coll)은 목표 g가 coll의 각 요소에서 성공할 때 성공하는 목표입니다. 따라서 (everyg succeed (f)) 은 함수 f가 반환하는 모든 콜렉션 값에 목표를 적용합니다. f가 목표 모음을 반환한다는 사실은 여기서는 부적합합니다. – fmjrey