示例#1
0
        private Variable ConvertEmptyset(out MSOFormula <BDD> psi)
        {
            var X = MkNewVar2();

            psi = new MSOIsEmpty <BDD>(X);
            return(X);
        }
        public override MSOFormula ToMSO(FreshGen fg, string V)
        {
            int    c = fg.get();
            string x = "_x_" + c.ToString();
            string y = "_y_" + c.ToString();
            string X = "_X_" + c.ToString();


            int        i = str.Length - 1;
            string     z_i, z_im;
            MSOFormula phi = null;

            phi = new MSOLabel("z0", str[0]);

            while (i > 0)
            {
                z_i  = "z" + i.ToString();
                z_im = "z" + (i - 1).ToString();
                phi  = new MSOExistsFO(z_i, new MSOAnd(new MSOSucc(z_im, z_i),
                                                       new MSOAnd(new MSOLabel(z_i, str[i]), phi)));
                i--;
            }

            return(new MSOForallFO("z0", new MSOIff(new MSOBelong("z0", V), phi)));
        }
示例#3
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");
        }
示例#4
0
        public MSOFormula <BDD> ToMSO()
        {
            if (header != MonaHeader.M2LSTR)
            {
                throw new NotSupportedException("unsopprted header " + header);
            }

            if (declarations.Exists(d => (d.kind != Mona.MonaDeclKind.formula || d.kind != Mona.MonaDeclKind.var1 || d.kind != Mona.MonaDeclKind.var2)))
            {
                throw new NotSupportedException("unsopprted declaration (other than formula or var1 or var2)");
            }

            if (vars1.Exists(d => (d.univs != null || d.varwhere.where != null)))
            {
                throw new NotSupportedException("unsopprted var declaration (with universe or where condition)");
            }

            int fvcount = vars1.Count + vars2.Count;

            MSOFormula <BDD> psi = null;

            foreach (var decl in declarations)
            {
                if (decl.kind == MonaDeclKind.formula)
                {
                    var phi = ConvertFormula(((MonaFormulaDecl)decl).formula, MapStack <string, MonaParam> .Empty);
                    psi = (psi == null ? phi : new MSOAnd <BDD>(psi, phi));
                }
            }

            throw new NotImplementedException();
        }
示例#5
0
        Automaton<T> CreateAutomaton3<T>(Func<int, T> f, int bitWidth, IBooleanAlgebra<T> Z)
        {

            Func<int, Variable, MSOPredicate<T>> pred = (i, s) => new MSOPredicate<T>(f(i), s);

            MSOFormula<T> phi = new MSOTrue<T>();

            // x1<x2<x3<x4...
            for (int index = 1; index < bitWidth; index++)
            {
                MSOFormula<T> phi1 = new MSOLt<T>(V1("x" + (index - 1)), V1("x" + index));
                phi = new MSOAnd<T>(phi, phi1);
            }

            // bi(xi)
            for (int index = 0; index < bitWidth; index++)
            {
                MSOFormula<T> phi1 = pred(index, V1("x" + index));
                phi = new MSOAnd<T>(phi, phi1);
            }

            // exists forall...
            for (int index = 0; index < bitWidth; index++)
            {
                if (index % 2 == 0)
                    phi = new MSOExists<T>(V1("x" + index), phi);
                else
                    phi = new MSOForall<T>(V1("x" + index), phi);
            }
            var aut = phi.GetAutomaton(Z);
            return aut;
        }
示例#6
0
        private Variable ConvertSet(MonaExpr set, MapStack <string, MonaParam> locals, out MSOFormula <BDD> psi)
        {
            if (set.NrOfSubexprs == 0)
            {
                return(ConvertEmptyset(out psi));
            }

            MSOFormula <BDD> disj = null;
            Variable         x    = MkNewVar1();
            Variable         X    = MkNewVar2();

            for (int i = 0; i < set.NrOfSubexprs; i++)
            {
                MonaExpr t = set[i];
                if (t.symbol.Kind == Tokens.RANGE)
                {
                    MSOFormula <BDD> from_psi;
                    Variable         from = ConvertTerm1(t[0], locals, out from_psi);
                    MSOFormula <BDD> to_psi;
                    Variable         to = ConvertTerm1(t[1], locals, out to_psi);

                    MSOFormula <BDD> range = AddConstraints(from_psi, from, to_psi, to,
                                                            new MSOAnd <BDD>(new MSOLe <BDD>(from, x), new MSOLe <BDD>(x, to)));

                    if (disj == null)
                    {
                        disj = range;
                    }
                    else
                    {
                        disj = new MSOOr <BDD>(disj, range);
                    }
                }
                else
                {
                    MSOFormula <BDD> y_psi;
                    Variable         y = ConvertTerm1(t, locals, out y_psi);

                    MSOFormula <BDD> elem = new MSOEq <BDD>(x, y);
                    if (y_psi != null)
                    {
                        elem = new MSOExists <BDD>(y, new MSOAnd <BDD>(y_psi, elem));
                    }

                    if (disj == null)
                    {
                        disj = elem;
                    }
                    else
                    {
                        disj = new MSOOr <BDD>(disj, elem);
                    }
                }
            }

            var pred = new MSOForall <BDD>(x, new MSOEquiv <BDD>(new MSOIn <BDD>(x, X), disj));

            psi = pred;
            return(X);
        }
