2

...どうすれば回避できますか?

(run* [q]
   (featurec q {:a 1})
   (featurec q {:a 2})))

戻り値

((_0
  :-
  (clojure.core.logic/featurec _0 {:a 2})
  (clojure.core.logic/featurec _0 {:a 1})))

_0これは、マップには少なくとも:a 1キーと値のペアとキーと値のペアが含まれている必要があることを意味すると理解してい:a 2ます。MultiMaps を使用しない限り、と:aの両方にマップできないため、これは矛盾しているように見えます。指定した制約が結合であるため、ORとして読み取ることはできません。制約が矛盾しているため、結果は次のようになるはずだと想像したでしょう。これらの制約を満たすことができる値はありません。12:a 1:a 2()q

結果を間違って読んでいるに違いありません。

4

1 に答える 1

1

はい、矛盾しています。しかし、それはそれです。同時に統合できるマップは{:a 1}ありません。{:a 2}

run*allfreshすべてがその制約の間に論理積 (AND) を導入します。論理和 (OR) が必要な場合は、conde.

おそらくあなたの質問は次のとおりです: なぜ core.logic は矛盾を「見て」、空の結果セットを返すことができないのですか? 正確にはわかりません。しかし、制約の 1 つを削除しても、「根拠のある」結果が得られないという事実に関係している可能性があります。

(run* [q]
   (featurec q {:a 1}))

;=> ((_0 :- (clojure.core.logic/featurec _0 {:a 1})))

[:a 1]それは次のように読みます:エントリを含むマップである限り、何でも。そして、それは正しい結果だと思います。

于 2015-08-21T15:57:33.407 に答える