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); } }
static BoolExpr Make(ref List <Token> .Enumerator polishNotationTokensEnumerator) { if (polishNotationTokensEnumerator.Current == null) { throw new ArgumentNullException(); } if (polishNotationTokensEnumerator.Current.Type == Token.TokenType.Literal) { var lit = BoolExpr.CreateBoolVar(polishNotationTokensEnumerator.Current.Value); polishNotationTokensEnumerator.MoveNext(); return(lit); } switch (polishNotationTokensEnumerator.Current.Value) { case "NOT": { polishNotationTokensEnumerator.MoveNext(); var operand = Make(ref polishNotationTokensEnumerator); return(BoolExpr.CreateNot(operand)); } case "AND": { polishNotationTokensEnumerator.MoveNext(); var left = Make(ref polishNotationTokensEnumerator); var right = Make(ref polishNotationTokensEnumerator); return(BoolExpr.CreateAnd(left, right)); } case "OR": { polishNotationTokensEnumerator.MoveNext(); var left = Make(ref polishNotationTokensEnumerator); var right = Make(ref polishNotationTokensEnumerator); return(BoolExpr.CreateOr(left, right)); } case "IF": { polishNotationTokensEnumerator.MoveNext(); var left = Make(ref polishNotationTokensEnumerator); var right = Make(ref polishNotationTokensEnumerator); return(BoolExpr.CreateIf(left, right)); } case "IFONLYIF": { polishNotationTokensEnumerator.MoveNext(); var left = Make(ref polishNotationTokensEnumerator); var right = Make(ref polishNotationTokensEnumerator); return(BoolExpr.CreateIfOnlyIf(left, right)); } } return(null); }