问题标签 [reasoned-schemer]
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.
clojure - 康达, 康迪, 康德, 康杜
我正在阅读Reasoned Schemer。
我对如何conde
工作有一些直觉。
但是,我找不到///做什么的conde
正式定义conda
。condu
condi
我知道https://www.cs.indiana.edu/~webyrd/但这似乎有例子而不是定义。
某处有conde
, conda
, condi
,的正式定义吗?condu
clojure - Clojure.logic 与 The Reasoned Schemer 的区别
我一直在使用 Clojure.logic 完成The Reasoned Schemer (TRS),并注意此处记录的差异。我到达第 3 章的第 24 帧,TRS 报告说
应该产生
现在,我实现了`lolo as
这会产生以下奇怪的结果:
这基本上意味着我的 lolo 正在产生泄漏出新变量的解决方案。如果我继续前进,试图看到一个模式,我会得到
但我在雾中看不清楚,我希望能对此有所了解。这是我lolo的一个错误吗?它是 clojure.logic 中的错误吗?TRS 中的求解器和 clojure.logic 中的求解器之间存在合理的区别吗?我如何解释或使用结果?我如何在心理上预测 clojure.logic 的结果?
scheme - 为什么“The Reasoned Schemer”在其函数末尾添加一个“o”?
在推理的方案中,他们命名标准 lisp 函数的末尾带有一个“o”,例如conso
and appendo
。
我的问题是:为什么“The Reasoned Schemer”会在其函数末尾添加一个“o”?
logic - 理性的计划者:不理解练习 57
在练习(或条目?)57 中,我只是不明白逻辑是如何流动的。问题是:给定
其中 '=' 实际上是三连杆统一 (?) 运算符。运行以下:
书中给出了答案:
我原以为答案是:
我的理由是 (teacupo x) 中的“x”应该首先通过其所有解决方案,并统一到其所有解决方案的列表中。但似乎teacupo 一次只放弃了一种解决方案。它让我感到困惑,因为我对 conde 的解释是,使用它给出的规则,你应该遍历 conde 的行,在一行成功后,假装它失败,刷新变量并找到下一行成功。鉴于解决方案的工作方式,该代码中的 conde 似乎回到了成功的行,然后迫使 teacupo conde 失败并放弃下一个可能的值。再一次,我会认为 teacupo 解决方案会放弃列表中的所有 conde 解决方案,然后继续进行外部 conde 调用。
logic-programming - 不理解 The Reasoned Schemer 第 5 章 62
我目前正在通过学习 The Reasoned Schemer 来学习 miniKanren。
我被困在第 5 章第 62 帧的练习中:(run* (x) (flatten_o (a) x))
为什么输出中有三个列表?
scheme - Racket 博士支持 MiniKanren
我从《The Reasoned Schemer - 第二版》一书和 DrRacket 方案环境开始研究 miniKanren。
我安装了“faster-minikanren”包,但是本书的第一个示例使用命令run*
(例如,(run* q #f)
)会产生错误消息,例如run*: bad syntax in: (run* q #f)
.
这是否意味着“faster-minikanren”包没有提供 minikanren 的正确定义?还是我犯了一个错误?
scheme - 如何在 The Reasoned Schemer 中解释 run 5 (x) g0 g1
我不明白 run n (x) g0 g1 ... 如何通过 listo
listo 是这样定义的
第 29 页第 14 节中的推理计划者说代码
产生结果
你能解释一下这是怎么发生的吗?先感谢您。
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 实现。
clojure-core.logic - “事实数据库”不是迷你看人的核心功能吗?
我一直在玩 miniKanren,试图通过将非常基本的 Prolog 教程转换为它来理解它。
我习惯使用 Python,所以我从 LogPy 库开始,该库后来被分叉并改进为实际上称为miniKanren的库
从 lib 的 README 中给出的示例中,我们可以看到:
这与您在 Prolog 教程开始时可能会看到的内容相对应,例如:
我对此很满意。后来我发现自己阅读了越来越多的 MiniKanren 文献(一般意义上,不是 Python 库),我意识到我没有看到任何以这种方式使用事实数据库的示例,或者提到一个。
我错过了吗?或者这实际上不是 MiniKanren 的“A Reasoned Schemer”的一个特点?
我确实在 Clojurecore.logic
实现中找到了这样的东西,其中有:
https ://github.com/clojure/core.logic/wiki/Features#simple-in-memory-database
它以非常相似的方式工作,尽管比 python 更好,因为 db 是一个独特的实体,而不是 lib 中的全局变量。
python lib是否只是借用了一个非kanren的想法core.logic
?还有其他类似的 MiniKanren 实现吗?还是完全不同的方法?
scheme - 阐明不同 minikanren 实现中的搜索算法
我目前正在通过 The Reasoned Schemer 和 Racket 学习 miniKanren。
我有三个版本的 minikanren 实现:
The Reasoned Schemer,第一版(麻省理工学院出版社,2005 年)。我叫它
TRS1
https://github.com/miniKanren/TheReasonedSchemer
PS。它说它
condi
已被conde
执行交织的改进版本所取代。The Reasoned Schemer,第二版(麻省理工学院出版社,2018 年)。我叫它
TRS2
https://github.com/TheReasonedSchemer2ndEd/CodeFromTheReasonedSchemer2ndEd
The Reasoned Schemer,第一版(麻省理工学院出版社,2005 年)。我叫它
TRS1*
我对上面的三种实现做了一些实验:
第一个实验:
TRS1
TRS2
TRS1*
请注意,在第一个实验中,TRS1
产生TRS2
了相同的结果,但TRS1*
产生了不同的结果。
似乎conde
在TRS1
和TRS2
使用相同的搜索算法,但TRS1*
使用不同的算法。
实验二:
TRS1
TRS2
TRS1*
请注意,在第二个实验中,TRS2
产生TRS1*
了相同的结果,但TRS1
产生了不同的结果。
似乎conde inTRS2
和TRS1*
使用相同的搜索算法,但是TRS1
使用了不同的算法。
这些让我很困惑。
有人可以帮我在上面的每个 minikanren 实现中澄清这些不同的搜索算法吗?
很感谢。
---- 添加一个新的实验 ----
第三次实验:
TRS1
但是,run 2
还是run 3
循环。
如果我使用condi
而不是conde
, 那么run 2
可以工作但run 3
仍然循环。
TRS2
这没关系,只是顺序不符合预期。
请注意,(a c)
现在是最后。
TR1*
但是,run 3
循环。