예제 #1
0
        public void SimplePalTest()
        {
            var q  = new States(3);
            var f  = new AcceptingStates(q[2]);
            var tf = new PushdownTransitionFunction()
            {
                new PushdownTransition(q[0], 'a', Alphabet.Z, q[0], $"a{Alphabet.Z}"),
                new PushdownTransition(q[0], 'b', Alphabet.Z, q[0], $"b{Alphabet.Z}"),
                new PushdownTransition(q[0], 'a', 'a', q[0], "aa"),
                new PushdownTransition(q[0], 'b', 'b', q[0], "bb"),
                new PushdownTransition(q[0], 'b', 'a', q[0], "ba"),
                new PushdownTransition(q[0], 'a', 'b', q[0], "ab"),
                new PushdownTransition(q[0], 'c', 'a', q[1], "a"),
                new PushdownTransition(q[0], 'c', 'b', q[1], "b"),
                new PushdownTransition(q[0], 'c', Alphabet.Z, q[1], $"{Alphabet.Z}"),
                new PushdownTransition(q[1], 'a', 'a', q[1], Alphabet.EmptyString.ToString()),
                new PushdownTransition(q[1], 'b', 'b', q[1], Alphabet.EmptyString.ToString()),
                new PushdownTransition(q[1], Alphabet.EmptyString, Alphabet.Z, q[2], Alphabet.Z.ToString())
            };
            var m = new PushdownAutomaton(q, Alphabet.Abc, new StackAlphabet(Alphabet.Abc), tf, q[0], f);

            Assert.True(m.Run("aca"));
            Assert.True(m.Run("abacaba"));
            Assert.True(m.Run("c"));
            Assert.True(m.Run("bacab"));
            Assert.False(m.Run("ab"));
            Assert.False(m.Run("babb"));
            Assert.False(m.Run("acab"));
            Assert.False(m.Run("bacba"));
        }
예제 #2
0
        // {0^n1^n | n >= 0}
        public void ZeroNOneNTest()
        {
            var q  = new States(3);
            var f  = new AcceptingStates(q[0], q[2]);
            var tf = new PushdownTransitionFunction()
            {
                new PushdownTransition(q[0], '0', Alphabet.Z, q[0], $"0{Alphabet.Z}"),
                new PushdownTransition(q[0], '0', '0', q[0], "00"),
                new PushdownTransition(q[0], '1', '0', q[1], new [] { Alphabet.EmptyString }),
                new PushdownTransition(q[1], '1', '0', q[1], new [] { Alphabet.EmptyString }),
                new PushdownTransition(q[1], Alphabet.EmptyString, Alphabet.Z, q[2], new [] { Alphabet.Z })
            };
            var m = new PushdownAutomaton(q, Alphabet.Binary, new StackAlphabet(Alphabet.Binary), tf, q[0], f);

            Assert.True(m.Run(""));
            Assert.True(m.Run("0011"));
            Assert.True(m.Run("01"));
            Assert.True(m.Run("0000011111"));
            Assert.False(m.Run("011010"));
            Assert.False(m.Run("101010001"));
            Assert.False(m.Run("111000"));
        }