예제 #1
0
        public void MSO_Succ_Z3A()
        {
            var z3Context = new Context();
            var S         = z3Context.IntSort;
            var solver    = new Z3BoolAlg(z3Context, S);
            Func <int, BoolExpr> IsPos = (i => z3Context.MkEq(solver.x, z3Context.MkInt(i)));
            var x      = new Variable("x", true);
            var y      = new Variable("y", true);
            var x_is_0 = new MSOPredicate <BoolExpr>(IsPos(0), x);
            var y_is_1 = new MSOPredicate <BoolExpr>(IsPos(1), y);
            //every 0 is immediately followed by a 1
            MSOFormula <BoolExpr> phi = Forall(x, Implies(x_is_0, Exists(y, And(Succ(x, y), y_is_1))));

            //var ca = new CartesianAlgebraBDD<BoolExpr>(solver);
            var aut = phi.GetAutomaton(solver);
            //aut.ShowGraph();
            //Automaton<BoolExpr> aut1 = Automaton<BoolExpr>.ProjectSecond<BDD>(aut);

            var expected_automaton = Automaton <BoolExpr> .Create(solver, 0, new int[] { 0 },
                                                                  new Move <BoolExpr>[] {
                Move <BoolExpr> .Create(0, 0, z3Context.MkNot(IsPos(0))),
                Move <BoolExpr> .Create(0, 1, IsPos(0)),
                Move <BoolExpr> .Create(1, 0, IsPos(1))
            });

            bool equiv = aut.IsEquivalentWith(expected_automaton);
            //Assert.IsTrue(equiv, "the automata must be equivalent");
        }
예제 #2
0
        public void BooleanAlgebraZ3_test2()
        {
            var ctx         = new Context();
            var sort        = ctx.IntSort;
            var solver      = new Z3BoolAlg(ctx, sort);
            var alg         = new BDDAlgebra <BoolExpr>(solver);
            var x           = new Variable("x", true);
            var y           = new Variable("y", true);
            var z           = new Variable("z", true);
            var xLTy        = new MSOLt <BoolExpr>(x, y);
            var xLTzLTy     = new MSOAnd <BoolExpr>((new MSOLt <BoolExpr>(x, z)), (new MSOLt <BoolExpr>(z, y)));
            var Ez          = new MSOExists <BoolExpr>(z, xLTzLTy);
            var notEz       = new MSONot <BoolExpr>(Ez);
            var xSyDef      = new MSOAnd <BoolExpr>(xLTy, notEz);
            var aut_xSyDef  = xSyDef.GetAutomaton(alg);
            var aut_xLTzLTy = xLTzLTy.GetAutomaton(alg);
            var aut_Ez      = Ez.GetAutomaton(alg);
            var aut_notEz   = notEz.GetAutomaton(alg);
            var aut_xLTy    = xLTy.GetAutomaton(alg);

            //aut_xSyDef.ShowGraph("aut_xSyDEf");
            //aut_xLTzLTy.ShowGraph("aut_xLTzLTy");
            //aut_Ez.ShowGraph("aut_Ez");
            //aut_notEz.ShowGraph("aut_notEz");

            var xSyPrim     = new MSOSuccN <BoolExpr>(x, y, 1);
            var aut_xSyPrim = xSyPrim.GetAutomaton(alg);
            var equiv       = aut_xSyPrim.IsEquivalentWith(aut_xSyDef);

            Assert.IsTrue(equiv);
        }
