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