The following Clojure code은 core.logic
을 사용하여 두 가지 주문에서 동일한 목표를 가진 동일한 로직 문제를 해결합니다. 이 정렬 순서로 인해 하나는 빨리 끝내고 다른 하나는 걸리게됩니다.Clojure의 core.logic에서 목표를 주문하는 경우
(use `clojure.core.logic)
;; Runs quickly. Prints (1 2 3).
(clojure.pprint/pprint (run* [q] (fresh [x] (== x [1,2,3])
(membero q x))))
;; Hangs
(clojure.pprint/pprint (run* [q] (fresh [x] (membero q x)
(== x [1,2,3]))))
이 문제를 방지하려면 일반적인 해결책이나 일반적인 방법이 있습니까? core.logic
와
, 당신은 가능한 한 빨리 검색 공간을 줄이고 자 :
정확히'(membero q x) '에서 검색하는 것은 무엇입니까? x는 가능한 모든 컬렉션 중에서 실제로 반복되고 있습니까? 어떤 계산이 멈추는 동안 발생합니까? – MRocklin
@MRocklin, 정확하게. 사실, 만약 당신이'membero'에 대한 코드를 상상한다면, 엘리먼트를 그 엘리먼트와리스트로 통합하려고 시도 할 것이고, 무한대까지 엘리먼트를 포함하는리스트를 재귀 적으로 빌드 할 것입니다. 이론적으로 사실의 순서는 필요하지 않지만 검색 트리를 제한하는 것이 편리합니다. –