6

ここにはしばらくの間執着してきた(うまくいけば)シンプルな論理プログラムがあります。core.logicで一意のDAGの親を表示する

私はDAGをcore.logicにエッジリレーションで表しています。親ノードのリストを生成するとき、グラフに「ダイヤシェイプ」があると重複してしまいます。

この場合、親のリストを生成する方法はありませんか(parentoなどを書き換えて)?

(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:a)と私は実行*文の内部でそれをやりたい(すなわち、セット内の結果をラップすることは、私が目指してるものではありません)。

また、 "^:tabled"をparentoに追加することは、このトリックを行うように見えますが、私はtabledが紹介するメモを望んでいません。

答えて

1

これまでに行ったように、エッジに対して個別のファクトを定義すると、リレーショナルプログラミングを終了せずにこれを行う方法はありません。 1つの解決策は、結果リスト全体をClojureのコンストラクタに渡すことです。もう1つの選択肢は、ロジックプログラムの1回のパスですべてのノードを操作することです。

この問題に対する既存のPrologソリューションを見て、見つけたものを翻訳すると便利です。

+0

返信ありがとうございます、私はブラットコを読んでいて、ちょっとグーグルで読んでいて、何か直接役に立ちませんでした。あなたが言及した「ワンパス」ソリューションの概要を説明できますか?乾杯... –

+0

あなたはこれを見たことがありますか:http://sites.google.com/site/prologsite/prolog-problems/6? – dnolen

関連する問題