TAPL

TAPL(Types and Programming Languages)の課題を適当に実装する。

type Term =
    | TmTrue
    | TmFalse
    | TmZero
    | TmIsZero of Term
    | TmIf of Term * Term * Term
    | TmSucc of Term
    | TmPred of Term
    | TmNot of Term

let rec Eval t =
    match t with
        | TmTrue -> TmTrue
        | TmFalse -> TmFalse
        | TmZero -> TmZero
        | TmIf(TmTrue,t2,t3) -> t2
        | TmIf(TmFalse,t2,t3) -> t3
        | TmPred(TmZero) -> TmZero
        | TmSucc(TmZero) -> TmSucc(TmZero)
        | TmSucc(TmPred(t1)) -> t1
        | TmIf(t1,t2,t3)
            -> let t1' = Eval t1
               Eval (TmIf(t1',t2,t3))
        | TmNot(TmTrue) -> TmFalse
        | TmNot(TmFalse) -> TmTrue
        | TmNot(t1)
            -> let t1' = Eval t1
               Eval (TmNot(t1'))