6

Clojure.logic を使用してThe Reasoned Schemer (TRS)に取り組み、ここに記載されている相違点に注意を払いました。チャプター 3 のフレーム 24 に到達しました。TRS は次のことを報告しています。

(run 5 [x]
  (lolo '((a b) (c d) . x)))

生成する必要があります

'(()
  (())
  (() ())
  (() () ())
  (() () () ())

今、私は `lolo as を実装しました

(defn lolo
  "Succeeds if l is a list-of-lists."
  [l]
  (conde
   ((emptyo l) s#)
   ((fresh [a]
           (firsto l a)
           (listo a)) (fresh [d]
                             (resto l d)
                             (lolo d)))
   (s# u#)))

次の奇妙な結果が生成されます。

'(()
  (())
  ((_0))
  (() ())
  ((_0 _1)))

これは基本的に、私のloloが新しい変数を漏らしているソリューションを生成していることを意味します. パターンを見ようとして続けていれば、

'(()
  (())
  ((_0))
  (() ())
  ((_0 _1))
  (() (_0)
  ((_0) ())
  (() () ())
  ((_0 _1 _2)))

しかし、霧の中で十分にはっきりと見ることができません。これに光を当てていただければ幸いです。それは私のloloのバグですか?clojure.logic のバグですか? TRS のソルバーと clojure.logic のソルバーの違いは合理的ですか? 結果をどのように解釈または使用できますか? どうすれば clojure.logic の結果を頭の中で予測できますか?

4

1 に答える 1

7

リンク先のcore.logic wikiページで述べたように、core.logiccondeはTRSのものcondiです。違いは、TRScondeは句を順番に試行するのに対しcondi、結果ストリームをインターリーブすることです。したがって、core.logic バージョンは、TRS に表示されるすべての結果を生成しますが、その間に、miniKanren が取得することのない他の結果を返します。

長い回答の関連パターンの 1 つは、から始まる 1 秒ごとの結果を取得する場合、結果 seq のそのサブシーケンスは、個々の結果の前に追加された(())結果 seq 全体のように見えるということです。()これは、インターリーブによるものです。このサブシーケンスで()は、 が結果の最初の要素として選択されlolo、残りが再帰的に生成されます。

于 2013-07-09T13:55:48.107 に答える