type variable = string type p_exp = Main of variable * variable * c_exp (* def main with input x output y as c *) and c_exp = Skip | Assignment of variable * a_exp (* x := a *) | Sequence of c_exp * c_exp (* c; c *) | If of b_exp * c_exp * c_exp (* if b then c else c *) | While of b_exp * c_exp (* while b do c *) and b_exp = Boolean of bool (* v *) | BAnd of b_exp * b_exp (* b and b *) | BNot of b_exp (* not b *) | BCmpLess of a_exp * a_exp (* a < a *) and a_exp = Variable of variable (* x *) | Integer of int (* n *) | Plus of a_exp * a_exp (* a + a *) | Minus of a_exp * a_exp (* a - a *) | Times of a_exp * a_exp (* a * a *) module VariableMap : Map.S with type key = variable type memory = { assignments: int VariableMap.t } exception AbsentAssignment of string val reduce : int -> p_exp -> int