public void Should_ReturnsNegative_When_CompareTo_Transition()
        {
            FAState state  = new FAState("State1");
            FAState state2 = new FAState("State2");

            FATransition transition1 = new FATransition('a', state, state2);
            FATransition transition2 = new FATransition('b', state, state2);

            Assert.AreEqual(-1, transition1.CompareTo(transition2));
        }
        public void Should_ReturnsZero_When_CompareTo_Transition()
        {
            FAState state  = new FAState("State1");
            FAState state2 = new FAState("State2");

            FATransition transition1 = new FATransition('a', state, state2);
            FATransition transition2 = new FATransition('a', state, state2);

            Assert.Zero(transition1.CompareTo(transition2));
        }
Ejemplo n.º 3
0
        public void Should_ReturnFalse_When_AddTransition_WithNullFATransition()
        {
            List <char> alphabet = new List <char>()
            {
                'a'
            };
            FiniteAutomata automata = new FiniteAutomata(FiniteAutomataType.DFA, alphabet);

            FATransition transition = null;

            Assert.False(automata.AddTransition(transition));
        }
Ejemplo n.º 4
0
        public void Should_ReturnTrue_When_AddTransition_WithFATranstion()
        {
            List <char> alphabet = new List <char>()
            {
                'a'
            };
            FiniteAutomata automata = new FiniteAutomata(FiniteAutomataType.DFA, alphabet);

            FAState      state1     = new FAState("q1", isInitialState: true, isFinalState: true);
            FATransition transition = new FATransition('a', state1, state1);

            Assert.True(automata.AddTransition(transition));
        }
Ejemplo n.º 5
0
        public void Should_ReturnTrue_When_AddTransition_MultipleToStatesInNFA()
        {
            List <char> alphabet = new List <char>()
            {
                'a'
            };
            FiniteAutomata automata = new FiniteAutomata(FiniteAutomataType.NFA, alphabet);

            FAState state1 = new FAState("q1", isInitialState: true, isFinalState: true);
            FAState state2 = new FAState("q2");

            List <FAState> states = new List <FAState>()
            {
                state1, state2
            };

            FATransition transition = new FATransition('a', state1, states);

            Assert.True(automata.AddTransition(transition));
        }
Ejemplo n.º 6
0
        private FiniteAutomata InsertLeftDirectionStates(FiniteAutomata TWDFA, FiniteAutomata DFA)
        {
            IEnumerable <FATransition> leftTransitions     = TWDFA.Transitions.Where(x => !x.Direction);
            Queue <FATransition>       leftTransitionQueue = new Queue <FATransition>(leftTransitions);

            do
            {
                FATransition transition = leftTransitionQueue.Dequeue();
                FAState      toState    = transition.ToState.First();
                IEnumerable <FATransition> l0Transitions = TWDFA.Transitions.Where(x => x.FromState == toState);
                FAState targetState = null;
                if (l0Transitions.Any(x => !x.Direction))
                {
                    IEnumerable <FATransition> l1Transitions = l0Transitions.Where(x => !x.Direction);
                    if (l1Transitions.Count() > 1)
                    {
                        leftTransitionQueue.Enqueue(transition);
                    }
                    else
                    {
                        FATransition l1Transition = l1Transitions.First();
                        FAState      l1State      = l1Transition.FromState;

                        targetState = GetOptimalState(l1State, l0Transitions, DFA);
                    }
                }
                else
                {
                    targetState = GetOptimalState(toState, l0Transitions, DFA);
                }

                FATransition newTransition = new FATransition(transition.TransitionSymbol, transition.FromState, targetState);
                _ = DFA.AddTransition(newTransition);
            } while (leftTransitionQueue.Count > 0);

            return(DFA);
        }
Ejemplo n.º 7
0
        /// <summary>
        /// Converts NFA transitions into the DFA transition, except initial state.
        /// </summary>
        /// <param name="NFA"></param>
        /// <param name="DFA"></param>
        /// <returns>Updated DFA object.</returns>
        private FiniteAutomata Convert(FiniteAutomata NFA, FiniteAutomata DFA)
        {
            Queue <FAState> statesQueue = new Queue <FAState>();

            // TR: Initial state tarafından eklenen tüm stateleri bulup kuyruğa ekler.
            IEnumerable <FAState> states = DFA.States.Where(x => !x.IsInitialState);

            foreach (FAState state in states)
            {
                statesQueue.Enqueue(state);
            }

            // TR: Kuyruktaki tüm nesneler için çalışır.
            do
            {
                // TR: Kuyruktan sıradaki eleman getirilir.
                FAState fromState = statesQueue.Dequeue();

                // TR: DFA olduğu için tüm geçişler kullanılmalıdır.
                foreach (char symbol in DFA.Alphabet)
                {
                    string[] subStateNames = fromState.StateName.Split(STATE_SEPARATOR);

                    List <string> newStateNames = new List <string>();
                    bool          isFinalState  = false;

                    foreach (string subStateName in subStateNames)
                    {
                        FAState      subState      = NFA.States.First(x => x.StateName == subStateName);
                        FATransition subTransition = NFA.Transitions.FirstOrDefault(x => x.FromState == subState && x.TransitionSymbol == symbol);

                        IEnumerable <FAState> subToStates = subTransition.ToState;
                        newStateNames.AddNotExists(subToStates.Select(x => x.StateName));

                        // TR: Herhangi bir state final state ise bu state final olmalıdır.
                        if (!isFinalState)
                        {
                            isFinalState = subToStates.Any(state => state.IsFinalState);
                        }
                    }

                    // TR: Stateleri aralarına ayraç koyarak birleştirir.
                    string newStateName = string.Join(STATE_SEPARATOR, newStateNames.OrderBy(x => x));

                    // TR: Hedef state yoksa oluşturulur.
                    FAState targetState;
                    if (!DFA.States.Any(x => x.StateName == newStateName))
                    {
                        targetState = new FAState(newStateName, isFinalState: isFinalState);
                        _           = DFA.AddState(targetState);

                        // TR: Olmayan item kuyruğa da eklenir.
                        statesQueue.Enqueue(targetState);
                    }
                    else
                    {
                        targetState = DFA.States.First(x => x.StateName == newStateName);
                    }

                    _ = DFA.AddTransition(symbol, fromState.StateName, targetState.StateName);
                }
            } while (statesQueue.Count > 0);

            return(DFA);
        }