示例#7
0
 private static MSOFormula<BDD> AddConstraints(MSOFormula<BDD> psi_x, Variable x, MSOFormula<BDD> psi_y, Variable y, MSOFormula<BDD> res)
 {
     if (psi_y != null)
         res = new MSOExists<BDD>(y, new MSOAnd<BDD>(psi_y, res));
     if (psi_x != null)
         res = new MSOExists<BDD>(x, new MSOAnd<BDD>(psi_x, res));
     return res;
 }
示例#8
0
        //LTL over finite traces
        private static void AutomatarkMsoFormulasTest(string inputDir, string outFile)
        {
            Console.WriteLine("fileName , generic-bdd, product");
            using (System.IO.StreamWriter file =
                       new System.IO.StreamWriter(outFile))
            {
                var files = new List <string>(Directory.EnumerateFiles(inputDir, "*.mona", SearchOption.AllDirectories));
                files.Sort((s1, s2) => cmp(s1, s2));
                foreach (string fileName in files)
                {
                    string      contents = File.ReadAllText(fileName);
                    MonaProgram pgm1     = MonaParser.Parse(contents);
                    phi = pgm1.ToMSO();

                    var bv7 = new CharSetSolver(BitWidth.BV7);
                    bddSolver = new BDDAlgebra <BDD>(bv7);
                    var sw = new Stopwatch();
                    sw.Restart();
                    Thread t = new Thread(BDDSolver);
                    t.Start();
                    long t1 = 5000;
                    if (!t.Join(TimeSpan.FromSeconds(5)))
                    {
                        t.Abort();
                        t1 = 5000;
                    }
                    else
                    {
                        sw.Stop();
                        t1 = sw.ElapsedMilliseconds;
                    }

                    bv7        = new CharSetSolver(BitWidth.BV7);
                    cartSolver = new CartesianAlgebraBDD <BDD>(bv7);

                    sw.Restart();
                    t = new Thread(CartesianSolver);
                    t.Start();
                    long t2 = 5000;
                    if (!t.Join(TimeSpan.FromSeconds(5)))
                    {
                        t.Abort();
                        t2 = 5000;
                    }
                    else
                    {
                        sw.Stop();
                        t2 = sw.ElapsedMilliseconds;
                    }

                    //if (t2 > 5000)
                    //    t2 = 5000;

                    file.WriteLine(fileName + "," + (double)t1 / numTests + "," + (double)t2 / numTests);
                    Console.WriteLine(fileName + "," + (double)t1 / numTests + "," + (double)t2 / numTests);
                }
            }
        }
示例#9
0
        public MSOFormula <BDD> ToMSO()
        {
            if (header == MonaHeader.M2LTREE || header == MonaHeader.WS2S)
            {
                throw new NotSupportedException("unsopprted header " + header);
            }

            foreach (var d in declarations)
            {
                if (d.kind != Mona.MonaDeclKind.formula &&
                    d.kind != Mona.MonaDeclKind.var1 &&
                    d.kind != Mona.MonaDeclKind.var2 &&
                    d.kind != Mona.MonaDeclKind.constant &&
                    d.kind != Mona.MonaDeclKind.pred &&
                    d.kind != Mona.MonaDeclKind.macro)
                {
                    throw new NotImplementedException("declaration: " + d.ToString());
                }
                MonaVarDecl vd = d as MonaVarDecl;
                if (vd != null && (vd.univs != null || vd.varwhere.where != null))
                {
                    throw new NotImplementedException("var declaration (with universe or where condition): " + vd.ToString());
                }
            }

            int fvcount = vars1.Count + vars2.Count;

            MSOFormula <BDD> psi = null;

            foreach (var decl in declarations)
            {
                if (decl.kind == MonaDeclKind.formula)
                {
                    var phi = ConvertFormula(((MonaFormulaDecl)decl).formula, MapStack <string, MonaParam> .Empty);
                    if (psi == null)
                    {
                        psi = phi;
                    }
                    else
                    {
                        psi = psi & phi;
                    }
                }
                else if (decl.kind == MonaDeclKind.pred || decl.kind == MonaDeclKind.macro)
                {
                    var pd = decl as MonaPredDecl;
                    predMap[pd.name.text] = ConvertFormula(pd.formula, MapStack <string, MonaParam> .Empty.Push(pd.pmap));
                }
            }

            if (psi == null)
            {
                throw new ArgumentException("formula is missing from the mona program");
            }

            return(psi);
        }
        public override MSOFormula ToMSO(FreshGen fg, string v)
        {
            switch (op)
            {
            case PDLStringPosOperator.FirstOcc:
            {
                int        i = str.Length - 1;
                string     z_i, z_im;
                MSOFormula phi = null;        //new MSOForallFO("x", new MSOEqual("x", "x"));

                //TODO make sure input string is non empty that is i/=0

                phi = new MSOLabel("z0", str[0]);

                while (i > 0)
                {
                    z_i  = "z" + i.ToString();
                    z_im = "z" + (i - 1).ToString();
                    phi  = new MSOExistsFO(z_i, new MSOAnd(new MSOSucc(z_im, z_i),
                                                           new MSOAnd(new MSOLabel(z_i, str[i]), phi)));
                    i--;
                }

                return(new MSOAnd(new MSOForallFO("z0", new MSOIf(phi, new MSOLessEq(v, "z0"))),
                                  new MSOExistsFO("z0", new MSOAnd(phi, new MSOEqual(v, "z0")))));
            }

            case PDLStringPosOperator.LastOcc:
            {
                int        i = str.Length - 1;
                string     z_i, z_im;
                MSOFormula phi = null;        //new MSOForallFO("x", new MSOEqual("x", "x"));

                //TODO make sure input string is non empty that is i/=0

                phi = new MSOLabel("z0", str[0]);

                while (i > 0)
                {
                    z_i  = "z" + i.ToString();
                    z_im = "z" + (i - 1).ToString();
                    phi  = new MSOExistsFO(z_i, new MSOAnd(new MSOSucc(z_im, z_i),
                                                           new MSOAnd(new MSOLabel(z_i, str[i]), phi)));
                    i--;
                }

                return(new MSOAnd(new MSOForallFO("z0", new MSOIf(phi, new MSOLessEq("z0", v))),
                                  new MSOExistsFO("z0", new MSOAnd(phi, new MSOEqual(v, "z0")))));
            }

            default: throw new PDLException("undefined operator");
            }
        }
