public WordsInGrammarProblem Generate(int targetLevel)
        {
            ContextFreeGrammar grammar = null;
            var inNeeded  = 1;
            var outNeeded = 1;

            // We iterate until we get a CNF
            grammar = GrammarGenerator.GenerateRandom();
            while (GrammarUtilities.getEquivalentCNF(grammar) == null)
            {
                grammar = GrammarGenerator.GenerateRandom();
            }

            inNeeded  = rnd.Next(1, 5);
            outNeeded = rnd.Next(1, 5);
            if (targetLevel == Generation.HIGH)
            {
                inNeeded  = rnd.Next(3, 5);
                outNeeded = rnd.Next(3, 5);
            }
            else if (targetLevel == Generation.MEDIUM)
            {
                inNeeded  = rnd.Next(2, 4);
                outNeeded = rnd.Next(2, 4);
            }
            else if (targetLevel == Generation.LOW)
            {
                inNeeded  = rnd.Next(1, 4);
                outNeeded = rnd.Next(1, 4);
            }
            return(new WordsInGrammarProblem(grammar, inNeeded, outNeeded));
        }
        Tuple <HashSet <Nonterminal>, List <Tuple <Production, int> > >[][] cykTable; //resulting CYK table

        public CYKProblem(ContextFreeGrammar grammar, string word)
        {
            this.grammar = GrammarUtilities.getEquivalentCNF(grammar);
            this.word    = word;

            this.cykTable = GrammarUtilities.cyk(grammar, word);
        }
Beispiel #3
0
        public void EqualityTest5() //   (a|b)^n
        {
            String             sg1 = "S -> a|b|aa|aS|bS|bbbbS";
            String             sg2 = "S->X|X S   X->a|b";
            ContextFreeGrammar g1  = GrammarParser <char> .Parse(f1, sg1);

            ContextFreeGrammar g2 = GrammarParser <char> .Parse(f1, sg2);

            var res = GrammarUtilities.findDifferenceWithTimelimit(g1, g2, true, 100);

            Assert.IsTrue(res.Item2.Count == 0 && res.Item3.Count == 0);
        }
Beispiel #4
0
        public void EqualityTest4() //   (a|b|c|d|e|f|g|h|i|j)*
        {
            String             sg1 = "S->|a|b|c|d|e|f|g|h|i|j|S S";
            String             sg2 = "S->X|X S|   X->a|b|c|d|e|f|g|h|i|j";
            ContextFreeGrammar g1  = GrammarParser <char> .Parse(f1, sg1);

            ContextFreeGrammar g2 = GrammarParser <char> .Parse(f1, sg2);

            var res = GrammarUtilities.findDifferenceWithTimelimit(g1, g2, true, 50);

            Assert.IsTrue(res.Item2.Count == 0 && res.Item3.Count == 0);
        }
Beispiel #5
0
        public void EqualityTest3() //   a^n b^n
        {
            String             sg1 = "S->aT T->aT U|b U->b";
            String             sg2 = "P->aR R->abb|aRb|b";
            ContextFreeGrammar g1  = GrammarParser <char> .Parse(f1, sg1);

            ContextFreeGrammar g2 = GrammarParser <char> .Parse(f1, sg2);

            var res = GrammarUtilities.findDifferenceWithTimelimit(g1, g2, true, 100);

            Assert.IsTrue(res.Item2.Count == 0 && res.Item3.Count == 0);
        }
Beispiel #6
0
        public void EqualityTest2()
        {
            String             sg1 = "S->aSb|absjjfhghs|";
            String             sg2 = "S->aSb|aaSbb|";
            ContextFreeGrammar g1  = GrammarParser <char> .Parse(f1, sg1);

            ContextFreeGrammar g2 = GrammarParser <char> .Parse(f1, sg2);

            var res = GrammarUtilities.findDifferenceWithTimelimit(g1, g2, true, 100);

            Assert.IsTrue(res.Item2[0].Equals("absjjfhghs") && res.Item3.Count == 0);
        }
