我正在尝试在Scheme
中编写or
函数
(define or
(lambda (p q) p p q))
如果我(or #t #f)
,我会#f
。
我在做什么问题?
我在youTube的视频中看到了λpq.ppq
。
答案 0 :(得分:1)
正确的Lambda微积分定义
(define or (lambda (p q) (p p q))) ; (or p q) = {p AND p} OR {{NOT p} AND q}
(define xor (lambda (p q) (p (not q) q))) ; (xor p q) = {p AND {NOT q}} OR {{NOT p} AND q}
(define not (lambda (t) (lambda (p q) (t q p)))) ; ((not t) p q) = (t q p)
(请注意parens!)。但#t
和#f
不适用于这些。他们期待
(define true (lambda (p q) p)) ; (true p q) = p
(define false (lambda (p q) q)) ; (false p q) = q
您可以使用
进行检查((or true false) #t #f) ; #t
((xor false false) #t #f) ; #f
((xor true false) #t #f) ; #t
使用你的定义,缺少一组括号:
(define or (lambda (p q) p p q ))
; ^^ ^^
它减少为:
(or #t #f)
=
(let ([p #t] [q #f])
p
p
q )
=
(let ([p #t] [q #f])
q )
=
#f
要将p
应用于p
和q
,我们需要将表单括在括号中,如下所示:(p p q)
。没有它们,你只有三个连续的表达式,三个变量,只返回最后一个的值,就像整体结果一样。这是q
的价值。这是#f
。