2012-09-24 24 views
6

下面是我一直堅持使用的(希望)簡單的邏輯程序。我有一個由core.logic中的邊緣關係表示的DAG,當生成父節點列表時,當我在圖中有「菱形圖形」(我不是在說這裏的循環)時,我會得到重複圖像。用core.logic列出獨特的DAG父母

有沒有什麼辦法在這種情況下生成一個明確的父母名單(通過重寫父母或類似)?

(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) 

我想(:B:C:一),我想這樣做的運行*語句中(即包裝的結果在一組是不是我的目標)。

此外,向父項添加「^:tabled」似乎可以做到這一點,但我不希望這種表式引入的備忘錄。

回答

1

如果您像完成一樣定義邊緣的單個事實,則在離開關係編程時無法做到這一點。一種解決方案是簡單地將整個結果列表傳遞給Clojure的set構造函數。另一種選擇是在邏輯程序中一次處理所有節點。

查看現有的Prolog解決方案解決此問題並翻譯您找到的內容可能會有幫助。

+0

感謝您的回覆,我一直在閱讀Bratko和google搜索,沒有發現任何直接有用的東西。你能概述你提到的「一次通過」解決方案嗎?乾杯... –

+0

你見過這個:http://sites.google.com/site/prologsite/prolog-problems/6? – dnolen