public void TestCFG_Overlaps() { var input = @"S -> \( S \) | [abx] [bxd] [xde] "; ContextFreeGrammar cfg = GrammarParser <BDD> .Parse(MkAutomaton, input); Assert.IsNotNull(cfg.BuiltinTerminalAlgebra); Assert.AreEqual("S", cfg.StartSymbol.Name); Assert.AreEqual(1, cfg.NonterminalCount); Assert.AreEqual(2, cfg.ProductionCount); Assert.IsFalse(cfg.IsInGNF()); var aut = MkAutomaton(@"\((xx)+\)"); BDD[] witness; var no = cfg.Overlaps <BDD>(aut, out witness); Assert.IsFalse(no); var aut2 = MkAutomaton(@"\(x+\)"); BDD[] witness2 = null; var yes = cfg.Overlaps <BDD>(aut2, out witness2); Assert.IsTrue(yes); string concrete_witness = new string(Array.ConvertAll(witness2, GetChar)); Assert.AreEqual <string>("(xxx)", concrete_witness); }