let rec eval_expr_int e =
  match e.expr_val with
    | Int i -> i
    | Plus(e1, e2) -> (eval_expr_int e1) + (eval_expr_int e2)
    | Minus(e1, e2) -> (eval_expr_int e1) - (eval_expr_int e2)
    | Mult(e1, e2) -> (eval_expr_int e1) * (eval_expr_int e2)
    | Div(e1, e2) -> (eval_expr_int e1) / (eval_expr_int e2)
    | Mod(e1, e2) -> (eval_expr_int e1) mod (eval_expr_int e2)
    | Bool b -> raise (Asm_error "internal error in eval_expr_int function (trying to compute a non-integer expression)")

and eval_expr_bool e =
  match e.expr_val with
    | Bool b -> b
    | Le(e1, e2) -> (eval_expr_int e1) <= (eval_expr_int e2)