ここにはしばらくの間執着してきた(うまくいけば)シンプルな論理プログラムがあります。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が紹介するメモを望んでいません。
返信ありがとうございます、私はブラットコを読んでいて、ちょっとグーグルで読んでいて、何か直接役に立ちませんでした。あなたが言及した「ワンパス」ソリューションの概要を説明できますか?乾杯... –
あなたはこれを見たことがありますか:http://sites.google.com/site/prologsite/prolog-problems/6? – dnolen