Поддержка MiniKanren от доктора Ракета
Я начал изучать miniKanren с книги "Разумный интриган - второе издание" и со схемой DrRacket.
Я установил пакет "быстрее-миниканрен", но первые примеры книги с командой run*
(например, (run* q #f)
) создавать сообщения об ошибках, такие как run*: bad syntax in: (run* q #f)
,
Означает ли это, что пакет "быстрее-миниканрен" не дает правильного определения миниканрен? Или я ошибаюсь?
4 ответа
Как говорится в файле readme, нужно поставить (require minikanren)
в вашем исходном файле Racket.
Я поставил на второй строке, после #lang racket
скопировал appendo
определение,
#lang racket
(require minikanren)
(define (appendo l s out)
(conde
[(== l '()) (== s out)]
[(fresh (a d res)
(== `(,a . ,d) l)
(== `(,a . ,res) out)
(appendo d s res))]))
затем нажали "Выполнить" и попробовали это в командной строке:
> (run* (q r) (appendo q r '(1 2 3 4 5)))
'((() (1 2 3 4 5))
((1) (2 3 4 5))
((1 2) (3 4 5))
((1 2 3) (4 5))
((1 2 3 4) (5))
((1 2 3 4 5) ()))
>
Кажется, работает. Это не
> (run* q #f)
. run*: bad syntax in: (run* q #f)
> (run* (q) #f)
application: not a procedure;
expected a procedure that can be applied to arguments
given: #f
arguments...:
но это сделал:
> (run* (q) (lambda (_) #f))
'()
>
Хорошо, все, что говорит Уилл Несс, правильно. Позвольте мне добавить еще один комментарий высокого уровня: похоже, что есть сочетание дальнейшего развития и определенного недостатка поддержки, что способствует вашей ситуации.
1) Похоже, что язык миниканрен продолжал развиваться с момента публикации книги.
2) Похоже, что некоторые изменения (например, цель успеха #u) были нелегкими для Racket (хотя они наверняка были бы возможны с расширением Reader), и авторы библиотек, которые вы используете, выбрали для изменения язык вместо.
Одной вещью, которая может помочь, являются документы для оригинального пакета minikanren (онлайн на https://docs.racket-lang.org/minikanren/index.html), которые хорошо отформатированы и читаемы, и предоставляют ссылки для дальнейшего чтения.
Вы можете найти код из второго выпуска, который мы только что выпустили, полезным:
https://github.com/TheReasonedSchemer2ndEd/CodeFromTheReasonedSchemer2ndEd
Надеюсь это поможет!
Ура,
--Будет
После установки
faster-minikanren
(через менеджер пакетов или
raco
), поместите следующий фрагмент в начало файла:
#lang racket
(require minikanren)
(define succeed (== #t #t)) ;; suggested as per the footnote in frame 6 of Chapter 1, #s is written "succeed"
(define fail (== #f #t)) ;; and #u is written fail
(run* (q) succeed) ;; evaluates to '(_.0)