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))))))