示例#11
0
 private static MSOFormula <BDD> AddConstraints(MSOFormula <BDD> psi_x, Variable x, MSOFormula <BDD> psi_y, Variable y, MSOFormula <BDD> res)
 {
     if (psi_y != null)
     {
         res = new MSOExists <BDD>(y, new MSOAnd <BDD>(psi_y, res));
     }
     if (psi_x != null)
     {
         res = new MSOExists <BDD>(x, new MSOAnd <BDD>(psi_x, res));
     }
     return(res);
 }
示例#12
0
        static Automaton <T> CreateAutomaton2 <T>(Func <int, T> f, int bitWidth, IBooleanAlgebra <T> Z)
        {
            Func <int, string, MSOPredicate <T> > pred = (i, s) => new MSOPredicate <T>(f(i), new Variable(s, true));

            MSOFormula <T> phi = new MSOFalse <T>();

            for (int index = 0; index < bitWidth; index++)
            {
                MSOFormula <T> phi1 = pred(index, "var");
                phi1 = new MSOExists <T>(new Variable("var", true), phi1);
                phi  = new MSOOr <T>(phi, phi1);
            }

            phi = new MSOExists <T>(new Variable("var", true), phi);

            var aut = phi.GetAutomaton(Z);

            return(aut);
        }
示例#13
0
        Automaton<T> CreateAutomaton2<T>(Func<int, T> f, int bitWidth, IBooleanAlgebra<T> Z)
        {

            Func<int, Variable, MSOPredicate<T>> pred = (i, s) => new MSOPredicate<T>(f(i), s);

            MSOFormula<T> phi = new MSOFalse<T>();

            for (int index = 0; index < bitWidth; index++)
            {
                MSOFormula<T> phi1 = pred(index, V1("var"));
                phi1 = new MSOExists<T>(V1("var"), phi1);
                phi = new MSOOr<T>(phi, phi1);
            }

            phi = new MSOExists<T>(V1("var"), phi);

            var aut = phi.GetAutomaton(Z);

            return aut;
        }
示例#14
0
        Automaton <T> CreateAutomaton3 <T>(Func <int, T> f, int bitWidth, IBooleanAlgebra <T> Z)
        {
            Func <int, string, MSOPredicate <T> > pred = (i, s) => new MSOPredicate <T>(f(i), s);

            MSOFormula <T> phi = new MSOTrue <T>();

            // x1<x2<x3<x4...
            for (int index = 1; index < bitWidth; index++)
            {
                MSOFormula <T> phi1 = new MSOLt <T>("x" + (index - 1), "x" + index);
                phi = new MSOAnd <T>(phi, phi1);
            }

            // bi(xi)
            for (int index = 0; index < bitWidth; index++)
            {
                MSOFormula <T> phi1 = pred(index, "x" + index);
                phi = new MSOAnd <T>(phi, phi1);
            }

            // exists forall...
            for (int index = 0; index < bitWidth; index++)
            {
                if (index % 2 == 0)
                {
                    phi = new MSOExistsFo <T>("x" + index, phi);
                }
                else
                {
                    phi = new MSOForallFo <T>("x" + index, phi);
                }
            }

            Assert.IsTrue(phi.IsWellFormedFormula());
            var aut = phi.GetAutomaton(Z);

            return(aut);
        }
