分享您的想法,完成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) ;; 作为序列是好的
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,如上所述)。第二个案例是正常的,因为它使用了你自己实现的 IUnifyTerms。我可能错了,但我认为没有 core.logic 自身的变化,我无法使其工作。

0

由:dnolen 发布的评论

我们曾经支持双向统一,但这导致了大量必须实现的协议。最近我一直在想,可能提供强制协议会有用,类似于 ICoerceToSequential。

0

由:mikera 发布的评论

我认为如果自定义数据结构想成为 core.logic 中的第一类公民,那么有必要以某种方式支持双向统一。

我看出来了,你可以通过 ICoerceToSequential 实现,这可能是一个好的解决方案。我们在 core.matrix 中做了类似的事情来处理不同后端矩阵实现之间的强制转换。

0

由:dnolen 发布的评论

自定义数据结构已经是第一类的了。是否应该允许用 core Clojure 接口/协议/类型重载自定义类型的统一,完全是另一码事。

很抱歉造成混淆。我不太清楚为什么你想要序列化工作,从你的例子来看,你似乎有一个恰当的表达式类型,统一与序列化的优势在哪里?

0

由:mikera 发布的评论

我认为如果你有“类似于序列”的数据结构,它们不是完全序列化的,但在概念上是等价的,这可能很重要?我的自定义 Expression 类型是一个例子,Java.util.ArrayList 等东西也由此而来。

实际上,我暂时换回了常规列表,所以这不是我面临的阻碍。但这仍然值得考虑。

进行这种统一的好处包括:
a) 符号化 - 你可以使用常规的Clojure列表和向量来进行与类似序列的统一
b) 效率 - 当不需要时避免构造新的自定义对象(尽管在大多数情况下成本可能微不足道,无需过多关注……)

当然,你可能会认为避免这些复杂性会更简单、更纯洁,这是完全可以的。但拥有所有这些高级可扩展协议,却不能完全将功能扩展到自定义类型,似乎有些可惜……

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