7

这不是家庭作业——解决方案已经在文本中。我只是无法理解解决方案。

问题

(run* (q)
  (let [a (== true q)
        b (== false q)]
    b))

正确的解决方案

(false)

我相信的解决方案

()

我的困惑

显然“a (== true q)”行没有被执行,因为只有 b 是目标。这让我很困惑。到目前为止,我的逻辑编程心智模型是:

  • 考虑对 q 的所有可能分配
  • 输出设法通过整个程序的那些

    因此,“a (== true q)”强制 q = true,这使得不可能满足“b (== false q)”行。

    然而,显然只执行“计算目标所需的事情”。这是怎么回事?core.logic / mini-kanren 的正确心理执行模型是什么?

谢谢

(顺便说一句,我显然错了,因为 mini-karen + core.logic 彼此一致——我只是想了解我做错了什么。)

4

1 回答 1

9

==产生一个目标。但是你没有通过a目标来运行。所以run对此一无所知。类似的情况是这样的:

(defn call [f] (f))

(call
  (let [a #(println "a")
        b #(println "b")]
    b))

a函数已创建但未传递给call. 所以它永远不会被执行。

于 2012-05-31T09:49:44.333 回答