예제 #3
0
        public void BooleanAlgebraZ3_test2()
        {
            var ctx         = new Context();
            var sort        = ctx.IntSort;
            var solver      = new Z3BoolAlg(ctx, sort);
            var alg         = new BDDAlgebra <BoolExpr>(solver);
            var x           = new WS1SVariable <BoolExpr>("x");
            var y           = new WS1SVariable <BoolExpr>("y");
            var z           = new WS1SVariable <BoolExpr>("z");
            var xLTy        = x < y;
            var xLTzLTy     = (x < z) & (z < y);
            var Ez          = new WS1SExists <BoolExpr>(z, xLTzLTy);
            var notEz       = new WS1SNot <BoolExpr>(Ez);
            var xSyDef      = new WS1SAnd <BoolExpr>(xLTy, notEz);
            var aut_xSyDef  = xSyDef.GetAutomaton(alg, x, y);
            var aut_xLTzLTy = xLTzLTy.GetAutomaton(alg, x, y, z);
            var aut_Ez      = Ez.GetAutomaton(alg, x, y);
            var aut_notEz   = notEz.GetAutomaton(alg, x, y);
            var aut_xLTy    = xLTy.GetAutomaton(alg, x, y);

            //aut_xSyDef.ShowGraph("aut_xSyDEf");
            //aut_xLTzLTy.ShowGraph("aut_xLTzLTy");
            //aut_Ez.ShowGraph("aut_Ez");
            //aut_notEz.ShowGraph("aut_notEz");

            var xSyPrim     = new WS1SSuccN <BoolExpr>(x, y, 1);
            var aut_xSyPrim = xSyPrim.GetAutomaton(alg, x, y);
            var equiv       = aut_xSyPrim.IsEquivalentWith(aut_xSyDef, alg);

            Assert.IsTrue(equiv);
        }
예제 #4
0
 public void BooleanAlgebraZ3_test1()
 {
     var ctx    = new Context();
     var sort   = ctx.IntSort;
     var solver = new Z3BoolAlg(ctx, sort);
     var alg    = new BDDAlgebra <BoolExpr>(solver);
     var x      = new Variable("x", true);
     var pred   = new MSOPredicate <BoolExpr>(ctx.MkEq(solver.x, ctx.MkNumeral(42, sort)), x);
     MSOFormula <BoolExpr> phi = new MSOExists <BoolExpr>(x, pred);
     var pred_aut = pred.GetAutomaton(alg);
     //pred_aut.ShowGraph("pred_aut");
 }
예제 #5
0
        public void Minimize_NFA_Z3A()
        {
            var z3Context = new Context();
            var S         = z3Context.IntSort;
            var solver    = new Z3BoolAlg(z3Context, S);
            var a         = z3Context.MkEq(solver.x, z3Context.MkNumeral(0, S));
            var b         = z3Context.MkNot(a);

            var sfa = Automaton <BoolExpr> .Create(solver, 0, new int[] { 3, 4, 5 },
                                                   new Move <BoolExpr>[] {
                Move <BoolExpr> .Create(0, 1, a),
                Move <BoolExpr> .Create(0, 2, b),
                Move <BoolExpr> .Create(1, 4, a),
                Move <BoolExpr> .Create(1, 5, a), //<-- nondeterminism
                Move <BoolExpr> .Create(1, 3, b),
                Move <BoolExpr> .Create(2, 4, b),
                Move <BoolExpr> .Create(2, 5, a),
                //Move<BoolExpr>.Create(3, 6, a),
                Move <BoolExpr> .Create(3, 4, b),
                //Move<BoolExpr>.Create(4, 6, a),
                Move <BoolExpr> .Create(4, 3, b),
                Move <BoolExpr> .Create(5, 5, a),
                //Move<BoolExpr>.Create(5, 6, b),
                //Move<BoolExpr>.Create(6, 6, solver.True)
            });

            var sfa_min = sfa.Minimize();

            var sfa_det = sfa_min.Determinize();

            var sfa_det_min = sfa_det.Minimize();

            bool equiv1 = sfa.IsEquivalentWith(sfa_min);
            bool equiv2 = sfa.IsEquivalentWith(sfa_det);


            Assert.IsTrue(equiv1);
            Assert.IsTrue(equiv2);

            //pretend that sfa is deterministic
            sfa.isDeterministic = true;

            //only the smaller half of a split set is pushed
            var sfa_min2 = sfa.Minimize();

            //the result is incorrect
            bool equiv3 = sfa_min.IsEquivalentWith(sfa_min2);

            Assert.IsFalse(equiv3);
        }
