我正在尝试使用Racket实现类似于prolog的程序。我对这门语言还是很陌生。我能够编写下面的=or
函数中看到的=and
,==
和=parent
,但是我在query
和考虑到我的初学者对语言的重视程度,我觉得这是一个基本的误会。
这是父函数:
(define (=parent x y)
(=or (=and (== x "Cronus") (== y "Zeus"))
(=and (== x "Zeus") (== y "Athena"))
(=and (== x "Athena") (== y "Erichthonius"))))
这是预期的用途:
(query (option) (=parent "Zeus" option))
...当option
为Athena
时将成功。
我已经给它做了许多不同的尝试,但是总是得到错误的输出和行为。最初,我尝试使用let
的本地绑定,但我对其进行了进一步简化,但仍然无法使用:
(define query
(lambda (arg1 arg2)
(for/list ([i (in-list arg1)])
(ormap (λ (x) arg2 x) i))))
我还采用了这样定义option
的方法:
(define (option)
(list '(Zeus Athena Erichthonius Cronus)))
如上所述运行查询代码始终会得到'(Zeus)
的输出。
在调试器中,当我在for/list
行上设置断点时,我看到i => (Zeus Athena Erichthonius Cronus)
和i
在query
返回之前从未改变。我以为我编写的代码会遍历列表,为每个元素分配i
,但事实并非如此。那我哪里出问题了?
此外,在调试器的每一步中,我都不会输入(=parent x y)
函数。而且我不明白为什么它没有被调用。
我的最后一个问题:为什么我不能使用option
的字符串来定义list
? (它产生:ormap:违反合同,预期:清单?给出:“宙斯”
(define (option)
(list "Zeus" "Athena" "Erichthonius" "Cronus"))