type boolexpr = True | False | And of boolexpr * boolexpr | Or of boolexpr * boolexpr | Implies of boolexpr * boolexpr | Not of boolexpr ;; exception Bug;; let rec eval exp = match exp with True -> True | False -> False | Not(exp0) -> (match eval exp0 with True -> False | False -> True | _ -> raise Bug) | And(exp0,exp1) -> (match (eval exp0, eval exp1) with (True,True) -> True | (_,False) -> False | (False,_) -> False | _ -> raise Bug) | Or(exp0,exp1) -> (match (eval exp0, eval exp1) with (False,False) -> False | (_,True) -> True | (True,_) -> True | _ -> raise Bug) | Implies(exp0,exp1) -> (match (eval exp0, eval exp1) with (False,_) -> True | (True,True) -> True | (True,False) -> False | _ -> raise Bug) ;; (* examples *) eval(And((Not False),(Not False)));; eval(Or(And((Not False),(Not False)),False));;