Esempio n. 1
0
        public void TestDPDARunnerForFinalStateAndEmptyStack()
        {
            var dpda = new PDA <char, char>(new AcceptanceCondition.FinalStateAndEmptyStack(), true, 'Z', false, "ZXY");

            dpda.AddState(1, false);
            dpda.AddState(2, true);

            dpda.AddTransition().From(0).To(0).Read('a').Pop('Z').Push("XZ");
            dpda.AddTransition().From(0).To(0).Read('a').Pop('X').Push("XX");
            dpda.AddTransition().From(0).To(0).Read('a').Pop('Y').Push("XY");
            dpda.AddTransition().From(0).To(0).Read('b').Pop('Z').Push("YZ");
            dpda.AddTransition().From(0).To(0).Read('b').Pop('X').Push("YX");
            dpda.AddTransition().From(0).To(0).Read('b').Pop('Y').Push("YY");

            dpda.AddTransition().From(0).To(1).Read('v').Pop('Z').Push("Z");
            dpda.AddTransition().From(0).To(1).Read('v').Pop('X').Push("X");
            dpda.AddTransition().From(0).To(1).Read('v').Pop('Y').Push("Y");

            dpda.AddTransition().From(1).To(1).Read('a').Pop('X').Push();
            dpda.AddTransition().From(1).To(1).Read('b').Pop('Y').Push();
            dpda.AddTransition().From(1).To(2).Read().Pop('Z').Push("");

            dpda.CreateRunner();

            Assert.IsFalse(dpda.AcceptsWord("").Accepts());
            Assert.IsFalse(dpda.AcceptsWord("ababababababvbabababababab").Accepts());
            Assert.IsTrue(dpda.AcceptsWord("abbabaababbabbbbbaaaaabbbbbabaaabbbabaaababbbabvbabbbabaaababbbaaababbbbbaaaaabbbbbabbabaababba").Accepts());
            Assert.IsTrue(dpda.AcceptsWord("abavaba").Accepts());
        }
Esempio n. 2
0
        public void TestPDA2()
        {
            var pda = new PDA <char, char>(new AcceptanceCondition.FinalState(), false, 'Z', false, "Z", furtherSymbol);

            pda.AddState(1, false);
            pda.AddState(2, false);
            pda.AddState(3, false);
            pda.AddState(4, false);
            pda.AddState(5, true);
            pda.AddTransition().From(0).To(0).Read().Pop('Z').Push("ZZ");
            pda.AddTransition().From(0).To(1).Read().Pop('Z').Push();
            pda.AddTransition().From(1).To(2).Read().Pop('Z').Push();
            pda.AddTransition().From(1).To(3).Read('a').Pop('Z').Push();
            pda.AddTransition().From(3).To(4).Read('a').Pop('Z').Push();
            pda.AddTransition().From(4).To(5).Read('a').Pop('Z').Push();
            pda.CreateRunner();

            Assert.IsTrue(pda.AcceptsWord("aaa").Accepts());
            Assert.IsFalse(pda.AcceptsWord("").Accepts());
            Assert.IsFalse(pda.AcceptsWord("a").Accepts());
            Assert.IsFalse(pda.AcceptsWord("aa").Accepts());
            Assert.IsFalse(pda.AcceptsWord("aaaa").Accepts());
            Assert.IsFalse(pda.AcceptsWord("aaaaa").Accepts());
            Assert.IsFalse(pda.AcceptsWord("b").Accepts());
            Assert.IsFalse(pda.AcceptsWord("ab").Accepts());
            Assert.IsFalse(pda.AcceptsWord("aab").Accepts());
            Assert.IsFalse(pda.AcceptsWord("aaab").Accepts());
        }
