private static void _SimplifyIf(BoolExpr result) { if (result.IsLeaf()) { return; } if (result.Op == BoolExpr.Bop.If) { var nowy = BoolExpr.CreateOr(result.Right, BoolExpr.CreateNot(result.Left)); result.Left = nowy.Left; result.Right = nowy.Right; result.Op = nowy.Op; result.Lit = nowy.Lit; } else if (result.Op == BoolExpr.Bop.IfOnlyIf) { var nowy = BoolExpr.CreateAnd(BoolExpr.CreateIf(result.Left, result.Right), BoolExpr.CreateIf(result.Right, result.Left)); result.Left = nowy.Left; result.Right = nowy.Right; result.Op = nowy.Op; result.Lit = nowy.Lit; } if (result.Left != null) { _SimplifyIf(result.Left); } if (result.Right != null) { _SimplifyIf(result.Right); } }
public static bool Eval(BoolExpr expr, Dictionary <string, bool> fluentValues) { if (expr.IsLeaf()) { return(fluentValues[expr.Lit]); } if (expr.Op == BoolExpr.Bop.Not) { return(!Eval(expr.Left, fluentValues)); } if (expr.Op == BoolExpr.Bop.Or) { return(Eval(expr.Left, fluentValues) || Eval(expr.Right, fluentValues)); } if (expr.Op == BoolExpr.Bop.And) { return(Eval(expr.Left, fluentValues) && Eval(expr.Right, fluentValues)); } if (expr.Op == BoolExpr.Bop.If) { return(!Eval(expr.Left, fluentValues) || Eval(expr.Right, fluentValues)); } if (expr.Op == BoolExpr.Bop.IfOnlyIf) { return((!Eval(expr.Left, fluentValues) || Eval(expr.Right, fluentValues)) && (Eval(expr.Left, fluentValues) || !Eval(expr.Right, fluentValues))); } throw new ArgumentException(); }
static string _strings(BoolExpr expr, BoolExpr parent, List <string> tokens) { if (expr.IsLeaf()) { if (parent != null && parent.Op == BoolExpr.Bop.Or) { tokens.Add(expr.Lit); return(""); } return(expr.Lit); } if (expr.Op == BoolExpr.Bop.Not) { if (parent != null && parent.Op == BoolExpr.Bop.And) { return("not_" + expr.Left.Lit); } tokens.Add("not_" + expr.Left.Lit); return(""); } if (expr.Op == BoolExpr.Bop.And) { if (parent != null && parent.Op == BoolExpr.Bop.Or) { tokens.Add(_strings(expr.Left, expr, tokens) + "&" + _strings(expr.Right, expr, tokens)); } else if (parent != null && parent.Op == BoolExpr.Bop.And) { return(_strings(expr.Left, expr, tokens) + "&" + _strings(expr.Right, expr, tokens)); } else if (parent == null) { tokens.Add(_strings(expr.Left, expr, tokens) + "&" + _strings(expr.Right, expr, tokens)); } } if (expr.Left != null) { _strings(expr.Left, expr, tokens); } if (expr.Right != null) { _strings(expr.Right, expr, tokens); } return(""); }
static void TraverseTree(BoolExpr expr, BoolExpr parent, List <string> tokens) { if (expr.IsLeaf()) { if (parent != null && parent.Op == BoolExpr.Bop.Not) { tokens.Add("!" + expr.Lit); } else { tokens.Add(expr.Lit); } return; } if (expr.Left != null) { TraverseTree(expr.Left, expr, tokens); } if (expr.Right != null) { TraverseTree(expr.Right, expr, tokens); } }