Scheme中的布尔值

时间:2017-03-11 03:51:09

标签: scheme racket

(define true (lambda (x y) x))

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

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

基于此,我应该如何编写一个(not true)过程给出错误,(not false)将给我一个真正的使用lambda表达式。 (尽我所能。)

(define not p) ...等

1 个答案:

答案 0 :(得分:1)

所以,对于这个问题的正确答案(如果我们正在寻找一个lambda-calculus-esque解决方案),@ PerSerAl是完全正确的:

(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

QDir

这导致对PL理论的全面讨论,关于用lambda演算可以和不可以决定什么。我会在这里消失。但如果您有兴趣,我建议您查看this bookthat book