示例#15
0
        static Automaton <T> CreateAutomaton3 <T>(Func <int, T> f, int bitWidth, IBooleanAlgebra <T> Z)
        {
            Func <int, string, MSOPredicate <T> > pred = (i, s) => new MSOPredicate <T>(f(i), new Variable(s, true));

            MSOFormula <T> phi = new MSOTrue <T>();

            // x1<x2<x3<x4...
            for (int index = 1; index < bitWidth; index++)
            {
                MSOFormula <T> phi1 = new MSOLt <T>(new Variable("x" + (index - 1), true), new Variable("x" + index, true));
                phi = new MSOAnd <T>(phi, phi1);
            }

            // bi(xi)
            for (int index = 0; index < bitWidth; index++)
            {
                MSOFormula <T> phi1 = pred(index, "x" + index);
                phi = new MSOAnd <T>(phi, phi1);
            }

            // exists forall...
            for (int index = 0; index < bitWidth; index++)
            {
                if (index % 2 == 0)
                {
                    phi = new MSOExists <T>(new Variable("x" + index, true), phi);
                }
                else
                {
                    phi = new MSOForall <T>(new Variable("x" + index, true), phi);
                }
            }

            var aut = phi.GetAutomaton(Z);

            return(aut);
        }
示例#16
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");
        }
示例#17
0
        private MSOFormula<BDD> ConvertPredApp(MonaPredApp predApp, MapStack<string, MonaParam> locals)
        {
            var predDef = predMap[predApp.symbol.text];
            var predDecl = (MonaPredDecl)globals[predApp.symbol.text];

            int k = predDecl.parameters.Count;
            if (k != predApp.NrOfSubexprs)
                throw new ArgumentException("invalid call of " + predDecl.name);

            if (k == 0)
                return predDef;

            var newVars = new Variable[k];
            Dictionary<string, Variable> substitution = new Dictionary<string, Variable>();

            var argPreds = new MSOFormula<BDD>[k];
            var argVars = new Variable[k];

            for (int i = 0; i < k; i++)
            {
                if (predDecl.parameters[i].kind != MonaParamKind.var1 && predDecl.parameters[i].kind != MonaParamKind.var2)
                    throw new NotImplementedException("parameter kind " + predDecl.parameters[i].kind.ToString());

                MSOFormula<BDD> argPreds_i;
                Variable argVars_i;
                if (predDecl.parameters[i].kind == MonaParamKind.var1)
                {
                    argVars_i = ConvertTerm1(predApp[i], locals, out argPreds_i);
                    if (argPreds_i == null)
                    {
                        var tmp1 = MkNewVar1();
                        argPreds_i = new MSOEq<BDD>(tmp1, argVars_i);
                        argVars_i = tmp1;
                    }
                }
                else
                {
                    argVars_i = ConvertTerm2(predApp[i], locals, out argPreds_i);
                    if (argPreds_i == null)
                    {
                        var tmp2 = MkNewVar2();
                        argPreds_i = new MSOEq<BDD>(tmp2, argVars_i);
                        argVars_i = tmp2;
                    }
                }
                argPreds[i] = argPreds_i;
                argVars[i] = argVars_i;
                substitution[predDecl.parameters[i].Token.text] = argVars_i;
            }

            MSOFormula<BDD> psi = predDef.SubstituteVariables(substitution);
            for (int i = k - 1; i >= 0; i--)
                psi = new MSOExists<BDD>(argVars[i], argPreds[i] & psi);

            return psi;
        }
示例#18
0
        private Variable ConvertSet(MonaExpr set, MapStack<string, MonaParam> locals, out MSOFormula<BDD> psi)
        {
            if (set.NrOfSubexprs == 0)
                return ConvertEmptyset(out psi);

            MSOFormula<BDD> disj = null;
            Variable x = MkNewVar1();
            Variable X = MkNewVar2();
            for (int i=0; i < set.NrOfSubexprs; i++)
            {
                MonaExpr t = set[i];
                if (t.symbol.Kind == Tokens.RANGE)
                {
                    MSOFormula<BDD> from_psi;
                    Variable from = ConvertTerm1(t[0], locals, out from_psi);
                    MSOFormula<BDD> to_psi;
                    Variable to = ConvertTerm1(t[1], locals, out to_psi);

                    MSOFormula<BDD> range = AddConstraints(from_psi, from, to_psi, to,
                        new MSOAnd<BDD>(new MSOLe<BDD>(from, x), new MSOLe<BDD>(x, to)));

                    if (disj == null)
                        disj = range;
                    else
                        disj = new MSOOr<BDD>(disj, range);
                }
                else
                {
                    MSOFormula<BDD> y_psi;
                    Variable y = ConvertTerm1(t, locals, out y_psi);

                    MSOFormula<BDD> elem = new MSOEq<BDD>(x, y);
                    if (y_psi != null)
                        elem = new MSOExists<BDD>(y, new MSOAnd<BDD>(y_psi, elem));

                    if (disj == null)
                        disj = elem;
                    else
                        disj = new MSOOr<BDD>(disj, elem);
                }
            }

            var pred = new MSOForall<BDD>(x, new MSOEquiv<BDD>(new MSOIn<BDD>(x, X), disj));
            psi = pred;
            return X;
        }
