type expr = Const of int
       | Add of expr * expr
       | Mul of expr * expr


let rec eval : expr -> int =
          fun (e : expr) =>
            match e with
              | Const(i) => i
              | Add(u,v) => plus (eval u) (eval v)
              | Mul(u,v) => times (eval u) (eval v)
            end


type binop = Add'
       | Mul'


type expr' = Const' of int
       | BinOp' of binop * expr' * expr'


let rec convert : expr' -> expr =
          fun (e : expr') =>
            match e with
              | Const'(i) => Const(i)
              | BinOp'(op,u,v) =>
                match op with
                  | Add' => Add(convert u,convert v)
                  | Mul' => Mul(convert u,convert v)
                end
            end


let ornament convert : expr' -> expr
  

let rec eval' : expr' -> int =
          fun (e : expr') =>
            match e with
              | Const'(i) => i
              | BinOp'(op,u,v) =>
                match op with
                  | Add' => plus (eval' u) (eval' v)
                  | Mul' => times (eval' u) (eval' v)
                end
            end