【问题标题】:Boolean values in SchemeScheme 中的布尔值
【发布时间】:2019-07-31 23:36:14
【问题描述】:
(define true (lambda (x y) x))

(define false (lambda (x y) y))

所以(true 1 2) 会给出 1,而(false 1 2) 会给出 2。

基于此,我应该如何编写一个 (not true) 过程,它会给出 false 和 (not false) 会给我一个 true 使用 lambda 表达式。 (尽可能简单。)

(define not p) ...等

【问题讨论】:

  • (define not (lambda (b) (lambda (x y) (b y x))))
  • 或:(define not (lambda (b) (b false true)))

标签: scheme racket


【解决方案1】:

所以,@PetSerAl 绝对正确,正确答案(如果我们正在寻找 lambda-calculus-esque 解决方案)是:

(define not
  (lambda (b)
    (lambda (x y) (b y x))))

因此:((not true) 1 2) 给出 2((not false) 1 2) 给出 1

但是由于您没有在问题中指定 lambda 演算,而是同时标记了 Racket 和 Scheme,所以我会给您一个在那里有效的答案。

考虑您是否有如上定义的truefalse。那么写not就这么简单:

(define not
  (lambda (x)
    (cond [(equal? x true) false]
          [(equal? x false) true]
          [else (error "Value is not true or false")])))

这与上面列出的语义相同:((not true) 1 2) 给出2((not false) 1 2) 给出1。但它还有一个额外的好处,即您实际上可以直接检查它以查看值,而不仅仅是将其应用于另一个过程。例如:

> (not true)
#<procedure false>
> (not false)
#<procedure true>

你现在甚至可以使用equal?(或者真的是eq?),而在此之前,如果你尝试这样做,你总是会得到#f

> (equal? (not true) false)
#t
> (equal? (not true) true)
#f
> (equal? (not false) true)
#t
> (equal? (not false) false)
#f

这引发了关于 PL 理论的完整讨论,即关于 lambda 演算可以决定什么和不能决定什么。我将在这里省略。但如果您有兴趣,我建议您查看this book,或that book

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-13
    • 2011-01-29
    • 2017-04-08
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    • 2021-02-15
    • 2019-03-08
    相关资源
    最近更新 更多