示例#19
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;

                        }
                    }
                }
        }
示例#20
0
 static MSOOr <BoolExpr> Or(MSOFormula <BoolExpr> psi, MSOFormula <BoolExpr> phi)
 {
     return(new MSOOr <BoolExpr>(psi, phi));
 }
示例#21
0
 /// <summary>
 /// If t is a variable name then returns t as a s-o variable and sets psi=null.
 /// Else returns a fresh s-o variable X and outputs psi(X) s.t. psi(X) iff X=t.
 /// </summary>
 private Variable ConvertTerm2(MonaExpr t, MapStack<string, MonaParam> locals, out MSOFormula<BDD> psi)
 {
     switch (t.symbol.Kind)
     {
         case Tokens.NAME:
             {
                 psi = null;
                 return new Variable(t.symbol.text, false);
             }
         case Tokens.INTER:
             return ConvertInter(t[0], t[1], locals, out psi);
         case Tokens.UNION:
             return ConvertUnion(t[0], t[1], locals, out psi);
         case Tokens.SETMINUS:
             return ConvertSetminus(t[0], t[1], locals, out psi);
         case Tokens.EMPTY:
             return ConvertEmptyset(out psi);
         case Tokens.LBRACE:
             return ConvertSet(t, locals, out psi);
         default:
             throw new NotImplementedException(t.ToString());
     }
 }
示例#22
0
 static MSOImplies <BoolExpr> Implies(MSOFormula <BoolExpr> lhs, MSOFormula <BoolExpr> rhs)
 {
     return(new MSOImplies <BoolExpr>(lhs, rhs));
 }
示例#23
0
        private MSOFormula <BDD> ConvertPredApp(MonaPredApp predApp, MapStack <string, MonaParam> locals)
        {
            var predDef  = predMap[predApp.symbol.text];
            var predDecl = (MonaPredDecl)globals[predApp.symbol.text];

            int k = predDecl.parameters.Count;

            if (k != predApp.NrOfSubexprs)
            {
                throw new ArgumentException("invalid call of " + predDecl.name);
            }

            if (k == 0)
            {
                return(predDef);
            }

            var newVars = new Variable[k];
            Dictionary <string, Variable> substitution = new Dictionary <string, Variable>();

            var argPreds = new MSOFormula <BDD> [k];
            var argVars  = new Variable[k];

            for (int i = 0; i < k; i++)
            {
                if (predDecl.parameters[i].kind != MonaParamKind.var1 && predDecl.parameters[i].kind != MonaParamKind.var2)
                {
                    throw new NotImplementedException("parameter kind " + predDecl.parameters[i].kind.ToString());
                }

                MSOFormula <BDD> argPreds_i;
                Variable         argVars_i;
                if (predDecl.parameters[i].kind == MonaParamKind.var1)
                {
                    argVars_i = ConvertTerm1(predApp[i], locals, out argPreds_i);
                    if (argPreds_i == null)
                    {
                        var tmp1 = MkNewVar1();
                        argPreds_i = new MSOEq <BDD>(tmp1, argVars_i);
                        argVars_i  = tmp1;
                    }
                }
                else
                {
                    argVars_i = ConvertTerm2(predApp[i], locals, out argPreds_i);
                    if (argPreds_i == null)
                    {
                        var tmp2 = MkNewVar2();
                        argPreds_i = new MSOEq <BDD>(tmp2, argVars_i);
                        argVars_i  = tmp2;
                    }
                }
                argPreds[i] = argPreds_i;
                argVars[i]  = argVars_i;
                substitution[predDecl.parameters[i].Token.text] = argVars_i;
            }

            MSOFormula <BDD> psi = predDef.SubstituteVariables(substitution);

            for (int i = k - 1; i >= 0; i--)
            {
                psi = new MSOExists <BDD>(argVars[i], argPreds[i] & psi);
            }

            return(psi);
        }
