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"); }
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); }
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); }
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"); }
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); }
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"); }
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; } } } }
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; } } } } }