/// <summary> /// Creates new state to the automata. ( This version takes State object as a parameter.) /// </summary> /// <param name="state">Previously created automata state object.</param> /// <returns>Returns the result of add operation is success or fail.</returns> public bool AddState(FAState state) { if (state is null) { return(false); } bool hasInitialState = this.States.Any(x => x.IsInitialState); // TR: Önceden eklenmiş bir başlangıç durumu varsa ve bu durumda başlangıç durumu olarak eklenmek isteniyorsa buradan geri dön. if ((hasInitialState && state.IsInitialState)) { return(false); throw new MultipleFAInitalStateException(); } if (States.Contains(state)) { return(false); throw new DuplicateFAStateException(); } this._states.Add(state); return(true); }
/// <summary> /// Runs the finite automata with input, then returns true if input is accepted. /// </summary> /// <param name="input">Input string.</param> /// <returns>If input is valid for the finite automata, that will be return true otherwise false.</returns> public bool Run(string input) { if (!IsValid) { return(false); } FAState currentState = InitialState; FATransition currentTransition; foreach (char letter in input) { Console.Write("Transition {0} - {1} >>> ", letter, currentState.StateName); currentTransition = this.Transitions.FirstOrDefault(x => x.FromState.StateName == currentState.StateName && x.TransitionSymbol == letter); currentState = currentTransition.ToState.RandomState(); Console.WriteLine(currentState.StateName); } Console.WriteLine("Current State is {0}.(Final State: {1})", currentState.StateName, currentState.IsFinalState ? "Yes" : "No"); if (currentState.IsFinalState) { return(true); } return(false); }
/// <summary> /// Creates new state to the automata. /// </summary> /// <param name="stateName">Name of the state.</param> /// <param name="isInitialState">Is the new state inital state?</param> /// <param name="isFinalState">Is the new state final state?</param> /// <returns></returns> public bool AddState(string stateName, bool isInitialState = false, bool isFinalState = false) { bool hasInitialState = this.States.Any(x => x.IsInitialState); // TR: Önceden eklenmiş bir başlangıç durumu varsa ve bu durumda başlangıç durumu olarak eklenmek isteniyorsa buradan geri dön. if ((hasInitialState && isInitialState)) { return(false); throw new MultipleFAInitalStateException(); } if (this.GetStateByName(stateName) != null) { return(false); throw new DuplicateFAStateException(); } FAState state = new FAState(stateName, isInitialState, isFinalState); this._states.Add(state); return(true); }
/// <summary> /// Initializes Finite Automata Transition Object /// </summary> /// <param name="transitionSymbol">Symbol from alphabet that shows which transition will be </param> /// <param name="fromState">Shows transition source state</param> /// <param name="toState">Shows transition destination states.A state will be chosen when runtime.(Multiple value allowed for Non-deterministic FA)</param> /// <param name="direction"> Automata direction 0= Left, 1= Right</param> public FATransition(char transitionSymbol, FAState fromState, IEnumerable <FAState> toState, bool direction) { this._transitionSymbol = transitionSymbol; this._fromState = fromState; this._toState = toState; this._direction = direction; }
public bool UpdateState(FAState state) { FAState previousState = this.GetStateByName(state.StateName); this._states.Remove(previousState); this._states.Add(state); return(true); }
/// <summary> /// Initializes Finite Automata Transition Object /// </summary> /// <param name="transitionSymbol">Symobl from alphabet that shows which transition will be </param> /// <param name="fromState">Shows transition source state</param> /// <param name="toState">Shows transition destination state </param> public FATransition(char transitionSymbol, FAState fromState, FAState toState) { this._transitionSymbol = transitionSymbol; this._fromState = fromState; this._toState = new List <FAState>() { toState }; }
/// <summary> /// Creates new state to the automata. /// </summary> /// <param name="isInitialState">Is the new state inital state?</param> /// <param name="isFinalState">Is the new state final state?</param> /// <returns>Returns the result of add operation is success or fail.</returns> public bool AddState(bool isInitialState = false, bool isFinalState = false) { bool hasInitialState = this.States.Any(x => x.IsInitialState); // TR: Önceden eklenmiş bir başlangıç durumu varsa ve bu durumda başlangıç durumu olarak eklenmek isteniyorsa buradan geri dön. if ((hasInitialState && isInitialState)) { return(false); throw new MultipleFAInitalStateException(); } string stateName = string.Concat("Q", _stateCounter++); FAState state = new FAState(stateName, isInitialState, isFinalState); this._states.Add(state); return(true); }
/// <summary> /// Gets automata state by state name. /// </summary> /// <param name="name">A state name which will be get.</param> /// <returns>Returns FAState object by state name.</returns> private FAState GetStateByName(string name) { FAState state = this.States.FirstOrDefault(x => x.StateName.ToLower() == name.ToLower()); return(state); }
/// <summary> /// Creates new transition link between states. /// </summary> /// <param name="symbol">Transition Symbol</param> /// <param name="fromStateName">Where will be transited from? State Name</param> /// <param name="toStateName">Where will be transited to? State Name ( Multiple values must be separated by comma: ",")</param> /// <returns>Returns the result of add operation is success or fail.</returns> public bool AddTransition(char symbol, string fromStateName, string toStateName, int direction = -1) { string[] toStateArray = toStateName.Split(','); if (AutomataType == FiniteAutomataType.DFA && toStateArray.Length > 1) { return(false); } // TR: Yapılacak geçiş, geçiş alfabesinde yoksa buradan geri dön. if (!_alphabet.Contains(symbol)) { return(false); throw new InvalidFALetterException(); } // TR: Kaynak durumu adına göre bul. FAState fromState = this.GetStateByName(fromStateName); if (fromState == null) { return(false); } // TR: Hedef durumları adına göre bul. List <FAState> toStatesList = new List <FAState>(); foreach (string selectedState in toStateArray) { FAState toState = this.GetStateByName(selectedState); if (toState == null) { return(false); } toStatesList.Add(toState); } FATransition transitionModel = null; if (direction == 0 || direction == 1) { transitionModel = new FATransition(symbol, fromState, toStatesList, direction == 1); } else { // TR: Geçiş nesnesini oluştur. transitionModel = new FATransition(symbol, fromState, toStatesList); } // TR: Geçiş daha önce tanımlanmışsa hata fırlat. bool hasTransition = this._transitions.Any(x => x.CompareTo(transitionModel) == 0); if (hasTransition) { return(false); throw new DuplicateFATransactionException(); } this._transitions.Add(transitionModel); return(true); }
/// <summary> /// Initializes Finite Automata Transition Object /// </summary> /// <param name="transitionSymbol">Symbol from alphabet that shows which transition will be </param> /// <param name="fromState">Shows transition source state</param> /// <param name="toState">Shows transition destination states.A state will be chosen when runtime.(Multiple value allowed for Non-deterministic FA) </param> public FATransition(char transitionSymbol, FAState fromState, IEnumerable <FAState> toState) { this._transitionSymbol = transitionSymbol; this._fromState = fromState; this._toState = toState; }