第一回
「四則演算インタープリタをつくりましょう」

まずは、既にオートマトンの授業で似たようなことやったかもしれませんが、
四則演算のインタープリタを作ります!

インタープリタを作るとなると字句解析や構文解析なんてものが最初にあるのですが、
それはおいおいlex, yaccを使って作ります。

今回作るプログラムは 「項(プログラム)を入力すると、値を返す」という関数だけです。
ここで、入力プログラムは以下のような構文木になっているものとします。

type expr_t = Number of int
                  | Plus of expr_t * expr_t
                  | Minus of expr_t * expr_t
                  | Times of expr_t * expr_t
                  | Divide of expr_t * expr_t
                  | Mod of expr_t * expr_t
                  | Bool of bool
                  | And of expr_t * expr_t
                  | Or of expr_t * expr_t
                  | Not of expr_t

で、値とは以下のようなもの(数値か論理値)とします。

    type value_t = VNumber of int | VBool of bool

例えば、3 + 4 * (5 - 2) は
    Plus (Number 3, Times (Number 4, Minus (Number 5, Number 2)))
と表現され、これをインタプリタに入力すると
    VNumber 15
を返すようにします。

また、論理式 true or not false and true は
    Or (Bool true, And (Not (Bool false), Bool true))
となり、これをインタプリタに入力すると
    VBool true
を返すようにします。

要するに、expr_t -> value_t 型の、
四則演算(と、ついでにブール演算)をやってくれる関数を作ってね!
てことです。

というわけで、以下の問題をやってください。

問題
1. expr_t 型の式を受け取ったら、value_t 型の値を返す関数 eval を作れ。
いくつかの入力に対して計算できていることを確かめよ。

2. この言語の型の安全性について考察せよ。