/// <summary> /// Hàm chuyển trạng thái mở rộng /// </summary> /// <param name="w"> Chuỗi nhập vào </param> /// <returns></returns> public virtual Tập_Hợp <State> deltaStar(string w) { var Q = Tập_Hợp <State> .Rỗng(); var q = this.q0; foreach (var c in w) { if (!Q.Any()) { Q += delta(q, c); } else { var @new = Tập_Hợp <State> .Rỗng(); foreach (var r in Q) { @new = @new + delta(r, c); } Q = @new; } } return(Q); }
/// <summary> /// A hợp B /// </summary> /// <param name="A"></param> /// <param name="B"></param> /// <returns></returns> public static Tập_Hợp <T> operator +(Tập_Hợp <T> A, Tập_Hợp <T> B) { var C = new Tập_Hợp <T>(); C.AddRange(A); C.AddRange(B); return(C); }
/// <summary> /// A giao B /// </summary> /// <param name="A"></param> /// <param name="B"></param> /// <returns></returns> public static Tập_Hợp <T> operator ^(Tập_Hợp <T> A, Tập_Hợp <T> B) { var C = new Tập_Hợp <T>(); foreach (var x in A) { if (B.Contains(x)) { C.Add(x); } } return(C); }
public Tập_Hợp <State> EpsilonClosure(State b) { var vertices = new Tập_Hợp <State> { b }; while (true) { var previousCount = vertices.Count; if (vertices.Count == previousCount) { break; } } return(vertices); }
static void BinaryMachine() { var binaryMachine = new NFA() { q0 = State.q0, F = new Tập_Hợp <State>() { State.q2, State.q4 }, }; binaryMachine.delta = (q, c) => { var Q = new Tập_Hợp <State>(); switch (q) { case State.q0: if (c == '0') { return new Tập_Hợp <State> { State.q0, State.q3 } } ; else { return new Tập_Hợp <State>() { State.q0, State.q1 } }; case State.q1: if (c == '0') { return new Tập_Hợp <State> { } } ; else { return new Tập_Hợp <State> { State.q2 } }; case State.q2: if (c == '0') { return new Tập_Hợp <State> { State.q2 } } ; else { return new Tập_Hợp <State> { State.q2 } }; case State.q3: if (c == '0') { return new Tập_Hợp <State> { State.q4 } } ; else { return new Tập_Hợp <State> { } }; case State.q4: if (c == '0') { return new Tập_Hợp <State> { State.q4 } } ; else { return new Tập_Hợp <State> { State.q4 } }; default: break; } return(Q); }; var s1 = "01"; var s2 = "01001"; Console.WriteLine("Accept : " + s1 + " --> " + binaryMachine.Accept(s1)); Console.WriteLine("--------------"); Console.WriteLine("Accept : " + s2 + " --> " + binaryMachine.Accept(s2)); Console.ReadKey(); }