#lang racket
;;;;;;;;;
;; 2.4 ;;
;;;;;;;;;
(define (my-cons x y)
(lambda (m) (m x y)))
(define (my-car z)
(z (lambda (p q) p)))
;; Verify (my-car (my-cons x y)) returns x using the substitution model of evaluation.
;; (my-car (my-cons x y))
;; (my-car (lambda (m) (m x y)))
;; ((lambda (m) (m x y)) (lambda (p q) p))
;; ((lambda (p q) p) x y)
;; x
(define (my-cdr z)
(z (lambda (p q) q)))
(define pr (my-cons 1 2))
(my-car pr)
;; 1
(my-cdr pr)
;; 2
;;;;;;;;;
;; 2.5 ;;
;;;;;;;;;
(define (my-num-cons a b)
(* (expt 2 a) (expt 3 b)))
(define (my-num-car z)
(if (zero? (remainder z 2))
(add1 (my-num-car (/ z 2)))
0))
(define (my-num-cdr z)
(if (zero? (remainder z 3))
(add1 (my-num-cdr (/ z 3)))
0))
(define num-pr (my-num-cons 2 5))
(my-num-car num-pr)
;; 2
(my-num-cdr num-pr)
;; 5
;;;;;;;;;
;; 2.6 ;;
;;;;;;;;;
(define (my-compose f g)
(lambda (x) (f (g x))))
(define (repeated f n)
(if (= n 1)
f
(my-compose f (repeated f (sub1 n)))))
;; church numerals
(define zero (lambda (f) (lambda (x) x)))
(define (add-1 n)
(lambda (f)
(lambda (x) (f ((n f) x)))))
;; Evaluate (add-1 zero) to get a direct definition of one.
;; (add-1 zero)
;; (lambda (f) (lambda (x) (f ((zero f) x))))
;; (lambda (f) (lambda (x) (f x))) ; because (zero f) is the identity function
;; (lambda (f) f)
(define one (lambda (f) f)) ; or (lambda (f) (repeated f 1))
;; Evaluate (add-1 one) to get a direct definition of two.
;; (add-1 one)
;; (lambda (f) (lambda (x) (f ((one f) x))))
;; (lambda (f) (lambda (x) (f (f x)))) ; because (one f) is the function f
;; (lambda (f) (my-compose f f))
(define two (lambda (f) (my-compose f f))) ; or (lambda (f) (repeated f 2))
;; The church numeral n is the function of f that returns the function of x
;; that applies f to x n times. In other words n(f) is f composed with itself n
;; times. So church numeral addition should be composition of functions.
(define (church-numeral->numeral n)
((n add1) 0)) ; sends zero to 0, one to 1, two to 2, etc
(define (church-plus n m)
(lambda (f)
(repeated f (+ (church-numeral->numeral n)
(church-numeral->numeral m)))))
(church-numeral->numeral zero)
;; 0
(church-numeral->numeral one)
;; 1
(church-numeral->numeral two)
;; 2
(church-numeral->numeral (church-plus one zero))
;; 1
(church-numeral->numeral (church-plus one two))
;; 3
Comments