1

次の式は、2 つのコンス セルが等しくない 2 つのコンス セルで構成される多数の結果を返すことを期待しています。ただし、0 の結果が返されます。結果が得られないのはなぜですか?

(run* [c1 c2] 
  (fresh [lx ly x1 y1 x2 y2] 
    (== lx [1 2])
    (== ly [4 5])
    (membero x1 lx)
    (membero x2 lx) 
    (membero y1 ly)
    (membero y2 ly)
    (conso x1 y1 c1)
    (conso x2 y2 c2)
    (!= c1 c2)))

期待される結果の例:

  • [(1 . 4) (2 . 5)]
  • [(1 . 4) (1 . 5)]
  • [(2 . 4) (2 . 5)]

[(1 . 4) (1 . 4)]各コンスの両方のスポットが等しいような結果を返すとは思いません。

その(!= c1 c2)部分を取り除くと、両方の短所が同じものを含めて、16 の結果が得られます。

(!= c1 c2)次のように置き換えると、期待どおりの結果が得られます。

(conde
  ((!= x1 x2))
  ((!= y1 y2)))

同じことを行う必要がありますが、2 つのセルを明示的にチェックします。

4

2 に答える 2

5

これは有効な core.logic プログラムではありません。conso尻尾が適切でない場所では使用できません。Scheme の miniKanren ではこれが可能ですが、core.logic の動作は未定義です。consoこれを反映するために docstring を修正しました。作業プログラム:

(run* [c1 c2] 
  (fresh [lx ly x1 y1 x2 y2] 
    (== lx [1 2])
    (== ly [4 5])
    (membero x1 lx)
    (membero x2 lx) 
    (membero y1 ly)
    (membero y2 ly)
    (== [x1 y1] c1)
    (== [x2 y2] c2)
    (!= c1 c2)))
于 2013-05-10T16:12:22.373 に答える
0

このようにコンソを使用できないというポスターは正しいです。ドキュメント文字列は次のとおりです。


a が l の最初でd が l の残りであるような、l がコレクションである関係。グラウンド d を適切なテールにバインドする必要がある場合。

(== [x1 y1] c1)and(== [x2 y2] c2)または(conso x1 [y1] c1)andを使用して適切なリストを作成する必要があり(conso x2 [y2] c2)ます。

于 2013-05-10T15:53:59.700 に答える