请在2024 Clojure 状态调查中分享您的想法!

欢迎!请访问关于页面以获取更多关于如何工作的信息。

0
core.logic

目前我找不到一种方法来启用自定义数据类型在两个方向上与序列对象进行统一。您可以使用IUnifyTerms在单方向上使其工作,但是在另一方向(即序列对象首次出现时)无法实现。

问题似乎出在以下代码中:

`
(defn unify-with-sequential* [u v s]
(cond

(sequential? v)
(if (and (counted? u) (counted? v)
      (not= (count u) (count v)))
  nil
  (loop [u u v v s s]
    (if (seq u)
      (if (seq v)
        (if-let [s (unify s (first u) (first v))]
          (recur (next u) (next v) s)
          nil)
        nil)
      (if (seq v) nil s))))

(lcons? v) (unify-terms v u s)
:else nil))

`

如果最终nil可以被替换为对协议的调用(IUnifyTermsReversed ???IUnifyWithSequential ???),那么我相信这将使其可扩展。

9 个回答

0

评论者:dnolen

我认为您的数据类型实现ISequential是不理想的?

0

评论者:mikera

因为表达式也可以是叶子节点

(+ 3 X) ;; 作为序列是OK的
7 ;; 绝对不是序列!

因此,使表达式实现ISequential将是成问题且会破坏各种合约的...

尝试将叶子节点与序列对象进行统一应该是失败的,但是这是我需要自己实现的逻辑(我想是这样的)...

0

评论者:dnolen

我仍然不太明白,因为我缺少一些关于您用例的上下文信息。您有一个具体的 core.logic 示例,应该可以工作吗?

0

评论者:mikera

当然,这是我的测试用例

(let [ex1 (ex [+ 1 X])] ;; 包含 (+ 1 X) 的表达式 (is (= [(ex X)] (run* [q] (fresh [op p] (== [op p q] ex1))))) ;; 失败 (is (= [(ex X)] (run* [q] (fresh [op p] (== ex1 [op p q]))))) ;; 成功 )

第一种情况失败了(因为 unify-with-sequential* 返回 nil,如上所述)。第二种情况是 OK 的,因为它通过了我自己的 IUnifyTerms 实现。我可能做错了,但我认为除非 core.logic 本身发生变化,否则我无法使其工作。

0

评论者:dnolen

我们以前支持双向统一,但这需要实现大量的协议。最近我在想,提供强制协议可能会有用,例如 ICoerceToSequential。

0

评论者:mikera

我认为如果要在 core.logic 中使自定义数据结构成为第一公民,则必须以某种方式支持双向统一。

我明白了您如何使用 ICoerceToSequential 来实现这一点,因此这可能是一个好的解决方案。我们在 core.matrix 中做了类似的事情(以处理不同后端矩阵实现之间的强制转换)。

0

评论者:dnolen

自定义数据结构已经是一等公民了。是否应该允许在 core Clojure 接口/协议/类型上过度载载数据类型统一,完全是另外一回事。

很抱歉造成困惑。我不太清楚您为什么想要序列工作,从您的示例来看,您有一个合适表达式类型,统一到序列中有什么优势吗?

0

评论者:mikera

如果您有“类似序列”的数据结构但并不完全顺序?但概念上与序列等价,那么我认为这很重要。我的自定义表达式类型是一个例子,考虑到互操作性,像java.util.ArrayList这样的东西也浮现在我的脑海中。

事实上,我暂时回到使用常规列表,因此这个问题对我来说不是障碍。但仍然值得思考。

进行此类统一的一些优势似乎是
a) 符号 - 您可以使用常规的Clojure列表和向量统一与类似序列的某物
b) 效率 - 避免在不需要时构建新的自定义对象(尽管成本可能太微不足道,以至于在大多数情况下不必困扰……)

当然,您可能会决定避免这些复杂性更简单、更纯净,这是可以的。但是,拥有所有这些优良的可扩展协议,却无法完全扩展到自定义类型……这似乎很可惜。

0
参考:[https://clojure.atlassian.net/browse/LOGIC-123](https://clojure.atlassian.net/browse/LOGIC-123)(由mikera报告)
...