public Automaton ConvertToDFA() { List <State> NewListStates = new List <State>(); List <Transition> NewListTransitions = new List <Transition>(); State Sink = new State("Sink"); foreach (State s in ListStates) { s.GetReachableState(ListAlphabets, ListTransitions); } if (ListTransitions.Exists(x => x.GetLeftState().IsInitial&& x.GetSymbol().Label == "_")) { return(ConvertToDFAWithEpsilonMove(NewListStates, NewListTransitions, Sink)); } else { return(ConvertToDFAWithoutEpsilonMove(NewListStates, NewListTransitions, Sink)); } }
private Automaton ConvertToDFAWithEpsilonMove(List <State> states, List <Transition> transitions, State Sink) { List <State> initialStatesUsedEpsilon = new List <State>(); ListTransitions.FindAll(x => x.GetLeftState().IsInitial&& x.GetSymbol().Label == "_").ForEach(x => initialStatesUsedEpsilon.Add(x.GetLeftState())); foreach (var ini_eps in initialStatesUsedEpsilon) { List <Transition> processedtransitions = new List <Transition>(); List <State> epsilon_closure_of_ini_eps = ini_eps.GetEpsilonClosure(ListTransitions, processedtransitions); State newini = new State($"{String.Join("", epsilon_closure_of_ini_eps)}"); newini.IsInitial = true; if (epsilon_closure_of_ini_eps.Exists(x => x.IsFinal)) { newini.IsFinal = true; } states.Add(newini); ProcessDFA(epsilon_closure_of_ini_eps, states, transitions, Sink, newini); } return(new Automaton(ListAlphabets, states, transitions, null, null)); }
private bool isDFA() { if (ListTransitions.Exists(x => x.GetSymbol().Label == "_")) { return(false); } foreach (Alphabet alp in ListAlphabets) { List <Transition> list_transitions_contain_alp = ListTransitions.FindAll(x => x.GetSymbol().Label == alp.Character); List <State> list_states = new List <State>(); foreach (Transition trans in list_transitions_contain_alp) { list_states.Add(trans.GetLeftState()); } bool are_2lists_equal = (list_states.All(ListStates.Contains) && list_states.Count == ListStates.Count); if (!are_2lists_equal) { return(false); } } return(true); }
private List <Transition> AvailableTransition(State current) { return(ListTransitions.FindAll(x => x.GetLeftState() == current)); }