mini-Kanren,core.logic,clojure:Reasoned Scheme Exercise 60

时间:2012-05-31 05:10:58

标签: clojure logic minikanren clojure-core.logic

这不是作业 - 解决方案已在文中。我只是没理解解决方案。

问题

(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互相攻击 - 我只想了解我做错了什么。)

1 个答案:

答案 0 :(得分:9)

==产生目标。但是你没有通过a目标来运行。所以跑步不知道。可比情况如下:

(defn call [f] (f))

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

a功能已创建,但未传递给call。所以它永远不会被执行。