考虑以下β减少器:
(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))
是否可以显示此缩减器计算的中间术语?
答案 0 :(得分:1)
不,这是一个重要的NBE算法(意思是“一下子”)。它的工作原理是将您的术语语言反映到主机语言中,以备份在主机执行引擎上。