在β-减少器中显示中间项

时间:2018-01-08 14:43:45

标签: io scheme lambda-calculus

考虑以下β减少器:

(define (normalize v)
  (set! count 0)
  (set! reflected '())
  (reify v))

(define (reify v)
  (if (memq v reflected)
      (v cancel)
      (let ((x (gensym)))
    (ABS x (reify (v (reflect x)))))))

(define (reflect e)
  (let ((f (lambda (v)
         (if (eq? v cancel)
         e
         (reflect (APP e (reify v)))))))
    (set! reflected (cons f reflected))
    f))

(define (APP e1 e2) `(,e1 ,e2))

(define (ABS x e) `(lambda (,x) ,e))

(define reflected '())

(define count 0)

(define cancel '(cancel))

(define (gensym)
  (set! count (+ 1 count))
  (string->symbol (string-append "x" (number->string count))))

我想分析它的β减少顺序。但是,由于我不太熟悉Scheme,我希望看到中间术语(现在它只打印最终结果),它计算为纯lambda表达式。我知道如何显示一条线,但我无法在正确的位置挤压(display term) (newline)

以下是可用于验证解决方案的两个简单术语 - 教会oneλfx.f x)和succλnfx.f (n f x))(我希望我正确地编写它们)在Scheme):

(define One
  (lambda (f) (lambda (x) (f x))))

(define succ
  (lambda (n) (lambda (f) (lambda (x) (f ((n f) x))))))

(normalize (succ One))

是否可以显示此缩减器计算的中间术语?

1 个答案:

答案 0 :(得分:1)

不,这是一个重要的NBE算法(意思是“一下子”)。它的工作原理是将您的术语语言反映到主机语言中,以备份在主机执行引擎上。