Beispiel #7
0
        public void prefixTest1() //   balanced parenthesis
        {
            String             sg1 = "S -> S S|(S)|";
            ContextFreeGrammar g   = GrammarParser <char> .Parse(f1, sg1);

            g = GrammarUtilities.getEquivalentCNF(g);

            Assert.AreEqual(-2, GrammarUtilities.longestPrefixLength(g, "()(())()()"));  // full
            Assert.AreEqual("()(())".Length, GrammarUtilities.longestPrefixLength(g, "()(()))()()"));
            Assert.AreEqual("()(())((((".Length, GrammarUtilities.longestPrefixLength(g, "()(())(((("));
            Assert.AreEqual("".Length, GrammarUtilities.longestPrefixLength(g, ")(()()())"));
        }
Beispiel #8
0
        public void EqualityTest6() //   balanced parenthesis
        {
            String             sg1 = "S -> S S|(S)|";
            String             sg2 = "X -> | X X | (L    L->X) | X X)";
            ContextFreeGrammar g1  = GrammarParser <char> .Parse(f1, sg1);

            ContextFreeGrammar g2 = GrammarParser <char> .Parse(f1, sg2);

            var res = GrammarUtilities.findDifferenceWithTimelimit(g1, g2, true, 100);

            Assert.IsTrue(res.Item2.Count == 0 && res.Item3.Count == 0);
        }
        // Test for generated Grammars
        public override bool isValid()
        {
            // Important! Set the length of words to be tested
            var testWordsUpToLength = 5;

            if (GrammarUtilities.getEquivalentCNF(this.grammar) == null)
            {
                return(false);
            }
            Tuple <int, int> tup = GrammarUtilities.getMinWordInAndOut(GrammarUtilities.getEquivalentCNF(this.grammar), testWordsUpToLength, this.inNeeded, this.outNeeded);

            return(tup.Item1 >= this.inNeeded && tup.Item2 >= this.outNeeded);
        }
Beispiel #10
0
        public void prefixTest2() //   a^n b^n
        {
            String             sg1 = "S->aSb|S X| X->cX";
            ContextFreeGrammar g   = GrammarParser <char> .Parse(f1, sg1);

            g = GrammarUtilities.getEquivalentCNF(g);

            Assert.AreEqual(-2, GrammarUtilities.longestPrefixLength(g, "aaaaaaaaaaaaaaaabbbbbbbbbbbbbbbb"));  // full
            Assert.AreEqual("a".Length, GrammarUtilities.longestPrefixLength(g, "a"));
            Assert.AreEqual("".Length, GrammarUtilities.longestPrefixLength(g, "b"));
            Assert.AreEqual("aab".Length, GrammarUtilities.longestPrefixLength(g, "aab"));
            Assert.AreEqual("aabb".Length, GrammarUtilities.longestPrefixLength(g, "aabbb"));
            Assert.AreEqual("aaaaaaaaaaaabbbbbbbbbbbb".Length, GrammarUtilities.longestPrefixLength(g, "aaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbababc"));
        }
Beispiel #11
0
        public void EqualityTest7() //   empty grammars and invariants
        {
            String             sg1 = "S -> S S|(S)|";
            ContextFreeGrammar g1  = GrammarParser <char> .Parse(f1, sg1);

            var res = GrammarUtilities.findDifferenceWithTimelimit(g1, null, true, 25);

            Assert.IsTrue(res.Item1 == 0 && res.Item2.Count > 0 && res.Item3.Count == 0);
            res = GrammarUtilities.findDifferenceWithTimelimit(null, g1, true, 25);
            Assert.IsTrue(res.Item1 == 0 && res.Item2.Count == 0 && res.Item3.Count > 0);
            res = GrammarUtilities.findDifferenceWithTimelimit(g1, g1, true, 25);
            Assert.IsTrue(res.Item1 > 0 && res.Item2.Count == 0 && res.Item3.Count == 0);
            res = GrammarUtilities.findDifferenceWithTimelimit(null, null, true, 30);
            Assert.IsTrue(res.Item1 == 0 && res.Item2.Count == 0 && res.Item3.Count == 0);
        }
        private void AddCFGOfPDA(PDA <A, S> pda, string id, CancellationToken token)
        {
            var cfg = PDAToCFGConverter <A, S> .ToCFG(pda, token);

            var cleanedCfg = CFGCleaner.RemoveUselessSymbols(cfg, token);

            if (cleanedCfg == null)
            {
                noWordIsAccepted = true;
            }
            else
            {
                var cfgInCNF = GrammarUtilities.getEquivalentCNF(cleanedCfg);
                contextFreeGrammarsInCNF.Add(id, cfgInCNF);
            }
        }
