CS 565 midterm, Spring 2000. Q.1: (A,x,t) A(x) <= t (A,\x.e,t) t1 -> t2 <= t (A[x:t1],e,t2) (A,e1 e2,t) t2 <= t (A,e1,t1->t2), (A,e2,t1) (A,c,t) int <= t (A,d,t) double <= t Q.3: No. Q.4: ;; the original f (define f-orig (lambda (n) (if (< n 1) 2 (if (< (f (- n 2)) 3) (- n 2) (- (f (- n 1)) (* 2 n)))))) ;; f in CPS, and a "main" program (define f-cps (lambda (n k) (if (< n 1) (k 2) (f-cps (- n 2) (lambda (v1) (if (< v1 3) (k (- n 2)) (f-cps (- n 1) (lambda (v2) (k (- v2 (* 2 n))))))))))) (define f (lambda (n) (f-cps n (lambda (a) a)))) ;; first-order form: (define f-cps-fo (lambda (n k) (if (< n 1) (apply-cont-fo k 2) (f-cps-fo (- n 2) (cons 1 (cons n k)))))) (define f-fo (lambda (n) (f-cps-fo n '()))) (define apply-cont-fo (lambda (k x) (if (null? k) x (if (eq? (car k) 1) (if (< x 3) (apply-cont-fo (cddr k) (- (cadr k) 2)) (f-cps-fo (- (cadr k) 1) (cons 2 (cdr k)))) (apply-cont-fo (cddr k) (- x (* 2 (cadr k)))))))) ;; imperative form (define n 12) (define k '()) (define x 'dummy) (define f-cps-imp (lambda () (if (< n 1) (begin (set! x 2) (apply-cont-imp)) (begin (set! k (cons 1 (cons n k))) (set! n (- n 2)) (f-cps-imp))))) (define f-imp (lambda (nn) (set! n nn) (f-cps-imp))) (define apply-cont-imp (lambda () (if (null? k) x (if (eq? (car k) 1) (if (< x 3) (begin (set! x (- (cadr k) 2)) (set! k (cddr k)) (apply-cont-imp)) (begin (set! n (- (cadr k) 1)) (set! k (cons 2 (cdr k))) (f-cps-imp))) (begin (set! x (- x (* 2 (cadr k)))) (set! k (cddr k)) (apply-cont-imp))))))