2024 Clojure 状态调查! 分享您的想法。

欢迎!请查阅 关于页面 了解更多关于如何使用该功能的信息。

0
core.logic

condu 的文档字符串如下:

{quote}
一次选择。一旦子句的头部(第一个目标)成功,该子句的剩余目标将只运行一次。非关系型。
{quote}

关于一次语义的句子不正确。头部(第一个目标)最多只能成功一次,而子句中承诺的剩余目标可以无限次地成功。以下示例对此进行了证明。

`
(defn y-or-n [x]
(conde
[(== x :y)]
[(== x :n)]))

(run* [x y]
(condu
[(y-or-n x) (== y 1)] ;; (y-or-n x) 只成功一次,因为它是对头的目标
[(== x :y) (== y 2)]))
;;=> ([:y 1])

(run* [x y]
(condu
[(== y 1) (y-or-n x)] ;; (y-or-n x) 成功两次,因为它不是对头的目标
[(== x :y) (== y 2)]))
;;=> ([:y 1] [:n 1])
`

示例中显示的当前行为符合 Scheme 中的 miniKanren,所以只是文档字符串不正确,实现是正确的。

1 答案

0
参考: https://clojure.atlassian.net/browse/LOGIC-171(由 tsdh 报告)
...