# CS231 Types and Programming Languages Homework 3
## Problem 4
### a.
```
Given: function x: T1 -> if x then 0 else 1
Let T1 = Bool and T2 = Int
Typing Derivation:
----------------T-Var --------------T-TRUE -------------T-FALSE
G, x: Bool |- x: Bool G, x: Bool |- 0: Int G, x: Bool |- 1: Int
--------------------------------------------T-IF
G, x: Bool |- if x then 0 else 1: Int
--------------------------------------------T-FUN
G |- function x: Bool -> if x then 0 else 1 : Int
```
### b.
```
Given: function f: T1 -> if (f 0) then 0 else 1
Let T1 = function and T2 = Int
Typing Derivation:
-------------------T-Var
G, x: function |- 0: Int
--------------------------------------------T-App
G, x: function |- if 0 then 0 else 1
-----------------------------------------------T-FUN
G |- function f: function -> if (f 0) then 0 else 1
```
### c.
```
Given: function f: T1 -> function x: T2 -> if (f x) then (x 0) else 1
Let T1 = function and T2 = function
Typing Derivation:
??
-------------------------------------------T-App
G, f: function |- if (f x) then (x 0) else 1
----------------------------------------------T-App
G, f: function |- function x: function -> if (f x) then (x 0) else 1
-----------------------------------------------T-FUN
G |- function f: function -> function x: function -> if (f x) then (x 0) else 1
```
## 5
```
(* Problem 5 *)
(* T ::= Bool | T -> T *)
type typ = Bool | Arrow of typ * typ
(* t ::= x | function x:T -> t | t1 t2 *)
type t = True | Var of string | Function of string * typ * t
| FunCall of t * t
(* env is a **type alias** for a list of (string,typ) pairs
env is not a new type, like t above,
but rather just a name for an existing type.
a list of pairs is sometimes called an *association* list.
OCaml already has some useful operations for manipulating such lists.
In particular, the function List.assoc (in the List standard library)
looks up the value associated with a given key in a given association
list. e.g., List.assoc "y" [("x", Bool); ("y", Arrow(Bool,Bool))]
returns Arrow(Bool,Bool). List.assoc raises a Not_found exception
if the given key is not in the list.
*)
type env = (string * typ) list
exception TypeError
(* typecheck takes a term (of type t) and a type environment (of type env)
and it returns the type of the term, or raises TypeError if the term
cannot be given a type. this function should have the same behavior
as the typechecking rules on the cheat sheet. *)
let rec typecheck (t:t) (env:env) : typ = raise TypeError
```
## Problem 6
### Part a.
**Theorem:** If null |- t: T, then either t is a value or there exists some term t' such that t -> t'.
We will prove by induction on typing derivation.