(* 5. A size function on terms *) (* Can add to arith/syntax.ml *) let rec size t = match t with TmTrue(_) -> 1 | TmFalse(_) -> 1 | TmIf(_,b,t1,t2) -> size b + size t1 + size t2 + 1 | TmZero(_) -> 1 | TmSucc(_,t) -> size t + 1 | TmPred(_,t) -> size t + 1 | TmIsZero(_,t) -> size t + 1 (* 6. Pierce 4.2.2 : big-step evaluation *) (* This replaces existing eval and eval1 functions in arith/core.ml *) let rec eval t = match t with _ when isval t -> t | TmIf(_,t1,t2,t3) -> (match eval t1 with TmTrue(_) -> eval t2 | TmFalse(_) -> eval t3 | _ -> raise NoRuleApplies) | TmSucc(fi,t1) -> (match eval t1 with nv1 when isnumericval nv1 -> TmSucc(fi,nv1) | _ -> raise NoRuleApplies) | TmPred(fi,t1) -> (match eval t1 with TmZero(_) -> TmZero(dummyinfo) | TmSucc(_,nv1) when isnumericval nv1 -> nv1 | _ -> raise NoRuleApplies) | TmIsZero(_,t1) -> (match eval t1 with TmZero(_) -> TmTrue(dummyinfo) | TmSucc(_,nv1) when isnumericval nv1 -> TmFalse(dummyinfo) | _ -> raise NoRuleApplies)