Поддержка 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)

Другие вопросы по тегам