module LogicAndCodes2; data BoolExpr = Var(Int) | Not(BoolExpr) | And(BoolExpr, BoolExpr) | Or(BoolExpr, BoolExpr); exception Invalid; def Bool eval2(Int a, Bool valA, Int b, Bool valB, BoolExpr expr) = case expr { Var(x) => if x == a then valA else if x==b then valB else False; // should be BOTTOM: throw Invalid; Not(e) => not(eval2(a, valA, b, valB, e)); And(e1, e2) => eval2(a, valA, b, valB , e1) && eval2(a, valA, b, valB, e2); Or(e1,e2) => eval2(a,valA,b,valB, e1) || eval2(a,valA, b, valB, e2); }; def Bool start(Int a, Bool valA, Int b, Bool valB, BoolExpr expr) = eval2(a,valA,b,valB, expr); { }