4

나는 The Reasoned Schemer (TRS)을 사용하여 Clojure.logic을 사용하고 differences documented here에주의를 기울였다. 내가 TRS는Clojure.logic Reasoned Schemer와의 차이점

(run 5 [x] 
    (lolo '((a b) (c d) . x))) 

지금

'(() 
    (()) 
    (()()) 
    (()()()) 
    (()()()()) 

을 생산해야한다고보고 제 3의 프레임 (24)에 도달, 나는

다음과 같은 이상한 결과를
(defn lolo 
    "Succeeds if l is a list-of-lists." 
    [l] 
    (conde 
    ((emptyo l) s#) 
    ((fresh [a] 
      (firsto l a) 
      (listo a)) (fresh [d] 
          (resto l d) 
          (lolo d))) 
    (s# u#))) 

로`롤로을 구현 :

'(() 
    (()) 
    ((_0)) 
    (()()) 
    ((_0 _1))) 

은 기본적으로 내 lolo가 신선한 변수를 유출하는 솔루션을 생산한다는 것을 의미합니다. 나는 계속되면, 패턴을 보려고, 나는

'(() 
    (()) 
    ((_0)) 
    (()()) 
    ((_0 _1)) 
    (() (_0) 
    ((_0)()) 
    (()()()) 
    ((_0 _1 _2))) 

를 얻을 수 있지만 매우 안개 속을 충분히 명확하게 볼 수 없으며,이에 창고 모든 빛을 감사하겠습니다. 내 lolo의 버그 야? clojure.logic의 버그입니까? TRS의 솔버와 clojure.logic의 솔버 사이에 적당한 차이가 있습니까? 결과를 해석하거나 사용하려면 어떻게해야합니까? clojure.logic의 결과를 어떻게 예측할 수 있습니까?

답변

6

core.logic의 conde에 링크 된 core.logic 위키 페이지에서 언급했듯이 TRS의 condi입니다. 차이점은 TRS의 conde은 절을 순서대로 시도하는 반면 condi은 결과 스트림을 인터리브한다는 것입니다. 따라서 core.logic 버전은 TRS에 표시된 모든 결과를 생성하지만, 그 사이에는 miniKanren이 결코 얻을 수없는 다른 결과가 반환됩니다.

더 긴 대답에서 하나의 관련 패턴은 (())에서 시작하는 매초 결과를 가져 오는 경우 결과 seq의 하위 시퀀스는 () 인 전체 결과 seq처럼 각 결과 앞에 붙는 것입니다. 인터리브 때문입니다.이 하위 시퀀스에서 ()이 결과의 첫 번째 요소로 선택되면 lolo이 나머지를 반복적으로 생성합니다.