`или` функция в схеме плохо себя ведет - PullRequest
0 голосов
/ 29 апреля 2018

Я пытаюсь написать or функцию на схеме

(define or
  (lambda (p q) p p q))

Если я сделаю (or #t #f), я получу #f.

В чем проблема в том, что я делаю?

Я видел λpq.ppq в видео на YouTube.

1 Ответ

0 голосов
/ 29 апреля 2018

Правильные определения лямбда-исчисления:

(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.

...