저는 논리 프로그래밍 초보자입니다.왜 이런 sorto 구현이 종료되지 않습니까?
나는이 같은 정렬 관계를 구현하기 위해 노력하고있어 :
(sorto [3 2 1][1 2 3]) -> #s
Clojure의 및 core.logic 사용 I'am :이에 종료 할 수없는 이유를 이해가 안
을 대부분의 경우.
어떤 아이디어라도 도움이 될 것입니다. 감사합니다.
(require '[clojure.core.logic :refer :all]
'[clojure.core.logic.fd :as fd])
우선 몇 가지 작은 헬퍼를 정의
간단한 카운트 관계 : (counto [a b] 2) -> #s
(defne counto [list n]
([() 0])
([[fl . rl] _]
(fresh [nnxt]
(fd/- n 1 nnxt)
(counto rl nnxt))))
은 줄이고 모든? 관계형 당량
(defne reduceo [rel acc x y]
([_ _() _] (== acc y))
([_ _ [fx . rx] _]
(fresh [nacc]
(rel acc fx nacc)
(reduceo rel nacc rx y))))
(defne everyo [g list]
([_()])
([_ [fl . rl]]
(g fl)
(everyo g rl)))
분 관계 : (mino* [1 2 3 0] 0) -> #s
(defne mino* [xs y]
([[fxs . rxs] _]
(reduceo mino fxs rxs y)))
주요 관계 : (sorto [2 3 1 4] [1 2 3 4]) -> #s
(defne sorto [x y]
([()()])
([[fx . rx] [fy . ry]]
(fresh [x* c]
(counto rx c)
(counto ry c)
(mino* x fy)
(rembero fy x x*)
(sorto x* ry))))
목록과 최소의 요소 사이
(mino 1 2 1) -> #s
(defn mino [x y z]
(conde
[(fd/<= x y) (== x z)]
[(fd/> x y) (== y z)]))
관계
아래 실행은 종료되지 않습니다. 이유를 이해하고 싶습니다.
(run* [q]
(sorto q [1 2]))
; does not terminate
(run* [q]
(sorto [2 1] q))
; does not terminate
(run* [a b]
(everyo #(fd/in % (fd/interval 10)) a)
(everyo #(fd/in % (fd/interval 10)) b)
(sorto a b))
;neither
제 5 장에서보세요, 당신이 적은 코드를 검토 할 필요와 문제의 범위를 좁힐 필요가 있다고 생각합니다. – Pumphouse
[CodeReview] (https://codereview.stackexchange.com/)에 더 잘 맞습니다. – Thumbnail