问题标签 [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 - 在 minikanren 中编写 vector-membero
我正在尝试为membero
适用于向量的 miniKanren (1) 编写等价物。到目前为止,我找不到不涉及观察值是逻辑变量还是部分实例化的方法。任何指针?
目前,我有:
(1): 没关系,但我实际上正在使用cl-kanren
; 不过,我认为这里的任何事情都不应该依赖于此。cl-kanren
确实具有向量的统一性。
minikanren - miniKanren(logpy,或者其他)如何断言一个事实是真的?
我正在做一个练习,用几个不同的习语编写一些逻辑代码...... Prolog、miniKanren、ASP 等......以感受每一个。
我有一个关于一些非常基本的问题:
在 Prolog 中,您可以定义:
然后在 REPL 中你可以检查这个事实和非事实的真实性:
在 python miniKanren,LogPy中,您可以类似地定义事实:
我找不到简单地检查“鲍勃是人类”的真相的秘诀。
该run
函数似乎需要一个变量作为第二个参数,但我不想找到变量的值。
我发现的所有 kanren 示例都是从显示如何查询关系开始的,例如:
这更有用,但我想做的甚至比这更简单(只是为了比较 Prolog 中的相同婴儿步骤)。
prolog - Clojure core.logic 的简单 Prolog
我最近一直在玩 Prolog,并开始思考如何表示我想用它完成的一些任务,这些任务主要是关于拥有一个事实数据库并对其进行简单查询,将多个事实连接在一起。
但我想在我正在编写 Clojure 的上下文中使用它。似乎core.logic应该做我想做的事。
但是我天真地发现很难看到如何将基本的 Prolog 谓词放入 core.logic 中。
例如,我应该如何在 core.logic 中表示像这样简单的东西:
和一个像这样的查询
我能找到的大多数介绍都侧重于逻辑编程,而不是数据表示。
clojure - Clojure core.logic : nafc 和 ground
我在 Clojure 的 core.logic 中表示一个简单的数据库。
有两个谓词:page(p) 和 link(p,q)。
page(p) 表示在名为 p 的 wiki 中存在页面
link(p,q) 表示页面 p 包含到页面 q 的链接。
我现在正在尝试查询此数据库以查找
- a) 断开的链接(即页面 p 中的链接,没有页面 q),以及
- b) 孤立页面(没有链接的页面)
我的这些查询代码是这样的:
断开的链接按预期工作,但孤儿给了我一个 :- 符号列表。
我假设这与 nafc 的限制有关。根据文档:
实验:否定作为失败约束。目标 c 的所有论据都必须有依据。如果某些论点不成立,则此约束的执行将被延迟。
这些是“延迟的”,因为它们不是“地面”。
有人可以解释一下 ground 的真正含义吗?我知道它“没有自由变量”,但我仍然不明白在这种情况下这意味着什么。
其次,我应该如何编写这个孤儿查询?
function - 要运行的数据:必须将哪些数据传递给 minikanren 才能获得评估?
有一个视频,其中 minikanren 用于从数据到程序。也就是说,给定数据,它会生成生成数据的程序。
那么是否可以生成eval这样的通用函数呢?必须将哪些数据传递给它?
constraint-programming - clp(Z) 与 Kiselyov 关系算术
我正在努力理解 clp(Z) 和MiniKanren 中使用的另一个关系算术系统之间的功能差异。
特别是,clp(Z) 显然适用于有界场,而 Kiselyov等人。被描述为适用于无界字段。
我尝试使用与无穷大和不确定性相关的各种边缘情况,但除了 Kiselyov等人之外,我无法找到明显的差异。显然不支持区间和负数。
Kiselyov 系统的要点/优势是什么?主要是实现更简单,还是有更多?
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 中的“disj”在 Scheme 中有效,而在 Racket 中无效?
我正在使用 Racket 的 minikanren 库,但想使用“disj”和“conj”运算符。为了清晰起见,我希望能够更明确地声明我是使用 disj 还是 conj,而不是必须通过 conde 表达式进行解析,尤其是当表达式变得更加复杂时。我从“The Reasoned Schemer”复制了源代码:
这适用于前两种情况
但仅在使用多个目标时返回第一个结果:
为什么是这样?
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
循环。