标签: reasoned-schemer

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

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

我有三个版本的 minikanren 实现:

  1. 《理性策划者》,第一版(麻省理工学院出版社,2005 年)。我叫它TRS1

    https://github.com/miniKanren/TheReasonedSchemer

    附言。它说它已被执行交错的condi改进版本所取代。conde

  2. 《理性的阴谋家》,第二版(麻省理工学院出版社,2018 年)。我叫它TRS2

    https://github.com/TheReasonedSchemer2ndEd/CodeFromTheReasonedSchemer2ndEd

  3. 《理性策划者》,第一版(麻省理工学院出版社,2005 年)。我叫它TRS1*

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

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

第一个实验:

TRS1

(run* (r)
      (fresh (x y)
             (conde
              ((== 'a x) (conde
                          ((== 'c y) )
                          ((== 'd y))))
              ((== 'b x) (conde
                          ((== 'e y) )
                          ((== 'f y)))))
             (== `(,x ,y) r)))

;; => '((a c) (a d) (b e) (b f))
Run Code Online (Sandbox Code Playgroud)

TRS2

(run* (x y)
      (conde
       ((== 'a x) …
Run Code Online (Sandbox Code Playgroud)

scheme logic-programming racket minikanren reasoned-schemer

6
推荐指数
1
解决办法
319
查看次数

为什么“理性策划者”要在其函数末尾添加一个“o”?

在合理的方案中,他们将标准 lisp 函数命名为末尾带有“o”,例如consoappendo

我的问题是:为什么“理性策划者”在其函数末尾添加一个“o”?

scheme minikanren reasoned-schemer

5
推荐指数
1
解决办法
441
查看次数

miniKanren:如何定义#s和#u?

在miniKanren中,succeed可以定义为(define succeed (== #t #t))fail可以定义为(define fail (=== #t #f))。但是, “and”作为“and”的缩写形式(如《理性阴谋家》中出现的那样)#s又如何呢?#usucceedfail

(define #s succeed)在 Racket 中产生错误:

Welcome to Racket v7.2.
> (require Racket-miniKanren/miniKanren/mk)
> (define #s succeed)
; readline-input:2:8: read-syntax: expected `(`, `[`, or `{` after `#s` [,bt
;   for context]
#<procedure:...iniKanren/mk.rkt:337:4>
; readline-input:2:18: read-syntax: unexpected `)` [,bt for context]
Run Code Online (Sandbox Code Playgroud)

我感觉这与阅读器宏有关。

我如何在Scheme和Racket中定义#sforsucceed#ufor ?fail

我正在使用Scheme 的规范 miniKanren 实现 …

scheme racket minikanren reasoned-schemer

5
推荐指数
1
解决办法
280
查看次数

“事实数据库”不是miniKanren的核心功能吗?

我一直在玩 miniKanren,试图通过将非常基本的 Prolog 教程转换成它来理解它。

我习惯使用 Python,所以我从 LogPy 库开始,该库后来被分叉和改进为一个实际上称为miniKanren 的库

从lib的README中给出的示例我们可以看到:

>>> from kanren import Relation, facts
>>> parent = Relation()
>>> facts(parent, ("Homer", "Bart"),
...               ("Homer", "Lisa"),
...               ("Abe",  "Homer"))

>>> run(1, x, parent(x, "Bart"))
('Homer',)
Run Code Online (Sandbox Code Playgroud)

这与您在 Prolog 教程开始时可能看到的内容基本对应,例如:

% facts.pl
parent(homer, bart).
parent(homer, lisa).
parent(abe, homer).

?- consult('facts')
true.

?- parent(X, bart).
X = homer
Run Code Online (Sandbox Code Playgroud)

我对此感到很高兴...

后来我发现自己阅读了更多的 MiniKanren 文献(一般意义上,不是 Python 库),我意识到我还没有看到任何以这种方式使用事实数据库的示例,也没有提到过这样的示例。

我错过了吗?或者这实际上不是 MiniKanren 的一个“理性策划者”的功能?

我确实在 Clojure 实现中找到了这样的东西core.logic,其中有:https: //github.com/clojure/core.logic/wiki/Features#simple-in-memory-database

它的工作方式非常相似,尽管比 python 更好,因为数据库是一个不同的实体,而不是库中的全局变量。

python lib 是否只是借用了非 kanren 的想法 …

minikanren clojure-core.logic knowledge-base-population reasoned-schemer

4
推荐指数
1
解决办法
699
查看次数