这不是作业 - 解决方案已在文中。我只是没理解解决方案。
(run* (q)
(let [a (== true q)
b (== false q)]
b))
(false)
()
显然没有执行“a(== true q)”行,因为只有b才是目标。这让我很困惑。到目前为止,我对逻辑编程的心理模型是:
输出那些设法通过整个程序的
因此,“a(== true q)”强制q = true,这使得无法满足“b(== false q)”行。
然而,显然只执行“计算目标需要的东西”。这是怎么回事? core.logic / mini-kanren的正确心理执行模式是什么?
由于
(顺便说一下,我显然错了,因为mini-karen + core.logic互相攻击 - 我只想了解我做错了什么。)答案 0 :(得分:9)
==
产生目标。但是你没有通过a
目标来运行。所以跑步不知道。可比情况如下:
(defn call [f] (f))
(call
(let [a #(println "a")
b #(println "b")]
b))
a
功能已创建,但未传递给call
。所以它永远不会被执行。