Правильные определения лямбда-исчисления:
(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)
(обратите внимание на паренов!). Но #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
.