问题标签 [minikanren]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
scheme - Racket 博士支持 MiniKanren
我从《The Reasoned Schemer - 第二版》一书和 DrRacket 方案环境开始研究 miniKanren。
我安装了“faster-minikanren”包,但是本书的第一个示例使用命令run*
(例如,(run* q #f)
)会产生错误消息,例如run*: bad syntax in: (run* q #f)
.
这是否意味着“faster-minikanren”包没有提供 minikanren 的正确定义?还是我犯了一个错误?
prolog - 关系语言描述了哪些类别?
我读到 lambda 演算是笛卡尔封闭范畴的语言。
据我了解,诸如 minikanren 或(部分)prolog 之类的关系语言将在这些以及其他类别上运行(因为函数是关系的特例)。了解更多相关信息将帮助我了解这些语言可以为我做的其他人无法做到的事情。
那么关系语言描述了哪些类别呢?
scheme - 所有可能的子列表方案
我想找到列表的所有可能的连续分区:
解决这个问题的最简单方法是什么?理想情况下不使用计数器。
编辑:
这是我一直在尝试的一个示例,但它并不完全有效(它应该反过来给出答案,但这没关系):
这个想法是我们逐项遍历列表,在每一步我们可以拆分或不拆分,然后我们分支到两个新的迭代,一个有拆分,一个没有拆分。这会产生接近我想要但不完全的结果。
clojure - 在core.logic中合成满足特征约束的最小地图?
在core.logic
中,有没有办法翻译程序的输出,例如
进入满足每个解决方案约束的最小映射,在这种情况下{:foo 5, :bar 2}
和{:foo 5, :baz 2}
?
scheme - 如何使用 quote 和 unquote 更忠实地将 The Reasoned Schemer 翻译成 Racket?
(我在 Racket 设置中的 miniKanren 的详细信息显示在底部 [1]。)
The Reasoned Schemer 中引号和取消引号的工作方式似乎与它们在 Racket 中的工作方式不匹配。例如,第 2 章第 2 节建议 [2] 以下函数定义:
如果我对此进行评估,我会得到'((,x ,y))
. 如果相反,我将其重写为:
我得到了预期的结果,'((_.0 _.1))
.
这似乎是一个小问题,但在许多情况下,所需的翻译非常冗长。例如,在第 3 章(第 34 页)的练习 45 中,本书提供了大致 [3] 以下定义:
为了得到他们得到的结果,我不得不像这样重写它:
[1]如此处所述,我运行raco pkg install minikanren
并定义了一些缺失的部分。
[2] 实际上,他们并没有准确地这么写,但是如果您注意该节和更早一节的脚注中的建议,那就是您所得到的。
[3] 模数一些我无法推断的隐式引用和取消引用。
logic-programming - 在逻辑编程中,取消嵌套是为了什么?
问题
Reasoned Schemer 描述了如何使用 miniKanren,它类似于 Prolog,但它是类 Lisp 语言的库。这本书的“第一诫”是这样的:
要将值为布尔值的函数转换为值为目标的函数,请将 cond 替换为 conde 并取消嵌套每个问题和答案。通过用#s(或#u)替换答案#t(或#f)来取消嵌套。
除了通过一些大致等效的示例外,它们并没有真正定义取消嵌套。最清楚的是:取消嵌套将您(list? (cdr l))
从
我不明白为什么需要取消嵌套。例如,对于上述目标,为什么 tp write 还不够(listo (cdr l))
?
[1] 我在 Racket 中的迷你 kanren 设置
如此处所述,我运行raco pkg install minikanren
然后定义了一些缺失的部分。
[2] 一些你可能不需要的函数定义
以下是它的定义listo
和它使用的所有内容,除了在minikanren
库或 Racket 的前奏中定义的东西。
racket - 在 Racket 的迷你 kanren 库中,condi 在哪里?
mini-kanren 语言具有四个条件运算符:conda
、conde
和condi
(在此处condu
描述)。我知道有两个可用于 Racket 的迷你 kanren 库(均在此处描述)。他们都没有实现。condi
我的印象(在阅读 The Reasoned Schemer 的中途,minikanren.org 将其称为“The Book”)很condi
重要:它是唯一通过交错分支采用“公平分离”的条件,因此您不会陷入无限 -循环在一个永远不会终止的分支中,而另一个分支确实终止了。
编辑:我可能已经设法实现了condi
自己,在这里。在 The Reasoned Schemer 中,conde
不同之处condi
仅在于最后两个参数mplus
被翻转mplusi
,所以这就是我实现的。conde
但据我所知,它的工作方式并不公平。
logic-programming - 了解 minikanren 中的终止计数列表中的位
我开始研究一些 minikanren,并编写了这个例子来计算列表中的 1 位。
现在以下工作正常
但是如果我改变目标的顺序,程序不会终止
这已经是我不完全理解的东西了,目标的顺序重要吗?在哪些方面?我想我明白,即使是随后的目标也会造成足够的限制,从而终止搜索,但我当然一定错过了一些东西。
探索更多这个问题,我看到了
所以我知道它试图寻找比现有更多的答案。我现在的怀疑是当子目标
拆分列表没有足够的约束b
来使搜索有限,这听起来很合理,因为除了外部之外没有任何东西谈论列表的尾部(== q (list a b c))
。期望不终止似乎更合理,因为没有说明c
in 的内容(== q (list a b c))
,它可能是另一个列表(是真的吗?),但是程序的交换版本如何终止?
因此我尝试了
和
但它仍然没有终止,所以也许问题不是我想的那样。
总的来说,我的理解中一定有一些我遗漏的东西,任何人都可以澄清这一切并指出做这件事的正确方法是什么?
scheme - miniKanren:如何定义#s和#u?
在 miniKanren 中,succeed
可以定义为(define succeed (== #t #t))
,并且fail
可以定义为(define fail (=== #t #f))
。但是,和在The Reasoned Schemer中出现的#s
and#u
的简写形式succeed
又如何呢?fail
(define #s succeed)
在球拍中产生错误:
我觉得这与阅读器宏有关。
如何在 Scheme 和 Racket 中定义#s
forsucceed
和#u
for ?fail
我正在使用Scheme的规范 miniKanren 实现和 Racket的规范 miniKanren 实现。