UNB/ CS/ David Bremner/ teaching/ cs3613/ lectures/ examples/ racket/ rectypeex.rkt
#lang plai

(require "trcfae-t.rkt")

(define fib-type
  (arrowTE (numTE) (numTE)))

(define fib-lambda
  (fun 'n (numTE)
       (if0 (id 'n)
            (num 1)
            (if0 (sub (id 'n) (num 1))
                 (num 1)
                 (add (app (id 'fib)
                           (sub (id 'n) (num 1)))
                      (app (id 'fib)
                           (sub (id 'n) (num 2))))))))


(define fib-ex
  (rec 'fib
       fib-type
       fib-lambda
       (app (id 'fib) (num 5))))


(test (typecheck fib-ex (mtEnv)) (numT))

%