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 以提交此 bug 的账号。

2 个答案

0
0
"http://index.php/user/hiredman" class="qa-avatar-link"> "http://index.php/user/hiredman" width="40" height="40" class="qa-avatar-image" alt=""> "http://index.php/12427/bug-core-logic-with-featurec-searching-for-logic-variables?show=12437#a12437" class="qa-a-item-what" itemprop="url">已回答
已编辑

featurec 不能将逻辑变量(无论是有界还是无界)作为键

为了逻辑上处理以逻辑变量为键的映射,您必须能够处理包含逻辑变量的集合(不仅处理集合数据结构,还要理解集合的逻辑),而 core.logic 并没有这方面的代码,因此它既不能处理集合上的逻辑(https://clojure.atlassian.net/browse/LOGIC-56 中的问题已被“修复”,即移除了 core.logic 对集合的原生支持,因为这不正确地符合逻辑)也不能将逻辑变量作为映射键。

处理集合是处理映射键的前提,因为映射中的键是一个集合。

"http://index.php/user/Morgon+Kanter" class="qa-avatar-link"> "http://index.php/user/Morgon+Kanter" width="20" height="20" class="qa-avatar-image" alt=""> "http://index.php/12427/bug-core-logic-with-featurec-searching-for-logic-variables?show=12438#c12438" class="qa-c-item-what" itemprop="url">评论
这似乎与 featurec 的文档有误解,该文档指出

> fs 必须部分实例化 - 即,
> 它可以包含值为逻辑变量以支持
> 特征提取。

我在文档中看到了明确的值声明。也许它还应该声明 *键* 不能是逻辑变量,以防止混淆。
"http://index.php/user/hiredman" class="qa-avatar-link"> "http://index.php/user/hiredman" width="20" height="20" class="qa-avatar-image" alt=""> "http://index.php/12427/bug-core-logic-with-featurec-searching-for-logic-variables?show=12439#c12439" class="qa-c-item-what" itemprop="url">评论
文档不是很理想,并且希望你对 minikanran 和逻辑编程术语非常熟悉。

如果您查看有关“Prolog 中的特征结构归并”的这些文档 "https://cs.union.edu/~striegnk/courses/nlp-with-prolog/html/node84.html#l11.sec.fs.prolog" rel="nofollow" target="_blank">https://cs.union.edu/~striegnk/courses/nlp-with-prolog/html/node84.html#l11.sec.fs.prolog,您会看到它们用不正确列表、车是基元项,cdr 是某些逻辑变量的项话,这样的项可以看作是一种映射,如果你构建这些结构的相关列表,这样的映射将具有不是逻辑变量的键,但其值可以是,这就是你得到 core.logic 的 featurec 的方法

我对逻辑编程术语不太了解,没有阅读《理性程序员》,也不了解 core.logic 功能的历史起源,但我花了些时间尝试给 core.logic 添加对集合的推理,所以我可以肯定 core.logic 没有这样的功能,而且我知道这是通用的映射键统一所必需的。
...