예제 #6
0
        public void MSO_Succ_Z3A()
        {
            var z3Context = new Context();
            var S         = z3Context.IntSort;
            var solver    = new Z3BoolAlg(z3Context, S);
            Func <int, BoolExpr> IsInt = (i => z3Context.MkEq(solver.x, z3Context.MkInt(i)));
            var x_is_0 = new MSOPredicate <BoolExpr>(IsInt(0), "x");
            var y_is_1 = new MSOPredicate <BoolExpr>(IsInt(1), "y");
            //every 0 is immediately followed by a 1
            MSOFormula <BoolExpr> phi = Forall("x", Implies(x_is_0, Exists("y", And(Succ("x", "y"), y_is_1))));

            var aut = phi.GetAutomaton(solver);

            var expected_automaton = Automaton <BoolExpr> .Create(solver, 0, new int[] { 0 },
                                                                  new Move <BoolExpr>[] {
                Move <BoolExpr> .Create(0, 0, z3Context.MkNot(IsInt(0))),
                Move <BoolExpr> .Create(0, 1, IsInt(0)),
                Move <BoolExpr> .Create(1, 0, IsInt(1))
            });

            bool equiv = aut.IsEquivalentWith(expected_automaton, solver);

            Assert.IsTrue(equiv, "the automata must be equivalent");
        }
예제 #7
0
        public static void Run()
        {
            using (System.IO.StreamWriter file =
               new System.IO.StreamWriter(@"randomMSOInt.csv", false))
            {
                Console.WriteLine("num-predicates, num-minterms, minterm-time, generic-bdd, product ");
                file.WriteLine("num-predicates, num-minterms, minterm-time, generic-bdd, product ");
            }
            random = new Random(0);

            currSeed = 0;

            for (int maxConst = 3; maxConst < 4; maxConst++)
                for (int phisize = 5; phisize < 8; phisize += 1)
                {
                    //Console.WriteLine(maxConst + "," + phisize);

                    for (int i = 0; i < howMany; i++)
                    {
                        c = new Context();
                        z3 = new Z3BoolAlg(c, c.IntSort, timeout);
                        size = phisize;
                        try
                        {
                            var pair = GenerateMSOZ3Formula();

                        if (maxConst == 4 && phisize > 5)
                            break;

                            formula = pair.First;
                            predicates = pair.Second;
                            if (predicates.Count > 2)
                            {
                                var bddsolver = new BDDAlgebra<BoolExpr>(z3);
                                var sw = new Stopwatch();
                                sw.Restart();

                                long tbdd = timeout;

                                try
                                {
                                    formula.GetAutomaton(bddsolver, false);
                                    sw.Stop();
                                    tbdd = sw.ElapsedMilliseconds;
                                    if (tbdd > timeout)
                                        tbdd = timeout;
                                }
                                catch (Z3Exception e)
                                {
                                    tbdd = timeout;
                                }
                                catch (AutomataException e)
                                {
                                    tbdd = timeout;
                                }

                                if (tbdd != timeout)
                                {
                                    long tcart = timeout;
                                    try
                                    {
                                        var bdd = new BDDAlgebra();
                                        solver = new CartesianAlgebraBDD<BoolExpr>(bdd, z3);
                                        sw.Restart();
                                        formula.GetAutomaton(solver);
                                        sw.Stop();
                                        tcart = sw.ElapsedMilliseconds;
                                        if (tcart > timeout)
                                            tcart = timeout;
                                    }
                                    catch (Z3Exception e)
                                    {
                                        tcart = timeout;
                                    }
                                    catch (AutomataException e)
                                    {
                                        tcart = timeout;
                                    }

                                    sw.Restart();
                                    long tminterm = timeout;
                                    List<Pair<bool[], BoolExpr>> mint = new List<Pair<bool[], BoolExpr>>();
                                    try
                                    {
                                        mint = z3.GenerateMinterms(predicates.ToArray()).ToList();
                                        sw.Stop();
                                        tminterm = sw.ElapsedMilliseconds;
                                        if (tminterm > timeout)
                                            tminterm = timeout;
                                    }
                                    catch (Z3Exception e)
                                    {

                                        tminterm = timeout;

                                    }
                                    using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"randomMSOInt.csv", true))
                                    {
                                        Console.WriteLine(predicates.Count + ", " + (tminterm == timeout ? (int)Math.Pow(2, predicates.Count) : mint.Count) + ",  " + (double)tminterm + ", " + (double)tbdd + ", " + (double)tcart);
                                        file.WriteLine(predicates.Count + ", " + (tminterm == timeout ? (int)Math.Pow(2, predicates.Count) : mint.Count) + ", " + (double)tminterm + ", " + (double)tbdd + ", " + (double)tcart);
                                    }
                                }
                                else {
                                    //Console.WriteLine("moving to next one");

                                }
                            }
                            else
                            {
                               // Console.WriteLine("moving to next one");

                            }
                        }
                        catch (Z3Exception e)
                        {
                            Console.WriteLine("Z3 out of memory");
                            return;

                        }
                        catch (OutOfMemoryException e)
                        {
                            Console.WriteLine("Out of memory");
                            return;

                        }
                    }
                }
        }
