Пример #1
0
        public void TestStateDistinguisher()
        {
            var solver = ContextFreeGrammar.GetContext();
            var A      = solver.Convert("A.*A").Determinize().RemoveEpsilons();
            var B      = solver.Convert("B.*B.*B").Determinize().RemoveEpsilons();
            var AB     = A.Intersect(B);
            var states = new List <int>(AB.GetStates());
            var dist   = new StateDistinguisher_Moore <BDD>(AB, bdd => (char)bdd.GetMin());

            //check suffix-closedness
            foreach (var s in dist.GetAllDistinguishingStrings())
            {
                for (int i = 0; i < s.Length; i++)
                {
                    Assert.IsTrue(dist.IsDistinguishingString(s.Substring(i)));
                }
            }
            //check that the states in the minimized automaton are all distiguishable
            var ABMin = AB.Minimize();
            //here we know that the minimization algorithm keeps the same state ids
            Func <int, int, Tuple <int, int> > MkPair = (x, y) => (x <= y ? new Tuple <int, int>(x, y) : new Tuple <int, int>(y, x));

            foreach (var p in ABMin.States)
            {
                foreach (var q in ABMin.States)
                {
                    if (p != q)
                    {
                        string s;
                        Assert.IsTrue(dist.AreDistinguishable(p, q, out s));
                    }
                }
            }
        }
Пример #2
0
        public void TestStateDistinguisher_RandomCharSelector()
        {
            var solver = new CharSetSolver();
            var A      = solver.Convert("[A-Z].*[A-Z]").Determinize().RemoveEpsilons();
            var B      = solver.Convert("[0-9].*[0-9].*[0-9]").Determinize().RemoveEpsilons();
            var AB     = A.Intersect(B);
            var states = new List <int>(AB.GetStates());
            var dist   = new StateDistinguisher_Moore <BDD>(AB, solver.ChooseUniformly);
            //check that the states in the minimized automaton are all distiguishable
            var ABMin = AB.Minimize();

            //here we know that the minimization algorithm keeps the same state ids
            foreach (var p in ABMin.States)
            {
                foreach (var q in ABMin.States)
                {
                    if (p != q)
                    {
                        string w;
                        Assert.IsTrue(dist.AreDistinguishable(p, q, out w));
                        var w_preds = Array.ConvertAll(w.ToCharArray(), c => solver.MkCharConstraint(c));
                        var p1      = ABMin.GetTargetState(p, w_preds);
                        var q1      = ABMin.GetTargetState(q, w_preds);
                        Assert.IsTrue(ABMin.IsFinalState(p1) != ABMin.IsFinalState(q1));
                    }
                }
            }
        }