【问题标题】:How do i invoke Scheme number functions from SICP我如何从 SICP 调用方案编号函数
【发布时间】:2009-05-05 20:10:33
【问题描述】:

在 SICP 中,(ex 2.6)以下功能被描述为“无数字生活”的方式。我正在努力理解这一点。作为起点,如何调用这些函数?我真的可以以某种方式应用它们,输出为 1 吗? (或任何其他数字?)

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

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

我最初的尝试没有成功:

Welcome to DrScheme, version 4.1.5 [3m].
Language: Simply Scheme; memory limit: 128 megabytes.
> (add-1 (zero))
. . procedure zero: expects 1 argument, given 0
> (add-1 zero)
#<procedure>
> (add-1 1)
#<procedure>
> ((add-1 1))
. . #<procedure>: expects 1 argument, given 0
> 

【问题讨论】:

标签: scheme sicp


【解决方案1】:

这些表示数字的函数称为教会数字(如 SICP 所述)。它们的存在意味着您可以定义一个计算系统(例如 lambda 演算),而无需将数字作为一等对象——您可以将函数用作原始对象。这个事实主要是理论上的兴趣;教会数字不是实际计算的好选择。

您可以通过将 Church 数字与其他对象一起应用作为参数来查看您对 Church 数字的定义的正确性。当您将表示 n 的 Church 数字应用于函数 f 时,您会得到另一个函数,它将 f 应用于其参数 n 次,例如 f(f(f(x))) for n=3。

> (define (double x) (* 2 x))
> (zero double)
#<procedure>
> ((zero double) 1)
1
> ((zero double) 100)
100
> (define one (add-1 zero))
> ((one double) 1)
2
> ((one double) 100)
200
> (define (cons-a x) (cons 'a x))
> ((zero cons-a) '())
()
> (((add-1 one) cons-a) '(1 2 3))
(a a 1 2 3)

【讨论】:

  • Penrose 在 The Emperor's New Mind 中包含了这个,我认为这只是使用不同字体的借口。 (在书中他将“零”和“一”表示为轮廓字体中的数字)
【解决方案2】:

这是原始的 lambda 演算,它不产生数字,它完全用函数代替了数字类型。

所以,你有一个“零”函数,如果你给它打电话add-1,你不会得到1,你会得到另一个代表1的函数。关键是产生的函数符合基本算术公理,所以它们等价于自然数

【讨论】:

    【解决方案3】:
    (define (as-primitive-num church-num)
        (define (inc a) (+ a 1))
        ((church-num inc) 0))
    
    ;testing:
    (define one (add-1 zero))
    (define two (add-1 one))
    
    (display (as-primitive-num one)) (newline)
    (display (as-primitive-num two)) (newline)
    

    和输出:

    1 2

    【讨论】:

      猜你喜欢
      • 2014-11-18
      • 1970-01-01
      • 1970-01-01
      • 2012-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多