module LogicAndCodes1; data BoolExpr = Var(Int) | Not(BoolExpr) | And(BoolExpr, BoolExpr) | Or(BoolExpr, BoolExpr); exception Not_found; def Bool assoc(Int k, List> l) = case l { Nil => False; // Should be BOTTOM, e.g. throw Not_found; Cons(x,xs) => case x { Pair(a,b) => if a==k then b else assoc(k,xs); }; }; def List aux(List acc, List l) = case l { Nil => acc; Cons(h, t) => aux(Cons(h,acc), t); }; def List rev(List list) = aux(Nil, list); def List concat(List l1, List l2) = case l1 { Nil => l2; Cons(x,xs) => Cons(x, concat(xs, l2)); }; def Bool eval(List> valVars, BoolExpr e) = case e { Var(x) => assoc(x,valVars); Not(e) => not(eval(valVars, e)); And(e1,e2) => eval(valVars, e1) && eval(valVars, e2); Or(e1,e2) => eval(valVars,e1) || eval(valVars, e2); }; def List>,Bool>> tableMake(List> valVars, List vars, BoolExpr expr) = case vars { Nil => Cons(Pair(rev(valVars), eval(valVars, expr)), Nil); Cons(v,tl) => concat(tableMake(Cons(Pair(v, True), valVars), tl, expr), tableMake(Cons(Pair(v,False),valVars), tl, expr)); }; def List>,Bool>> start(List> valVars, List vars, BoolExpr expr) = tableMake(valVars, vars, expr); { }