public static Automaton Optional(Automaton a) { a = a.CloneExpandedIfRequired(); var s = new State(); s.AddEpsilon(a.Initial); s.Accept = true; a.Initial = s; a.IsDeterministic = false; a.ClearHashCode(); a.CheckMinimizeAlways(); return(a); }
public static Automaton Complement(Automaton a) { a = a.CloneExpandedIfRequired(); a.Determinize(); a.Totalize(); foreach (var p in a.GetStates()) { p.Accept = !p.Accept; } a.RemoveDeadTransitions(); return(a); }
public static Automaton Concatenate(Automaton a1, Automaton a2) { if (a1.IsSingleton && a2.IsSingleton) { return(BasicAutomata.MakeString(a1.Singleton + a2.Singleton)); } if (IsEmpty(a1) || IsEmpty(a2)) { return(BasicAutomata.MakeEmpty()); } var deterministic = a1.IsSingleton && a2.IsDeterministic; if (a1 == a2) { a1 = a1.CloneExpanded(); a2 = a2.CloneExpanded(); } else { a1 = a1.CloneExpandedIfRequired(); a2 = a2.CloneExpandedIfRequired(); } foreach (var s in a1.GetAcceptStates()) { s.Accept = false; s.AddEpsilon(a2.Initial); } a1.IsDeterministic = deterministic; a1.ClearHashCode(); a1.CheckMinimizeAlways(); return(a1); }