Beispiel #13
0
        public void CYK_Test3()
        {
            String             sg1 = "S -> A B C   A->   B->   C->"; // = {""}       Testing epsilon
            ContextFreeGrammar g   = GrammarParser <char> .Parse(f1, sg1);

            g = GrammarUtilities.getEquivalentCNF(g);

            Assert.IsTrue(GrammarUtilities.isWordInGrammar(g, ""));

            Assert.IsFalse(GrammarUtilities.isWordInGrammar(g, "ba"));
            Assert.IsFalse(GrammarUtilities.isWordInGrammar(g, "ca"));
            Assert.IsFalse(GrammarUtilities.isWordInGrammar(g, "d"));
            Assert.IsFalse(GrammarUtilities.isWordInGrammar(g, "abcc"));
            Assert.IsFalse(GrammarUtilities.isWordInGrammar(g, "cba"));
            Assert.IsFalse(GrammarUtilities.isWordInGrammar(g, "ababababababababababababababababababab"));
        }
        public WordsInGrammarProblem(ContextFreeGrammar grammar, int inNeeded, int outNeeded)
        {
            this.grammar   = grammar;
            this.inNeeded  = inNeeded;
            this.outNeeded = outNeeded;

            numberOfShortWords = GrammarUtilities.generateShortestWords(grammar, shortLength).Count;
            //calculate all possible short words (needed for qual and dif)
            possibleShortWords = 0;
            int termCount = grammar.GetNonVariableSymbols().Count();
            int x         = 1;

            for (int i = 0; i <= shortLength; i++)
            {
                possibleShortWords += x;
                x *= termCount;
            }
        }
Beispiel #15
0
        public void CYK_Test1()
        {
            String             sg1 = "S->aX X->bS|b"; // =  (ab)*       Aufg 1.1a
            ContextFreeGrammar g   = GrammarParser <char> .Parse(f1, sg1);

            g = GrammarUtilities.getEquivalentCNF(g);

            Assert.IsTrue(GrammarUtilities.isWordInGrammar(g, "ab"));
            Assert.IsTrue(GrammarUtilities.isWordInGrammar(g, "abab"));
            Assert.IsTrue(GrammarUtilities.isWordInGrammar(g, "ababab"));
            Assert.IsTrue(GrammarUtilities.isWordInGrammar(g, "ababababababababababababababababababababab"));

            Assert.IsFalse(GrammarUtilities.isWordInGrammar(g, "a"));
            Assert.IsFalse(GrammarUtilities.isWordInGrammar(g, "b"));
            Assert.IsFalse(GrammarUtilities.isWordInGrammar(g, "c"));
            Assert.IsFalse(GrammarUtilities.isWordInGrammar(g, "aab"));
            Assert.IsFalse(GrammarUtilities.isWordInGrammar(g, "ba"));
            Assert.IsFalse(GrammarUtilities.isWordInGrammar(g, "aabaabbabb"));
            Assert.IsFalse(GrammarUtilities.isWordInGrammar(g, "ababababababababababababababababababa"));
        }
Beispiel #16
0
        public void prefixTest3() //   balanced parenthesis () and {}   Exercise 8.5
        {
            String             sg1 = "S -> S S|(S)|{S}|";
            ContextFreeGrammar g   = GrammarParser <char> .Parse(f1, sg1);

            g = GrammarUtilities.getEquivalentCNF(g);

            Assert.AreEqual(-2, GrammarUtilities.longestPrefixLength(g, "(){()}"));  // full
            Assert.AreEqual("(){(".Length, GrammarUtilities.longestPrefixLength(g, "(){("));
            Assert.AreEqual("()".Length, GrammarUtilities.longestPrefixLength(g, "()}"));

            String sg2 = "S->A B| C D | A T | C U | S S  T-> A B   U->S D  A->(  B->) C->{ D->}";

            g = GrammarParser <char> .Parse(f1, sg2);

            g = GrammarUtilities.getEquivalentCNF(g);

            Assert.AreEqual(-2, GrammarUtilities.longestPrefixLength(g, "(){()}"));  // full
            Assert.AreEqual("(){(".Length, GrammarUtilities.longestPrefixLength(g, "(){("));
            Assert.AreEqual("()".Length, GrammarUtilities.longestPrefixLength(g, "()}"));
        }
