コード例 #1
0
        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");
        }
コード例 #2
0
        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");
        }
コード例 #3
0
ファイル: SSA.cs プロジェクト: matejchalk/ARMC
 /// <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));
 }