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

7 logic clojure minikanren clojure-core.logic

这不是作业 - 解决方案已在文中.我只是无法理解解决方案.

问题

(run* (q)
  (let [a (== true q)
        b (== false q)]
    b))
Run Code Online (Sandbox Code Playgroud)

正确的解决方案

(false)
Run Code Online (Sandbox Code Playgroud)

我相信解决方案

()
Run Code Online (Sandbox Code Playgroud)

我的困惑

显然,"a(== true q)"行未被执行,因为只有b是目标.这让我很困惑.到目前为止,我对逻辑编程的心理模型是:

  • 考虑q的所有可能的assignemnts
  • 输出管理通过整个程序的那些

    因此,"a(== true q)"迫使q = true,这使得不可能满足"b(== false q)"线.

    然而,显然只执行"计算目标所需的数量".这是怎么回事?core.logic/mini-kanren的正确心理执行模式是什么?

谢谢

(顺便说一句,我显然是错的,因为mini-karen + core.logic互相攻击 - 我只想了解我做错了什么.)

kot*_*rak 9

==产生目标.但是你没有通过a目标来运行.所以跑步不知道.类似的情况是这样的:

(defn call [f] (f))

(call
  (let [a #(println "a")
        b #(println "b")]
    b))
Run Code Online (Sandbox Code Playgroud)

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