Esempio n. 3
0
        public void TestPDAManyInfLoops()
        {
            var pda = new PDA <char, char>(new AcceptanceCondition.EmptyStack(), false, 'Z', false, "ZX", furtherSymbol);

            pda.AddState(1, false);
            pda.AddState(2, false);
            pda.AddState(3, false);
            pda.AddState(4, false);
            pda.AddState(5, false);
            pda.AddTransition().From(0).To(0).Read().Pop('Z').Push("XZ");
            pda.AddTransition().From(0).To(0).Read().Pop('X').Push("XX");
            pda.AddTransition().From(1).To(1).Read().Pop('X').Push("XX");
            pda.AddTransition().From(2).To(2).Read().Pop('X').Push("XX");
            pda.AddTransition().From(3).To(3).Read().Pop('X').Push("XX");
            pda.AddTransition().From(4).To(4).Read().Pop('X').Push("XX");
            pda.AddTransition().From(5).To(5).Read().Pop('X').Push("XX");

            pda.AddTransition().From(0).To(1).Read().Pop('X').Push("XX");
            pda.AddTransition().From(1).To(2).Read().Pop('X').Push("XX");
            pda.AddTransition().From(2).To(3).Read().Pop('X').Push("XX");
            pda.AddTransition().From(3).To(4).Read().Pop('X').Push("XX");
            pda.AddTransition().From(4).To(5).Read().Pop('X').Push("XX");
            pda.AddTransition().From(5).To(1).Read().Pop('X').Push("XX");
            pda.AddTransition().From(0).To(3).Read().Pop('X').Push("XX");
            pda.AddTransition().From(2).To(5).Read().Pop('X').Push("XX");
            pda.AddTransition().From(5).To(2).Read().Pop('X').Push("XX");
            pda.CreateRunner();

            Assert.IsFalse(pda.AcceptsWord("").Accepts());
            Assert.IsFalse(pda.AcceptsWord("a").Accepts());
            Assert.IsFalse(pda.AcceptsWord("aa").Accepts());
            Assert.IsFalse(pda.AcceptsWord("aaaa").Accepts());
        }
Esempio n. 4
0
        public void TestPerformance()
        {
            var pdaWithShorterSequence = new PDA <char, char>(new AcceptanceCondition.EmptyStack(), false, 'Z', false, "ZXY");

            pdaWithShorterSequence.AddState(1, false);
            pdaWithShorterSequence.AddTransition().From(0).To(0).Read().Pop('Z').Push("ZZZZZZZZZZZZ");
            pdaWithShorterSequence.AddTransition().From(0).To(1).Read().Pop('Z').Push("Z");
            pdaWithShorterSequence.AddTransition().From(1).To(1).Read().Pop('Z').Push();
            pdaWithShorterSequence.AddTransition().From(1).To(1).Read('a').Pop('Z').Push();
            pdaWithShorterSequence.CreateRunner();

            var stopwatch = new Stopwatch();

            stopwatch.Start();
            Assert.IsTrue(pdaWithShorterSequence.AcceptsWord("a").Accepts());
            stopwatch.Stop();
            Console.WriteLine("Runtime for shorter:" + stopwatch.Elapsed);

            var pdaWithLongerSequence = new PDA <char, char>(new AcceptanceCondition.EmptyStack(), false, 'Z', false, "ZXY");

            pdaWithLongerSequence.AddState(1, false);
            pdaWithLongerSequence.AddTransition().From(0).To(0).Read().Pop('Z').Push("ZZZZZZZZZZZZZZ");
            pdaWithLongerSequence.AddTransition().From(0).To(1).Read().Pop('Z').Push("Z");
            pdaWithLongerSequence.AddTransition().From(1).To(1).Read().Pop('Z').Push();
            pdaWithLongerSequence.AddTransition().From(1).To(1).Read('a').Pop('Z').Push();
            pdaWithLongerSequence.CreateRunner();

            var stopwatch2 = new Stopwatch();

            stopwatch2.Start();
            Assert.IsTrue(pdaWithLongerSequence.AcceptsWord("a").Accepts());
            stopwatch2.Stop();
            Console.WriteLine("Runtime for longer:" + stopwatch2.Elapsed);
        }
Esempio n. 5
0
        public static SimulationPath <A, S> RunSimulation(PDA <A, S> pda, A[] word)
        {
            var acceptanceResult = pda.AcceptsWord(word);

            if (!acceptanceResult.Accepts())
            {
                throw new NoAcceptanceException("the pda does not accept the word, therefore, a simulation is not possible");
            }

            var initialNode = SimulationNode <A, S> .InitialNode(
                new Configuration <A, S>(pda.InitialState, new Word <A>(word), CurrentStack <S> .WithSingleSymbol(pda.FirstStackSymbol)),
                pda.AcceptanceCondition);

            var frontChain = new List <SimulationNode <A, S> > {
                initialNode
            };

            while (frontChain.Count() > 0)
            {
                var nodesAcceptedWord = frontChain.Where(node => node.HasAcceptedWord).ToList();
                if (nodesAcceptedWord.Count() > 0)
                {
                    return(SimulationPathFromFinalNode(nodesAcceptedWord.First()));
                }

                foreach (var node in frontChain)
                {
                    node.DoStep();
                }

                frontChain = frontChain.SelectMany(node => node.Children).ToList();
            }
            throw new InvalidOperationException("the given pda does not accept the word, therefore a simulation is not possible");
        }
