あどけない話

インターネットに関する技術的な話など

Scheme でλ計算

Wikipedia のラムダ計算にある例を Scheme で実行して理解してみます。

TRUE と FALSE

TRUE と FALSE は簡単です。

;; TRUE := λx y. x
(define TRUE (lambda (x y) x))
;; FALSE := λx y. y
(define FALSE (lambda (x y) y))

AND、OR、NOT

難しいのは、本体に x y z のように複数の変数が出てきたときです。これは、Scheme でいうと (x y z) という関数呼び出しのことらしいです。という訳で、AND、OR、NOT が定義できます。

;; AND := λp q. p q FALSE
(define AND (lambda (p q) (p q FALSE)))
;;; OR := λp q. p TRUE q
(define OR (lambda (p q) (p TRUE q)))
;; NOT := λp. p FALSE TRUE
(define NOT (lambda (p) (p FALSE TRUE)))

うまく動くか実験してみましょう。

(AND TRUE FALSE) ;; => FALSE
(AND TRUE TRUE) ;; => TRUE
(NOT TRUE) ;; => FALSE

IFTHENELSE

ここまでできれば、IFTHENELSE は簡単でした。

;; IFTHENELSE := λp x y. p x y
(define IFTHENELSE (lambda (p x y) (p x y)))
(IFTHENELSE TRUE 'THEN 'ELSE) => 'THEN
(IFTHENELSE FALSE 'THEN 'ELSE) => 'ELSE

CAR、CDR、CONS

さて、次の問題は CONS です。2つしか引数を取らないはずなのに、3つ取るようになっています。試行錯誤の上、こうしてみました。

;; CONS := λf s b. b f s
(define CONS (lambda (f s) (lambda (b) (b f s))))
;; CAR := λp. p TRUE
(define CAR (lambda (p) (p TRUE)))
;; CDR := λp. p FALSE 
(define CDR (lambda (p) (p FALSE)))

試してみると、うまくいきます。

(CAR (CONS 'A 'B)) ;; => 'A
(CDR (CONS 'A 'B)) ;; => 'B

ふぅ

疲れたので、今日はここまで。