(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)
...等
答案 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,我会给你一个在那里有效的答案。
考虑您是否按上述定义了true
和false
。然后编写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 book或that book。