Derive constraints and annotations for the following program: (lambda (f) (lambda (x) (lambda (y) (cons x (f (f y)))))) ------------- Solution ---------------------- [1] (lambda (f) [2] (lambda (x) [3] (lambda (y) [4] (cons x [5] (f [6] (f y)))))) Constraints: [1] = [f] -> [2] from 1 ------------------- [2] = [x] -> [3] from 2 ------------------- [3] = [y] -> [4] from 3 ------------------- [4] = list[alpha] from 4 [x] = alpha [5] = list[alpha] ------------------- [f] = [6] -> [5] from 5 ------------------- [f] = [y] -> [6] from 6 Inferred types (written as annotations) (lambda (f : t1) t2 (lambda (x : t3) t4 (lambda (y : t5) t6 (cons x (f (f y)))))) where t1 = list[alpha] -> list[alpha] t2 = alpha -> (list[alpha] -> list[alpha]) t3 = alpha t4 = list[alpha] -> list[alpha] t5 = list[alpha] t6 = list[alpha]