private static void AssertAutomaton(Automaton a) { Automaton clone = (Automaton)a.Clone(); // complement(complement(a)) = a Automaton equivalent = BasicOperations.Complement(BasicOperations.Complement(a)); Assert.IsTrue(BasicOperations.SameLanguage(a, equivalent)); // a union a = a equivalent = BasicOperations.Union(a, clone); Assert.IsTrue(BasicOperations.SameLanguage(a, equivalent)); // a intersect a = a equivalent = BasicOperations.Intersection(a, clone); Assert.IsTrue(BasicOperations.SameLanguage(a, equivalent)); // a minus a = empty Automaton empty = BasicOperations.Minus(a, clone); Assert.IsTrue(BasicOperations.IsEmpty(empty)); // as long as don't accept the empty string // then optional(a) - empty = a if (!BasicOperations.Run(a, "")) { //System.out.println("test " + a); Automaton optional = BasicOperations.Optional(a); //System.out.println("optional " + optional); equivalent = BasicOperations.Minus(optional, BasicAutomata.MakeEmptyString()); //System.out.println("equiv " + equivalent); Assert.IsTrue(BasicOperations.SameLanguage(a, equivalent)); } }
/// <summary> /// See <see cref="BasicOperations.Optional(Automaton)"/>. /// </summary> public virtual Automaton Optional() { return(BasicOperations.Optional(this)); }