Когда я запускаю свою процедуру для вычисления цифры церкви целого числа, почему я получаю ошибку # («halt»)?

#algorithm #lambda #functional-programming #scheme #lisp

#алгоритм #лямбда #функциональное программирование #схема #lisp

Вопрос:

Алонзо Черч использовал лямбда-исчисление для создания системы представления чисел с помощью процедур.

Например: 0 — это x , 1 — это f x , 2 — это f(f x) и так далее, где цифра означает, сколько раз f вызывается x . Я написал программу в Scheme на основе предыдущих определений нуля и add-1 для итеративного вычисления цифры Черча числа. Код будет помещен в конце сообщения. Я пытаюсь запустить эту функцию для числа 7 и получаю неясную ошибку Error: <: number required, but got #("halt") [church-numeral, (anon), (anon), (anon), <] . Единственное, что < сравнивается, — это числа, и я нигде не могу найти в Интернете ничего о #("halt") чем-либо, кроме сообщения об ошибке, являющейся лингвистически некорректной. Что означает эта ошибка и как я могу ее исправить?

Код:

 (define zero (lambda (f) (lambda (x) x)))

(define (add-1 n)
  (lambda (f) (lambda (x) (f ((n f) x)))))

(define one (lambda (f) (f (f x))))

(define (add m n)
  (lambda (f) (lambda (x) ((m f) ((n f) x)))))

(define (church-numeral x)
  (define (iter result x count)
    (if (< count x) 
    (iter (add-1 result x (  1 count)))
    count))
  (iter zero x 0))

(church-numeral 7) 
  

Комментарии:

1. Похоже, (iter (add-1 result x ( 1 count))) так и должно быть (iter (add-1 result) x ( 1 count)) . Кроме того, вам не нужно переходить x к iter .

2. @DavidEisenstat это работает, не могли бы вы включить это в ответ, чтобы я мог его принять?

Ответ №1:

Похоже, что (iter (add-1 result x ( 1 count))) должно быть (iter (add-1 result) x ( 1 count)) .