“为什么?”;disj";从miniKanren在Scheme工作,但不在Racket工作?

“为什么?”;disj";从miniKanren在Scheme工作,但不在Racket工作?,scheme,racket,logic-programming,minikanren,Scheme,Racket,Logic Programming,Minikanren,我曾在minikanren库中为Racket工作,但想使用“disj”和“conj”操作符。为了易读性,我希望能够更明确地声明我使用的是disj还是conj,而不是通过conde表达式进行解析,尤其是当表达式变得更复杂时。我从“理性的阴谋家”中复制了来源: 这适用于前两种情况 > (run* (x) (disj (== 'foo x))) '(foo) 但仅在使用多个目标时返回第一个结果: > (run* (x) (disj (== 'foo x) (== 'bar x) (==

我曾在minikanren库中为Racket工作,但想使用“disj”和“conj”操作符。为了易读性,我希望能够更明确地声明我使用的是disj还是conj,而不是通过conde表达式进行解析,尤其是当表达式变得更复杂时。我从“理性的阴谋家”中复制了来源:

这适用于前两种情况

> (run* (x) (disj (== 'foo x)))
'(foo)
但仅在使用多个目标时返回第一个结果:

> (run* (x) (disj (== 'foo x) (== 'bar x) (== 'foobar x)))
'(foo)

为什么会这样?

时速。我似乎无法重现那种行为

当我克隆时,将两者都添加

#lang racket
(provide (all-defined-out))
trs2 impl.scm
的顶部,运行该文件,然后尝试您的测试程序。我看到了预期的结果:

; 
; Welcome to Racket v7.9.0.3 [cs].
; 
trs2-impl.scm> (run* (x) (disj (== 'foo x) (== 'bar x) (== 'foobar x)))
'((foo) (bar) (foobar))

你看到不同的行为了吗?如果是这样,那么我们可以更深入地研究。你知道你用的是哪种球拍吗?我认为那无关紧要,只是以防万一。

啊,我明白了。我认为问题在于我使用了标准Racket minikanren库的混合体,结合了标准库之上的disj函数所需的函数。。。使用minikanren的整个trs2实现似乎可以正常工作。谢谢
; 
; Welcome to Racket v7.9.0.3 [cs].
; 
trs2-impl.scm> (run* (x) (disj (== 'foo x) (== 'bar x) (== 'foobar x)))
'((foo) (bar) (foobar))