我目前正在学习 The Reasoned Schemer 和 Racket 的 miniKanren。
我有三个版本的 minikanren 实现:
《理性策划者》,第一版(麻省理工学院出版社,2005 年)。我叫它TRS1
https://github.com/miniKanren/TheReasonedSchemer
附言。它说它已被执行交错的condi改进版本所取代。conde
《理性的阴谋家》,第二版(麻省理工学院出版社,2018 年)。我叫它TRS2
https://github.com/TheReasonedSchemer2ndEd/CodeFromTheReasonedSchemer2ndEd
《理性策划者》,第一版(麻省理工学院出版社,2005 年)。我叫它TRS1*
我对上面的三种实现做了一些实验:
第一个实验:
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) 在合理的方案中,他们将标准 lisp 函数命名为末尾带有“o”,例如conso和appendo。
我的问题是:为什么“理性策划者”在其函数末尾添加一个“o”?
在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
我一直在玩 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