public IEnumerable <string> CharacteristicSet(AutomatonState v1, AutomatonState v2) { var queue = new Queue <CharacteristicSetQueueItem>(); queue.Enqueue(new CharacteristicSetQueueItem() { V1 = v1, V2 = v2 }); while (queue.Count > 0) { var item = queue.Dequeue(); foreach (var input in Graph.OutEdges(item.V1).Concat(Graph.OutEdges(item.V2)).Select(e => e.Input)) { var v1Next = Next(item.V1, input); var v2Next = Next(item.V2, input); if (v1Next.Item2 != v2Next.Item2) { return(item.Path.Concat(input)); } else { queue.Enqueue(new CharacteristicSetQueueItem() { V1 = v1Next.Item1, V2 = v2Next.Item1, Path = item.Path.Concat(input) }); } } } return(null); }
public AutomatonEdge AddTransition(AutomatonState from, AutomatonState to, string input, string output) { var edge = new AutomatonEdge(from, to) { Input = input, Output = output }; Graph.AddEdge(edge); return(edge); }
public AutomatonState AddState(string stateName) { var state = new AutomatonState() { Name = stateName }; Graph.AddVertex(state); States[stateName] = state; return(state); }
public Tuple <AutomatonState, string> Next(AutomatonState current, string input) { var edge = Graph.OutEdges(current).SingleOrDefault(e => e.Input == input); if (edge != null) { return(new Tuple <AutomatonState, string>(edge.Target, edge.Output)); } else { return(new Tuple <AutomatonState, string>(current, DefaultOutput)); } }