示例#24
0
        /// <summary>
        /// If t is a variable name then returns t as a f-o variable and sets psi=null.
        /// Else returns a fresh f-o variable x and outputs psi(x) s.t. psi(x) iff x=t.
        /// </summary>
        Variable ConvertTerm1(MonaExpr t, MapStack <string, MonaParam> locals, out MSOFormula <BDD> psi)
        {
            switch (t.symbol.Kind)
            {
            case Tokens.NAME:
            {
                MonaParam p;
                if (locals.TryGetValue(t.symbol.text, out p))
                {
                    if (p.kind == MonaParamKind.var1)
                    {
                        psi = null;
                        return(new Variable(t.symbol.text, true));
                    }
                    else
                    {
                        throw new NotImplementedException(t.ToString());
                    }
                }
                else
                {
                    MonaDecl d;
                    if (globals.TryGetValue(t.symbol.text, out d))
                    {
                        if (d.kind == MonaDeclKind.constant)
                        {
                            int      n    = ((MonaConstDecl)d).def.ToInt(globals);
                            Variable x    = MkNewVar1();
                            var      pred = new MSOeqN <BDD>(x, n);
                            psi = pred;
                            return(x);
                        }
                        else
                        {
                            throw new NotImplementedException(t.ToString());
                        }
                    }
                    else
                    {
                        throw new NotImplementedException(t.ToString());
                    }
                }
            }

            case Tokens.PLUS:
            {
                Variable y = MkNewVar1();
                if (t[0].symbol.Kind == Tokens.NAME)
                {
                    int      n = t[1].ToInt(globals);
                    Variable x = new Variable(t[0].symbol.text, true);
                    psi = new MSOSuccN <BDD>(x, y, n);        // y = x + n
                }
                else
                {
                    int n = t.ToInt(globals);
                    psi = new MSOeqN <BDD>(y, n);        // y = n
                }
                return(y);
            }

            case Tokens.MIN:
            {
                MSOFormula <BDD> X_psi;
                Variable         X   = ConvertTerm2(t[0], locals, out X_psi);
                Variable         x   = MkNewVar1();
                MSOFormula <BDD> min = new MSOMin <BDD>(x, X);
                if (X_psi != null)
                {
                    min = new MSOExists <BDD>(X, new MSOAnd <BDD>(X_psi, min));
                }
                psi = min;
                return(x);
            }

            case Tokens.MAX:
            {
                MSOFormula <BDD> X_psi;
                Variable         X   = ConvertTerm2(t[0], locals, out X_psi);
                Variable         x   = MkNewVar1();
                MSOFormula <BDD> max = new MSOMax <BDD>(x, X);
                if (X_psi != null)
                {
                    max = new MSOExists <BDD>(X, new MSOAnd <BDD>(X_psi, max));
                }
                psi = max;
                return(x);
            }

            default:
                throw new NotImplementedException(t.ToString());
            }
        }
示例#25
0
 static MSOExistsFo <BoolExpr> Exists(string x, MSOFormula <BoolExpr> psi)
 {
     return(new MSOExistsFo <BoolExpr>(x, psi));
 }
示例#26
0
        private Variable ConvertSetminus(MonaExpr set1, MonaExpr set2, MapStack <string, MonaParam> locals, out MSOFormula <BDD> pred)
        {
            MSOFormula <BDD> psi1;
            var X1 = ConvertTerm2(set1, locals, out psi1);
            MSOFormula <BDD> psi2;
            var X2 = ConvertTerm2(set2, locals, out psi2);

            var X = MkNewVar2();
            var x = MkNewVar1();
            MSOFormula <BDD> diff = new MSOForall <BDD>(x,
                                                        new MSOEquiv <BDD>(new MSOIn <BDD>(x, X),
                                                                           new MSOAnd <BDD>(new MSOIn <BDD>(x, X1),
                                                                                            new MSONot <BDD>(new MSOIn <BDD>(x, X2)))));

            pred = AddConstraints(psi2, X2, psi1, X1, diff);
            return(X);
        }
示例#27
0
        //LTL over finite traces
        private static void AutomatarkMsoFormulasTest(string inputDir, string outFile)
        {
            Console.WriteLine("fileName , generic-bdd, product");
            using (System.IO.StreamWriter file =
               new System.IO.StreamWriter(outFile))
            {
                var files = new List<string>(Directory.EnumerateFiles(inputDir, "*.mona", SearchOption.AllDirectories));
                files.Sort((s1, s2) => cmp(s1, s2));
                foreach (string fileName in files)
                {
                    string contents = File.ReadAllText(fileName);
                    MonaProgram pgm1 = MonaParser.Parse(contents);
                    phi = pgm1.ToMSO();

                    var bv7 = new CharSetSolver(BitWidth.BV7);
                    bddSolver = new BDDAlgebra<BDD>(bv7);
                    var sw = new Stopwatch();
                    sw.Restart();
                    Thread t = new Thread(BDDSolver);
                    t.Start();
                    long t1 = 5000;
                    if (!t.Join(TimeSpan.FromSeconds(5)))
                    {
                        t.Abort();
                        t1 = 5000;
                    }
                    else {
                        sw.Stop();
                        t1 = sw.ElapsedMilliseconds;
                    }

                    bv7 = new CharSetSolver(BitWidth.BV7);
                    cartSolver = new CartesianAlgebraBDD<BDD>(bv7);

                    sw.Restart();
                    t = new Thread(CartesianSolver);
                    t.Start();
                    long t2 = 5000;
                    if (!t.Join(TimeSpan.FromSeconds(5)))
                    {
                        t.Abort();
                        t2 = 5000;
                    }
                    else {
                        sw.Stop();
                        t2 = sw.ElapsedMilliseconds;
                    }

                    //if (t2 > 5000)
                    //    t2 = 5000;

                    file.WriteLine(fileName + "," + (double)t1 / numTests + "," + (double)t2 / numTests);
                    Console.WriteLine(fileName + "," + (double)t1 / numTests + "," + (double)t2 / numTests);
                }
            }
        }
