为什么featurec没有产生矛盾?

时间:2014-02-03 03:34:25

标签: clojure clojure-core.logic minikanren

这是一个矛盾:

(run* [q]
  (== q true)
  (== q false)) 

-> ()

因为q不能同时为truefalse

这不应该是一个矛盾吗?

(run* [q]
  (featurec q {:k true})
  (featurec q {:k false}))  

-> ((_0 :- (clojure.core.logic/featurec _0 {:k true})
           (clojure.core.logic/featurec _0 {:k false})))

我不知道:-是什么意思。但由于地图密钥是唯一的,我认为没有地图可以:ktrue以及false。如何确保第二个目标不匹配?

另一个例子

(run* [q]
  (fresh [x]
    (featurec x {:k false})     
    (== q true)
    (featurec x {:k q}))) -> (true)

我将此解释为:

  • x与地图类似:kfalse
  • qtrue
  • q:k
  • x的值

我到底想要做什么?

我正在尝试使用featurec来创建目标,如:

(defn is-a-foo [x v]
  (featurec x {:foo v}))

(defn is-a-bar [x v]
  (featurec x {:bar v}))

然后我想说:

(defn foo-implies-bar [x]
  (conde [(is-a-foo [x true]) (is-a-bar [x true])])

0 个答案:

没有答案