问题标签 [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.

0 投票
2 回答
77 浏览

scheme - 在 minikanren 中编写 vector-membero

我正在尝试为membero适用于向量的 miniKanren (1) 编写等价物。到目前为止,我找不到不涉及观察值是逻辑变量还是部分实例化的方法。任何指针?

目前,我有:

(1): 没关系,但我实际上正在使用cl-kanren; 不过,我认为这里的任何事情都不应该依赖于此。cl-kanren确实具有向量的统一性。

0 投票
1 回答
229 浏览

minikanren - miniKanren(logpy,或者其他)如何断言一个事实是真的?

我正在做一个练习,用几个不同的习语编写一些逻辑代码...... Prolog、miniKanren、ASP 等......以感受每一个。

我有一个关于一些非常基本的问题:

在 Prolog 中,您可以定义:

然后在 REPL 中你可以检查这个事实和非事实的真实性:

在 python miniKanren,LogPy中,您可以类似地定义事实:

我找不到简单地检查“鲍勃是人类”的真相的秘诀。

run函数似乎需要一个变量作为第二个参数,但我不想找到变量的值。

我发现的所有 kanren 示例都是从显示如何查询关系开始的,例如:

这更有用,但我想做的甚至比这更简单(只是为了比较 Prolog 中的相同婴儿步骤)。

0 投票
1 回答
460 浏览

prolog - Clojure core.logic 的简单 Prolog

我最近一直在玩 Prolog,并开始思考如何表示我想用它完成的一些任务,这些任务主要是关于拥有一个事实数据库并对其进行简单查询,将多个事实连接在一起。

但我想在我正在编写 Clojure 的上下文中使用它。似乎core.logic应该做我想做的事。

但是我天真地发现很难看到如何将基本的 Prolog 谓词放入 core.logic 中。

例如,我应该如何在 core.logic 中表示像这样简单的东西:

和一个像这样的查询

我能找到的大多数介绍都侧重于逻辑编程,而不是数据表示。

0 投票
0 回答
123 浏览

arrays - 如何在 J/APL 中实现 minikanren 'appendo'?

我一直在努力在 J 中实现 Minikanren,但是在惰性流、合取、析取和等价约束方面取得了良好进展之后,我现在完全陷入了这种appendo关系。

具体来说,我想要帮助(代码、书籍、文档等)如何appendo使用 J/APL 连词/运算符实现类似的东西,因为它们只允许 2 个参数(如果产生值类型,则为 4 个)。

核心实现

追加尝试

谢谢!

0 投票
1 回答
129 浏览

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 的真正含义吗?我知道它“没有自由变量”,但我仍然不明白在这种情况下这意味着什么。

其次,我应该如何编写这个孤儿查询?

0 投票
0 回答
35 浏览

function - 要运行的数据:必须将哪些数据传递给 minikanren 才能获得评估?

有一个视频,其中 minikanren 用于从数据到程序。也就是说,给定数据,它会生成生成数据的程序。

那么是否可以生成eval这样的通用函数呢?必须将哪些数据传递给它?

0 投票
1 回答
118 浏览

constraint-programming - clp(Z) 与 Kiselyov 关系算术

我正在努力理解 clp(Z) 和MiniKanren 中使用的另一个关系算术系统之间的功能差异。

特别是,clp(Z) 显然适用于有界场,而 Kiselyov等人。被描述为适用于无界字段。

我尝试使用与无穷大和不确定性相关的各种边缘情况,但除了 Kiselyov等人之外,我无法找到明显的差异。显然不支持区间和负数。

Kiselyov 系统的要点/优势是什么?主要是实现更简单,还是有更多?

0 投票
1 回答
330 浏览

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 实现吗?还是完全不同的方法?

0 投票
1 回答
74 浏览

scheme - 为什么 miniKanren 中的“disj”在 Scheme 中有效,而在 Racket 中无效?

我正在使用 Racket 的 minikanren 库,但想使用“disj”和“conj”运算符。为了清晰起见,我希望能够更明确地声明我是使用 disj 还是 conj,而不是必须通过 conde 表达式进行解析,尤其是当表达式变得更加复杂时。我从“The Reasoned Schemer”复制了源代码:

这适用于前两种情况

但仅在使用多个目标时返回第一个结果:

为什么是这样?

0 投票
2 回答
209 浏览

scheme - 阐明不同 minikanren 实现中的搜索算法

我目前正在通过 The Reasoned Schemer 和 Racket 学习 miniKanren。

我有三个版本的 minikanren 实现:

  1. The Reasoned Schemer,第一版(麻省理工学院出版社,2005 年)。我叫它TRS1

    https://github.com/miniKanren/TheReasonedSchemer

    PS。它说它condi已被conde执行交织的改进版本所取代。

  2. The Reasoned Schemer,第二版(麻省理工学院出版社,2018 年)。我叫它TRS2

    https://github.com/TheReasonedSchemer2ndEd/CodeFromTheReasonedSchemer2ndEd

  3. The Reasoned Schemer,第一版(麻省理工学院出版社,2005 年)。我叫它TRS1*

    https://docs.racket-lang.org/minikanren/

我对上面的三种实现做了一些实验:

第一个实验:

TRS1

TRS2

TRS1*

请注意,在第一个实验中,TRS1产生TRS2了相同的结果,但TRS1*产生了不同的结果。

似乎condeTRS1TRS2使用相同的搜索算法,但TRS1*使用不同的算法。

实验二:

TRS1

TRS2

TRS1*

请注意,在第二个实验中,TRS2产生TRS1*了相同的结果,但TRS1产生了不同的结果。

似乎conde inTRS2TRS1*使用相同的搜索算法,但是TRS1使用了不同的算法。

这些让我很困惑。

有人可以帮我在上面的每个 minikanren 实现中澄清这些不同的搜索算法吗?

很感谢。

---- 添加一个新的实验 ----

第三次实验:

TRS1

但是,run 2还是run 3循环。

如果我使用condi而不是conde, 那么run 2可以工作但run 3仍然循环。

TRS2

这没关系,只是顺序不符合预期。

请注意,(a c)现在是最后。

TR1*

但是,run 3循环。