示例#28
0
        private Variable ConvertUnion(MonaExpr set1, MonaExpr set2, MapStack<string, MonaParam> locals, out MSOFormula<BDD> pred)
        {
            MSOFormula<BDD> psi1;
            var X1 = ConvertTerm2(set1, locals, out psi1);
            MSOFormula<BDD> psi2;
            var X2 = ConvertTerm2(set2, locals, out psi2);

            var X = MkNewVar2();
            var x = MkNewVar1();
            MSOFormula<BDD> union = new MSOForall<BDD>(x,
                                     new MSOEquiv<BDD>(new MSOIn<BDD>(x, X),
                                                     new MSOOr<BDD>(new MSOIn<BDD>(x, X1),
                                                                    new MSOIn<BDD>(x, X2))));
            pred = AddConstraints(psi2, X2, psi1, X1, union);
            return X;
        }
示例#29
0
 static MSOAnd <BoolExpr> And(MSOFormula <BoolExpr> psi, MSOFormula <BoolExpr> phi)
 {
     return(new MSOAnd <BoolExpr>(psi, phi));
 }
示例#30
0
 static MSOForall <BoolExpr> Forall(Variable x, MSOFormula <BoolExpr> psi)
 {
     return(new MSOForall <BoolExpr>(x, psi));
 }
示例#31
0
        /// <summary>
        /// If t is a variable name then returns t as a f-o variable and sets psi=null.
        /// Else returns a fresh f-o variable x and outputs psi(x) s.t. psi(x) iff x=t.
        /// </summary>
        Variable ConvertTerm1(MonaExpr t, MapStack<string, MonaParam> locals, out MSOFormula<BDD> psi)
        {
            switch (t.symbol.Kind)
            {
                case Tokens.NAME:
                    {
                        MonaParam p;
                        if (locals.TryGetValue(t.symbol.text, out p))
                        {
                            if (p.kind == MonaParamKind.var1)
                            {
                                psi = null;
                                return new Variable(t.symbol.text, true);
                            }
                            else
                                throw new NotImplementedException(t.ToString());
                        }
                        else
                        {
                            MonaDecl d;
                            if (globals.TryGetValue(t.symbol.text, out d))
                            {
                                if (d.kind == MonaDeclKind.constant)
                                {
                                    int n = ((MonaConstDecl)d).def.ToInt(globals);
                                    Variable x = MkNewVar1();
                                    var pred = new MSOeqN<BDD>(x, n);
                                    psi = pred;
                                    return x;
                                }
                                else if (d.kind == MonaDeclKind.var1)
                                {
                                    psi = null;
                                    return new Variable(t.symbol.text, true);
                                }
                                else
                                    throw new NotImplementedException(t.ToString());
                            }
                            else
                                throw new NotImplementedException(t.ToString());
                        }
                    }
                case Tokens.PLUS:
                    {
                        Variable y = MkNewVar1();
                        if (t[0].symbol.Kind == Tokens.NAME)
                        {
                            int n = t[1].ToInt(globals);
                            Variable x = new Variable(t[0].symbol.text, true);
                            psi = new MSOSuccN<BDD>(x, y, n); // y = x + n
                        }
                        else
                        {
                            int n = t.ToInt(globals);
                            psi = new MSOeqN<BDD>(y, n); // y = n
                        }
                        return y;
                    }
                case Tokens.MIN:
                    {
                        MSOFormula<BDD> X_psi;
                        Variable X = ConvertTerm2(t[0], locals, out X_psi);
                        Variable x = MkNewVar1();
                        MSOFormula<BDD> min = new MSOMin<BDD>(x, X);
                        if (X_psi != null)
                            min = new MSOExists<BDD>(X, new MSOAnd<BDD>(X_psi, min));
                        psi = min;
                        return x;
                    }
                case Tokens.MAX:
                    {
                        MSOFormula<BDD> X_psi;
                        Variable X = ConvertTerm2(t[0], locals, out X_psi);
                        Variable x = MkNewVar1();
                        MSOFormula<BDD> max = new MSOMax<BDD>(x, X);
                        if (X_psi != null)
                            max = new MSOExists<BDD>(X, new MSOAnd<BDD>(X_psi, max));
                        psi = max;
                        return x;
                    }

                case Tokens.NUMBER:
                    {
                        Variable x = MkNewVar1();
                        int num = t.symbol.ToInt();
                        psi = new MSOeqN<BDD>(x,num);
                        return x;
                    }
                default:
                    throw new NotImplementedException(t.ToString());
            }
        }
