private void LProdExperimentZ3(BitWidth encoding) { List <string> regexes = new List <string>(SampleRegexes.regexes); regexes.RemoveRange(6, regexes.Count - 6); //just consider the first 100 cases int nonemptyCount = 0; for (int i = 0; i < regexes.Count; i++) { for (int j = 0; j < regexes.Count; j++) { string regexA = regexes[i]; string regexB = regexes[j]; var z3p = new Z3Provider(encoding); z3p.MainSolver.Push(); var A = z3p.RegexConverter.Convert(regexA, System.Text.RegularExpressions.RegexOptions.None); var B = z3p.RegexConverter.Convert(regexB, System.Text.RegularExpressions.RegexOptions.None); List <Expr> witness; bool C = Automaton <Expr> .CheckProduct(A, B, 0, out witness); if (i == j) { Assert.IsTrue(C, "product must me nonempty"); } if (C) { nonemptyCount += 1; string s = new String(Array.ConvertAll(witness.ToArray(), cs => { return(z3p.GetCharValue(z3p.MainSolver.FindOneMember(cs).Value)); })); Assert.IsTrue(Regex.IsMatch(s, regexA, RegexOptions.None), "regex mismatch"); Assert.IsTrue(Regex.IsMatch(s, regexB, RegexOptions.None), "regex mismatch"); } z3p.MainSolver.Pop(); } } Assert.AreEqual <int>(10, nonemptyCount, "wrong number of empty intersections"); }
private void LProdExperimentBDD(BitWidth encoding) { var solver = new CharSetSolver(encoding); var converter = solver; string[] regexes = SampleRegexes.regexes; int nonemptyCount = 0; for (int i = 0; i < 6; i++) { for (int j = 0; j < 6; j++) { string regexA = regexes[i]; string regexB = regexes[j]; long start = Microsoft.Automata.Internal.Utilities.HighTimer.Now; var A = converter.Convert(regexA, System.Text.RegularExpressions.RegexOptions.None); var B = converter.Convert(regexB, System.Text.RegularExpressions.RegexOptions.None); List <BDD> witness; bool C = Automaton <BDD> .CheckProduct(A, B, 0, out witness); if (i == j) { Assert.IsTrue(C, "product must me nonempty"); } if (C) { nonemptyCount += 1; string s = new String(Array.ConvertAll(witness.ToArray(), cs => { return((char)solver.Choose(cs)); })); Assert.IsTrue(Regex.IsMatch(s, regexA, RegexOptions.None), "regex mismatch"); Assert.IsTrue(Regex.IsMatch(s, regexB, RegexOptions.None), "regex mismatch"); } } } Assert.AreEqual <int>(10, nonemptyCount, "wrong number of empty intersections"); }
/// <summary> /// Checks if the intersection of L(M1) and L(M2) is an empty language. If not, produces witness. /// </summary> public static bool ProductIsEmpty(SSA <SYMBOL> m1, SSA <SYMBOL> m2, out List <Predicate <SYMBOL> > witness) { return(!Automaton <Predicate <SYMBOL> > .CheckProduct(m1.automaton, m2.automaton, 0, out witness)); }