Beispiel #17
0
        public void CYK_Test2()
        {
            String             sg1 = "S->aSb|S X| X->cX"; // = a^n b^n            Aufg 1.1b
            ContextFreeGrammar g   = GrammarParser <char> .Parse(f1, sg1);

            g = GrammarUtilities.getEquivalentCNF(g);

            Assert.IsTrue(GrammarUtilities.isWordInGrammar(g, ""));
            Assert.IsTrue(GrammarUtilities.isWordInGrammar(g, "ab"));
            Assert.IsTrue(GrammarUtilities.isWordInGrammar(g, "aabb"));
            Assert.IsTrue(GrammarUtilities.isWordInGrammar(g, "aaabbb"));
            Assert.IsTrue(GrammarUtilities.isWordInGrammar(g, "aaaabbbb"));

            Assert.IsFalse(GrammarUtilities.isWordInGrammar(g, "a"));
            Assert.IsFalse(GrammarUtilities.isWordInGrammar(g, "b"));
            Assert.IsFalse(GrammarUtilities.isWordInGrammar(g, "c"));
            Assert.IsFalse(GrammarUtilities.isWordInGrammar(g, "aab"));
            Assert.IsFalse(GrammarUtilities.isWordInGrammar(g, "ba"));
            Assert.IsFalse(GrammarUtilities.isWordInGrammar(g, "aabaabbabb"));
            Assert.IsFalse(GrammarUtilities.isWordInGrammar(g, "ababababababababababababababababababab"));
        }
Beispiel #18
0
        public void CYK_Test4()
        {
            String             sg1 = "S->A B C    A->|a    B->b|    C->|c"; // = {"", a, b, c, ab, ac, bc, abc}
            ContextFreeGrammar g   = GrammarParser <char> .Parse(f1, sg1);

            g = GrammarUtilities.getEquivalentCNF(g);

            Assert.IsTrue(GrammarUtilities.isWordInGrammar(g, ""));
            Assert.IsTrue(GrammarUtilities.isWordInGrammar(g, "a"));
            Assert.IsTrue(GrammarUtilities.isWordInGrammar(g, "b"));
            Assert.IsTrue(GrammarUtilities.isWordInGrammar(g, "c"));
            Assert.IsTrue(GrammarUtilities.isWordInGrammar(g, "ab"));
            Assert.IsTrue(GrammarUtilities.isWordInGrammar(g, "ac"));
            Assert.IsTrue(GrammarUtilities.isWordInGrammar(g, "bc"));
            Assert.IsTrue(GrammarUtilities.isWordInGrammar(g, "abc"));

            Assert.IsFalse(GrammarUtilities.isWordInGrammar(g, "ba"));
            Assert.IsFalse(GrammarUtilities.isWordInGrammar(g, "ca"));
            Assert.IsFalse(GrammarUtilities.isWordInGrammar(g, "d"));
            Assert.IsFalse(GrammarUtilities.isWordInGrammar(g, "abcc"));
            Assert.IsFalse(GrammarUtilities.isWordInGrammar(g, "cba"));
            Assert.IsFalse(GrammarUtilities.isWordInGrammar(g, "ababababababababababababababababababab"));
        }
        public AcceptanceResult <S> IsWordAccepted(IEnumerable <A> word)
        {
            var wordAsString = string.Join("", word.Select(w => w.ToString()));

            if (noWordIsAccepted)
            {
                return(AcceptanceResult <S> .NoAcceptance());
            }
            var res = contextFreeGrammarsInCNF.Select(cfg => new KeyValuePair <string, bool>(cfg.Key, cfg.Value != null && GrammarUtilities.isWordInGrammar(cfg.Value, wordAsString))).ToList();

            return(new AcceptanceResult <S>(res.ToDictionary(k => k.Key, k => k.Value)));
        }
        public GrammarToCNFProblem(ContextFreeGrammar grammar)
        {
            this.grammar = grammar;

            sol = GrammarUtilities.getEquivalentCNF(grammar);
        }