6

잠시 동안 붙어있는 (희망 사항) 간단한 논리 프로그램이 있습니다.core.logic을 사용하여 고유 한 DAG 부모 나열

DAG는 core.logic의 가장자리 관계로 표시됩니다. 부모 노드 목록을 생성 할 때 그래프에 "다이아몬드 모양"이있을 때 중복됩니다. 여기서는 사이클에 대해 언급하지 않습니다.

이 경우 상위 (parento 또는 유사 콘텐츠를 다시 작성하여)의 고유 목록을 생성 할 수있는 방법이 있습니까? (: B : C : A)

(defrel edge a b) 
(fact edge :a :b) 
(fact edge :a :c) 
(fact edge :b :d) 
(fact edge :c :d) 

(defne parento [x y] 
    ([x y] (edge y x)) 
    ([x y] (fresh [z] 
      (edge z x) 
      (parento z y)))) 

(run* [q] (parento :d q)) 
;; => (:b :c :a :a) 

나는 싶어 내가 실행 * 문 안쪽을 수행 할 (즉 세트에 결과를 포장하는 것은하지 내가 목표로하고있는 무슨이다).

또한 "^ : tabled"를 parento에 추가하는 것이 트릭을하는 것으로 보이지만, 나는 tabled가 소개 한 메모 작성을 원하지 않습니다.

답변

1

당신이 한 것처럼 가장자리에 대한 개별적인 사실을 정의한다면 관계형 프로그래밍을 떠나지 않고 이것을 할 방법이 없습니다. 한 가지 해결책은 결과의 전체 목록을 Clojure의 생성자에 전달하는 것입니다. 다른 옵션은 논리 프로그램에서 한 번에 모든 노드에서 작업하는 것입니다.

기존 Prolog 솔루션을이 문제로보고 찾은 내용을 번역하는 것이 도움이 될 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 저는 Bratko를 읽고 봤는데 조금 도움이되었지만 직접 도움이되지 않았습니다. 당신이 언급 한 '원 패스'해결책을 설명 할 수 있습니까? 건배 ... –

+0

본 적이 있습니까? http://sites.google.com/site/prologsite/prolog-problems/6? – dnolen

관련 문제