方案行为不端的`或`功能

时间:2018-04-29 05:30:17

标签: scheme lambda-calculus

我正在尝试在Scheme

中编写or函数
(define or
  (lambda (p q) p p q))

如果我(or #t #f),我会#f

我在做什么问题?

我在youTube的视频中看到了λpq.ppq

1 个答案:

答案 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应用于pq,我们需要将表单括在括号中,如下所示:(p p q)。没有它们,你只有三个连续的表达式,三个变量,只返回最后一个的值,就像整体结果一样。这是q的价值。这是#f