open Format open Syntax open Support.Error open Support.Pervasive (* ------------------------ EVALUATION ------------------------ *) exception NoRuleApplies let rec isnumericval t = match t with TmZero(_) -> true | TmSucc(_,t1) -> isnumericval t1 | _ -> false let rec isval t = match t with TmTrue(_) -> true | TmFalse(_) -> true | t when isnumericval t -> true | _ -> false 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)