Esempio n. 6
0
        public void TestDPDARunnerForEmptyLanguage()
        {
            var dpda = new PDA <char, char>(new AcceptanceCondition.EmptyStack(), true, 'Z', false, "Z");

            dpda.AddTransition().From(0).To(0).Read().Pop('Z').Push("Z");

            dpda.CreateRunner();

            Assert.IsFalse(dpda.AcceptsWord("").Accepts());
        }
Esempio n. 7
0
        public void TestSlowPDA()
        {
            var pda = new PDA <char, char>(new AcceptanceCondition.EmptyStack(), false, 'Z', false, "ZYX");

            pda.AddTransition().From(0).To(0).Read().Pop('Z').Push("ZZZZZZZZZZ");
            pda.AddTransition().From(0).To(0).Read().Pop('Z').Push();
            pda.AddTransition().From(0).To(0).Read('a').Pop('Z').Push();

            pda.CreateRunner();

            Assert.IsTrue(pda.AcceptsWord("aaaaaaaaaaaaaaa").Accepts());
        }
Esempio n. 8
0
        public void TestPDA20()
        {
            var pda = new PDA <char, char>(new AcceptanceCondition.EmptyStack(), false, 'Z', false, "Z", furtherSymbol);

            pda.AddState(1, false);
            pda.AddTransition().From(0).To(0).Read().Pop('Z').Push("ZZ");
            pda.AddTransition().From(0).To(1).Read().Pop('Z').Push("ZZ");
            pda.AddTransition().From(1).To(0).Read().Pop('Z').Push("ZZ");
            pda.AddTransition().From(1).To(1).Read().Pop('Z').Push("ZZ");
            pda.CreateRunner();

            Assert.IsFalse(pda.AcceptsWord("").Accepts());
            Assert.IsFalse(pda.AcceptsWord("a").Accepts());
            Assert.IsFalse(pda.AcceptsWord("aa").Accepts());
            Assert.IsFalse(pda.AcceptsWord("aaa").Accepts());
            Assert.IsFalse(pda.AcceptsWord("aaaa").Accepts());
            Assert.IsFalse(pda.AcceptsWord("aaaaaaaaaa").Accepts());
            Assert.IsFalse(pda.AcceptsWord("b").Accepts());
            Assert.IsFalse(pda.AcceptsWord("ab").Accepts());
            Assert.IsFalse(pda.AcceptsWord("aab").Accepts());
        }
Esempio n. 9
0
        public void TestPDA13()
        {
            var pda = new PDA <char, char>(new AcceptanceCondition.FinalState(), false, 'Z', false, stackAlphabet, furtherSymbol);

            pda.AddState(1, false);
            pda.AddState(2, false);
            pda.AddTransition().From(0).To(0).Read().Pop('Z').Push("ZY");
            pda.AddTransition().From(0).To(1).Read().Pop('Z').Push("Z");
            pda.AddTransition().From(1).To(1).Read().Pop('Z').Push("ZX");
            pda.AddTransition().From(1).To(2).Read().Pop('Z').Push("Z");
            pda.AddTransition().From(2).To(2).Read().Pop('Z').Push();
            pda.AddTransition().From(2).To(2).Read().Pop('X').Push();
            pda.AddTransition().From(2).To(2).Read().Pop('Y').Push("Z");
            pda.CreateRunner();

            Assert.IsFalse(pda.AcceptsWord("").Accepts());
            Assert.IsFalse(pda.AcceptsWord("a").Accepts());
            Assert.IsFalse(pda.AcceptsWord("aa").Accepts());
            Assert.IsFalse(pda.AcceptsWord("aaa").Accepts());
            Assert.IsFalse(pda.AcceptsWord("aaaa").Accepts());
            Assert.IsFalse(pda.AcceptsWord("b").Accepts());
            Assert.IsFalse(pda.AcceptsWord("ab").Accepts());
            Assert.IsFalse(pda.AcceptsWord("aab").Accepts());
        }
Esempio n. 10
0
 private static int CheckWordsNotInLanguage(IEnumerable <string> words, HashSet <char> alphabet, PDA <char, char> pda, List <string> feedback)
 {
     return(CheckWords(words, alphabet, word => !pda.AcceptsWord(word).Accepts(), feedback, ErrorWordInLanguage));
 }