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中存在测试,用于覆盖fresh下featurec的另一种模式,即:(logic/featurec {x q} tmp)。但反之,这种模式似乎并不总是有效。

我被建议在这里提出这个问题,因为我无法创建具有访问Jira以提交这个问题的账户。

2 个答案

0
0

编辑

featurec不能有逻辑变量(已绑定或未绑定)作为键。

为了逻辑处理含有逻辑变量键的映射,你必须能够处理包含逻辑变量的集合(而不仅仅是处理集合数据结构,还要理解集合的逻辑)。但是core.logic没有这段代码,因此它既不能处理集合上的逻辑([a rel="nofollow" href="https://clojure.atlassian.net/browse/LOGIC-56" target="_blank">https://clojure.atlassian.net/browse/LOGIC-56 已通过移除core.logic对集合的支持而“修复”,因为这是逻辑上不正确的)也不能将逻辑变量作为映射的键。

处理集合是处理映射键的先决条件,因为映射中的键是一个集合。

这看起来与featurec的文档存在一些混淆,文档中提到

> fs必须部分实例化 - 也就是说,
> 它可能包含用于支持
> 特征提取的值。

我看到文档明确提到了“值”。可能也应该指出“*键*”不可以是逻辑变量,以避免混淆。
文档并不十分优秀,它假设你非常熟悉minikanran和技术编程领域的术语。

如果您查看关于普罗逻辑中“特征结构统一”的这些文档 https://cs.union.edu/~striegnk/courses/nlp-with-prolog/html/node84.html#l11.sec.fs.prolog,您会看到他们以不正确列表的术语来谈论事物,其中car是一个基词项,而cdr是某些逻辑变量,如果我们为这些结构构建关联列表,则可以将其视为一种映射。这种映射的键不是lvars,但值可以是,这就是如何到达core.logic的featurec。

我对逻辑编程术语不是很精通,还没有读过《Reasoned Schemer》,不知道core.logic的featurec的真正起源故事,但我花了一些时间在尝试向core.logic添加对集合的推理,我肯定它没有这个功能,我知道这是在映射键上一般统一的需求。
...