Поддержка MiniKanren от доктора Ракета - PullRequest
0 голосов
/ 28 мая 2018

Я начал изучать miniKanren с книги «Разумный планировщик - второе издание» и со схемой DrRacket.

Я установил пакет «fast-minikanren», но первые примеры книги с командойrun* (например, (run* q #f)) выдает сообщения об ошибках, такие как run*: bad syntax in: (run* q #f).

Означает ли это, что пакет "fast-minikanren" не дает правильного определения minikanren?Или я ошибаюсь?

Ответы [ 3 ]

0 голосов
/ 28 мая 2018

Хорошо, все, что говорит Уилл Несс, правильно.Позвольте мне добавить еще один комментарий высокого уровня: похоже, что есть сочетание дальнейшего развития и некоторой нехватки поддержки, которая способствует вашей ситуации.

1) Похоже, что язык миниканрен продолжал развиваться с тех пор, какКнига была опубликована.

2) Похоже, что некоторые изменения (например, цель успеха #u) не были легкими для Racket (хотя они наверняка были бы возможны с расширением Reader), и авторамибиблиотеки, которые вы используете, выбрали для изменения языка.

Одна вещь, которая может помочь, - это документы для оригинального пакета minikanren (онлайн по адресу https://docs.racket -lang.org / minikanren / index.html ), которые хорошо отформатированы и читаемы, и предоставляют ссылки для дальнейшего чтения.

0 голосов
/ 26 июня 2018

Вы можете найти код из второго издания, которое мы только что выпустили, полезным:

https://github.com/TheReasonedSchemer2ndEd/CodeFromTheReasonedSchemer2ndEd

Надеюсь, это поможет!

Приветствия,

--будет

0 голосов
/ 28 мая 2018

Как говорится в файле 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))
'()
> 
...