2024 Clojure状态调查中分享你的想法!

欢迎!请参阅关于页面以了解更多关于此如何运作的信息。

0 投票
core.logic
重新标记

示例

user> (def tmp {\a 1})
{\a 1}
user> (logic/run* [q] (logic/featurec tmp {\a q}))
(1)
user> (logic/run* [q] (logic/fresh [x] (logic/== x \a) (logic/featurec tmp {x q})))
()

第一次逻辑搜索符合预期。第二次应该返回与第一次相同的结果,但它失败了。

core.logic中有测试覆盖了其他模式下的特征,即在新鲜模式下的featurec(即:(logic/featurec {x q} tmp))。但是,这种模式似乎并不通用。

有人建议我在这里发表这篇帖子,因为我无法创建一个可以访问Jira的账户来报告这个bug。

2 答案

0 投票
0 投票

特征“featurec”不能有逻辑变量(无论是有界还是无界)作为键

要能够逻辑地处理键为逻辑变量的映射,必须能够处理包含逻辑变量的一组(不仅处理一组数据结构,还要理解组逻辑),但core.logic没有提供相应的代码,因此它既不能处理组上的逻辑(https://clojure.atlassian.net/browse/LOGIC-56 因其逻辑不正确已被“修复”,移除了core.logic对组的支持)也不能将逻辑变量用作映射键。

处理组是处理映射键的先决条件,因为映射的键是一组。

这与featurec的文档似乎存在一些混淆,该文档指出

> fs必须部分实例化 - 也就是说,
> 它可能包含逻辑变量等值支持
> 特征提取。

我注意到文档明确提到了“值得”。也许它还应该 stating*keys*不能是逻辑变量,以免造成混淆。
文档并不是很好,并且期望你对minikanran和逻辑编程方面的术语非常熟悉。

如果您查看这些文档 https://cs.union.edu/~striegnk/courses/nlp-with-prolog/html/node84.html#l11.sec.fs.prolog 中的 "特征结构统一" 部分,您会发现他们在普罗日志中用不正确列表,其中 car 是一个底层项(ground term)而 cdr 是某个逻辑变量。如果将这些结构构建成一个关联列表,它们可以被视为一种映射。这种映射的键不是逻辑变量,但值可以是,这就是 core.logic 的 featurec 的实现方式。

我对逻辑编程的术语不太熟悉,未曾阅读《Reasoned Schemer》,也不知道 core.logic 的 featurec 的实际起源,但我曾花时间尝试在 core.logic 中添加关于集合的推理功能,所以我可以确认它目前并不具备这项功能,并且我知道这是通用于映射键统一所必需的。
...