Example #1
0
 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);
     }
 }
Example #2
0
        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);
        }