예제 #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);
     }
 }
예제 #2
0
        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();
        }
예제 #3
0
        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("");
        }
예제 #4
0
 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);
     }
 }