私はしばらく clojure を使用してきましたが、core.logic から始めたばかりです。
のようなドメインが与えられた場合、 のような1 2 3 4
2 つのベクトルのベクトルを取得したいと考えています([[1 2] [3 4]])
。
注: これは、私が実際にやろうとしていることの単純化されたバージョンです。:) 参照: https://github.com/adamhoward/lineup
Web で not-membero の定義を見つけました。
(defne not-membero [x l]
([_ []])
([_ [?y . ?r]]
(!= x ?y)
(not-membero x ?r)))
そして、私はそれを次のように使用しようとしています:
(run 1 [q]
(fresh [w x
y z]
(== q [[w x]
[y z]])
(infd w x y z (domain 1 2 3 4))
(everyg distinctfd [[w x] [y z]])
(everyg #(not-membero % [y z]) [w x])))
これを Emacs で実行すると、Evaluation aborted.
メッセージが表示されます。
切り替えようとすると、元に戻ります。これは私membero
にとって理にかなっています。最初のベクトルのすべての要素は、2 番目のベクトルのメンバーです。not-membero
([[1 2] [1 2]])
[w x]
[y z]
でも、電話しrun 2
たら返ってき([[1 2] [1 2]] [[1 2] [1 3]])
ます。[[1 2] [1 3]]
上記のルールに対してどのように正しいのかわかりません。私はeveryg
正しく理解していませんか?ガイダンス (rtfmanual、rtfbook、rtfdissertation を含む) をいただければ幸いです。
ありがとう。
編集:これを解決した可能性があります。
奇妙な結果についてはまだわかりませんがmembero
、目標の代わりにこれを実行できることがわかりました:not-membero
(everyg #(distinctfd (conj [y z] %)) [w x])
[w x]
conj'd toの各要素に[y z]
は、すべての個別の値が含まれます。これは not-membero よりも効率が悪いかもしれないので、私はまだ助けを求めています。