예제 #8
0
        public static void Run()
        {
            using (System.IO.StreamWriter file =
                       new System.IO.StreamWriter(@"randomMSOInt.csv", false))
            {
                Console.WriteLine("num-predicates, num-minterms, minterm-time, generic-bdd, product ");
                file.WriteLine("num-predicates, num-minterms, minterm-time, generic-bdd, product ");
            }
            random = new Random(0);

            currSeed = 0;


            for (int maxConst = 3; maxConst < 4; maxConst++)
            {
                for (int phisize = 5; phisize < 8; phisize += 1)
                {
                    //Console.WriteLine(maxConst + "," + phisize);


                    for (int i = 0; i < howMany; i++)
                    {
                        c    = new Context();
                        z3   = new Z3BoolAlg(c, c.IntSort, timeout);
                        size = phisize;
                        try
                        {
                            var pair = GenerateMSOZ3Formula();

                            if (maxConst == 4 && phisize > 5)
                            {
                                break;
                            }



                            formula    = pair.First;
                            predicates = pair.Second;
                            if (predicates.Count > 2)
                            {
                                var bddsolver = new BDDAlgebra <BoolExpr>(z3);
                                var sw        = new Stopwatch();
                                sw.Restart();

                                long tbdd = timeout;

                                try
                                {
                                    formula.GetAutomaton(bddsolver, false);
                                    sw.Stop();
                                    tbdd = sw.ElapsedMilliseconds;
                                    if (tbdd > timeout)
                                    {
                                        tbdd = timeout;
                                    }
                                }
                                catch (Z3Exception e)
                                {
                                    tbdd = timeout;
                                }
                                catch (AutomataException e)
                                {
                                    tbdd = timeout;
                                }



                                if (tbdd != timeout)
                                {
                                    long tcart = timeout;
                                    try
                                    {
                                        var bdd = new BDDAlgebra();
                                        solver = new CartesianAlgebraBDD <BoolExpr>(bdd, z3);
                                        sw.Restart();
                                        formula.GetAutomaton(solver);
                                        sw.Stop();
                                        tcart = sw.ElapsedMilliseconds;
                                        if (tcart > timeout)
                                        {
                                            tcart = timeout;
                                        }
                                    }
                                    catch (Z3Exception e)
                                    {
                                        tcart = timeout;
                                    }
                                    catch (AutomataException e)
                                    {
                                        tcart = timeout;
                                    }

                                    sw.Restart();
                                    long tminterm = timeout;
                                    List <Pair <bool[], BoolExpr> > mint = new List <Pair <bool[], BoolExpr> >();
                                    try
                                    {
                                        mint = z3.GenerateMinterms(predicates.ToArray()).ToList();
                                        sw.Stop();
                                        tminterm = sw.ElapsedMilliseconds;
                                        if (tminterm > timeout)
                                        {
                                            tminterm = timeout;
                                        }
                                    }
                                    catch (Z3Exception e)
                                    {
                                        tminterm = timeout;
                                    }
                                    using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"randomMSOInt.csv", true))
                                    {
                                        Console.WriteLine(predicates.Count + ", " + (tminterm == timeout ? (int)Math.Pow(2, predicates.Count) : mint.Count) + ",  " + (double)tminterm + ", " + (double)tbdd + ", " + (double)tcart);
                                        file.WriteLine(predicates.Count + ", " + (tminterm == timeout ? (int)Math.Pow(2, predicates.Count) : mint.Count) + ", " + (double)tminterm + ", " + (double)tbdd + ", " + (double)tcart);
                                    }
                                }
                                else
                                {
                                    //Console.WriteLine("moving to next one");
                                }
                            }
                            else
                            {
                                // Console.WriteLine("moving to next one");
                            }
                        }
                        catch (Z3Exception e)
                        {
                            Console.WriteLine("Z3 out of memory");
                            return;
                        }
                        catch (OutOfMemoryException e)
                        {
                            Console.WriteLine("Out of memory");
                            return;
                        }
                    }
                }
            }
        }