Пример #1
0
        public void TestEndsWith1()
        {
            var sp = new State("p");
            var sq = new State("q");
            var i0 = new Symbol("0");
            var i1 = new Symbol("1");

            var states = new HashSet <State> {
                sp, sq
            };
            var alphabet = new Alphabet(new HashSet <Symbol> {
                i0, i1
            });
            var transitionFunction = new NondeterministicFiniteTransitionFunction(new HashSet <NondeterministicFinitePartialTransitionFunction>
            {
                new NondeterministicFinitePartialTransitionFunction(sp, i0, new HashSet <State> {
                    sp
                }),
                new NondeterministicFinitePartialTransitionFunction(sp, i1, new HashSet <State> {
                    sp, sq
                }),
                new NondeterministicFinitePartialTransitionFunction(sq, i0, new HashSet <State> ()),
                new NondeterministicFinitePartialTransitionFunction(sq, i1, new HashSet <State> ())
            });
            var acceptStates = new HashSet <State> {
                sq
            };

            // Ends with a 1
            var automaton = new NondeterministicFiniteAutomaton(
                states,
                alphabet,
                transitionFunction,
                sp,
                acceptStates
                );

            var negative = Word.Parse("0000111010011010", alphabet);
            var positive = Word.Parse("0011100101001001", alphabet);

            Assert.False(automaton.Accepts(negative));
            Assert.True(automaton.Accepts(positive));

            for (var i = 0; i < 10; i++)
            {
                var randomNegative = Word.Parse(string.Join("", Enumerable.Range(1, Random.Next(20)).Select(_ => Random.Next(2))) + "0", alphabet);
                var randomPositive = Word.Parse(string.Join("", Enumerable.Range(1, Random.Next(20)).Select(_ => Random.Next(2))) + "1", alphabet);
                Assert.False(automaton.Accepts(randomNegative));
                Assert.True(automaton.Accepts(randomPositive));
            }
        }
 public NondeterministicFiniteAutomaton(HashSet <State> states, Alphabet inputAlphabet, NondeterministicFiniteTransitionFunction transitionFunction, State initialState, HashSet <State> acceptStates)
     : base(states, inputAlphabet, initialState, acceptStates)
     => TransitionFunction = transitionFunction;
Пример #3
0
        public void Test2Or3()
        {
            var s0 = new State("0");
            var s1 = new State("1");
            var s2 = new State("2");
            var s3 = new State("3");
            var s4 = new State("4");
            var s5 = new State("5");

            var i0 = new Symbol("0");

            var states = new HashSet <State> {
                s0, s1, s2, s3, s4, s5
            };
            var initialState = s0;
            var alphabet     = new Alphabet(new HashSet <Symbol> {
                i0
            });
            var acceptStates = new HashSet <State> {
                s1, s3
            };
            var transitionFunction = new NondeterministicFiniteTransitionFunction(new HashSet <NondeterministicFinitePartialTransitionFunction>
            {
                new NondeterministicFinitePartialTransitionFunction(s0, Symbol.EPSILON, new HashSet <State> {
                    s1, s3
                }),
                new NondeterministicFinitePartialTransitionFunction(s1, i0, new HashSet <State> {
                    s2
                }),
                new NondeterministicFinitePartialTransitionFunction(s2, i0, new HashSet <State> {
                    s1
                }),
                new NondeterministicFinitePartialTransitionFunction(s3, i0, new HashSet <State> {
                    s4
                }),
                new NondeterministicFinitePartialTransitionFunction(s4, i0, new HashSet <State> {
                    s5
                }),
                new NondeterministicFinitePartialTransitionFunction(s5, i0, new HashSet <State> {
                    s3
                })
            });

            // Contains 2 or 3 zeros
            var automaton = new NondeterministicFiniteAutomaton(
                states,
                alphabet,
                transitionFunction,
                initialState,
                acceptStates);

            var negative = Word.Parse("00000", alphabet);
            var positive = Word.Parse("000", alphabet);

            Assert.False(automaton.Accepts(negative));
            Assert.True(automaton.Accepts(positive));

            for (var i = 0; i < 10; i++)
            {
                var unknown = Word.Parse(string.Join("", Enumerable.Repeat(0, Random.Next(5, 20))), alphabet);

                if (unknown.Count() % 3 == 0 || unknown.Count() % 2 == 0)
                {
                    Assert.True(automaton.Accepts(unknown));
                }
                else
                {
                    Assert.False(automaton.Accepts(unknown));
                }
            }
        }