読者です 読者をやめる 読者になる 読者になる

らむにゃー

sicp

Schemeλ計算とか。

;; Church-encoding of nat
(define zero (lambda (f) (lambda (x) x)))
(define (add-1 n)
  (lambda (f) (lambda (x) (f ((n f) x)))))
;; (add-1 zero) ->* (lambda (f) (lambda (x) (f x)))
;; (add-1 (add-1 zero)) ->* (lambda (f) (lambda (x) (f (f x))))
;; Define addtion of Church numerals
(define (add-ch n m) (lambda (f) (lambda (x) ((m f) ((n f) x)))))
;; Define multiplication of Church numerals
(define (mul-ch n m) (lambda (f) (lambda (x) ((m (n f)) x))))
;; Define exponentiation of Church numerals
(define (exp n m) (lambda (f) (lambda (x) (((m n) f) x))))

;; Truth Definition in Church encoding
(define t-ch (lambda (p) (lambda (q) p)))
(define nil-ch (lambda (p) (lambda (q) q)))
(define if-ch (lambda (p) (lambda (x) (lambda (y) ((p x) y)))))
;; Define isZero? in Church encoding
(define (isZero? n)
  (define false-constant (lambda (f) nil-ch))
  ((n false-constant) t-ch))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; Define encoding, decoding of numerals
(define (encode-num n)
  (if (= n 0) zero
      (add-1 (encode-num (- n 1)))))
(define (decode-num n)
  (define (plus-one x) (+ x 1))
  ((n plus-one) 0))

;; Define encoding, decoding truth values
(define (encode-tval p) (if p t-ch nil-ch))
(define (decode-tval p) ((p #t) #f))

;;;;;;;;;;;;; あまりにしょぼいので加筆 ;;;;;;;;;;;;;;;;;;;;;;;;;

;; Define pairing functions and car, cdr
(define cons-ch (lambda (x) (lambda (y) (lambda (f) ((f x) y)))))
(define car-ch (lambda (p) (p t-ch)))
(define cdr-ch (lambda (p) (p nil-ch)))

;; Define Predecessor function
(define (pred-ch m)
  (define zz ((cons-ch zero) zero))
  (define ss (lambda (p) ((cons-ch (cdr-ch p)) (add-1 (cdr-ch p)))))
  (car-ch ((m ss) zz)))

Churchエンコーディングの話。
簡単なことしかやってませんがお許しを。結果は以下:

gosh> (decode-num (add-ch (encode-num 3)(encode-num 5)))
> 8

gosh> (decode-tval (isZero? (encode-num 0)))
> #t

gosh> (decode-tval (isZero? (encode-num 1)))
> #f

なんか本当にクソですね、すみません、死にます。
死にゃん