示例#32
0
        /// <summary>
        /// If t is a variable name then returns t as a s-o variable and sets psi=null.
        /// Else returns a fresh s-o variable X and outputs psi(X) s.t. psi(X) iff X=t.
        /// </summary>
        private Variable ConvertTerm2(MonaExpr t, MapStack <string, MonaParam> locals, out MSOFormula <BDD> psi)
        {
            switch (t.symbol.Kind)
            {
            case Tokens.NAME:
            {
                psi = null;
                return(new Variable(t.symbol.text, false));
            }

            case Tokens.INTER:
                return(ConvertInter(t[0], t[1], locals, out psi));

            case Tokens.UNION:
                return(ConvertUnion(t[0], t[1], locals, out psi));

            case Tokens.SETMINUS:
                return(ConvertSetminus(t[0], t[1], locals, out psi));

            case Tokens.EMPTY:
                return(ConvertEmptyset(out psi));

            case Tokens.LBRACE:
                return(ConvertSet(t, locals, out psi));

            default:
                throw new NotImplementedException(t.ToString());
            }
        }
示例#33
0
 static MSOExists <BoolExpr> Exists(Variable x, MSOFormula <BoolExpr> psi)
 {
     return(new MSOExists <BoolExpr>(x, psi));
 }
示例#34
0
 private Variable ConvertEmptyset(out MSOFormula<BDD> psi)
 {
     var X = MkNewVar2();
     psi = new MSOIsEmpty<BDD>(X);
     return X;
 }
示例#35
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;
                        }
                    }
                }
            }
        }
示例#36
0
        private MSOFormula <BDD> ConvertFormula(MonaExpr expr, MapStack <string, MonaParam> locals)
        {
            switch (expr.symbol.Kind)
            {
            case Tokens.TRUE:
                return(new MSOTrue <BDD>());

            case Tokens.FALSE:
                return(new MSOFalse <BDD>());

            case Tokens.NOT:
                return(new MSONot <BDD>(ConvertFormula(expr[0], locals)));

            case Tokens.AND:
                return(new MSOAnd <BDD>(ConvertFormula(expr[0], locals), ConvertFormula(expr[1], locals)));

            case Tokens.OR:
                return(new MSOOr <BDD>(ConvertFormula(expr[0], locals), ConvertFormula(expr[1], locals)));

            case Tokens.IMPLIES:
                return(new MSOImplies <BDD>(ConvertFormula(expr[0], locals), ConvertFormula(expr[1], locals)));

            case Tokens.EQUIV:
                return(new MSOEquiv <BDD>(ConvertFormula(expr[0], locals), ConvertFormula(expr[1], locals)));

            case Tokens.EQ:
                return(ConvertEq(expr[0], expr[1], locals));

            case Tokens.NE:
                return(new MSONot <BDD>(ConvertEq(expr[0], expr[1], locals)));

            case Tokens.LT:
                return(ConvertLt(expr[0], expr[1], locals));

            case Tokens.GT:
                return(ConvertLt(expr[1], expr[0], locals));

            case Tokens.LE:
                return(ConvertLe(expr[0], expr[1], locals));

            case Tokens.GE:
                return(ConvertLe(expr[1], expr[0], locals));

            case Tokens.SUBSET:
                return(ConvertSubset(expr[1], expr[0], locals));

            case Tokens.IN:
                return(ConvertIn(expr[0], expr[1], locals));

            case Tokens.NOTIN:
                return(new MSONot <BDD>(ConvertIn(expr[0], expr[1], locals)));

            case Tokens.EMPTY:
                return(ConvertIsEmpty(expr[0], locals));

            case Tokens.EX1:
            case Tokens.EX2:
            {
                MonaQFormula phi = (MonaQFormula)expr;
                if ((phi.universes != null && phi.universes.Count > 1) ||
                    phi.vars.Exists(vw => vw.where != null))
                {
                    throw new NotImplementedException(expr.ToString());
                }
                MSOFormula <BDD> psi = ConvertFormula(phi.formula, locals.Push(phi.varmap));
                foreach (var vw in phi.vars)
                {
                    psi = new MSOExists <BDD>(new Variable(vw.name, phi.varmap[vw.name].type == MonaExprType.INT), psi);
                }
                return(psi);
            }

            case Tokens.ALL1:
            case Tokens.ALL2:
            {
                MonaQFormula phi = (MonaQFormula)expr;
                if ((phi.universes != null && phi.universes.Count > 1) ||
                    phi.vars.Exists(vw => vw.where != null))
                {
                    throw new NotImplementedException(expr.ToString());
                }
                MSOFormula <BDD> psi = ConvertFormula(phi.formula, locals.Push(phi.varmap));
                foreach (var vw in phi.vars)
                {
                    psi = new MSOForall <BDD>(new Variable(vw.name, phi.varmap[vw.name].type == MonaExprType.INT), psi);
                }
                return(psi);
            }

            default:
                throw new NotImplementedException(expr.ToString());
            }
        }
示例#37
0
 static MSOForallFo <BoolExpr> Forall(string x, MSOFormula <BoolExpr> psi)
 {
     return(new MSOForallFo <BoolExpr>(x, psi));
 }