Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        public AutomatonState AddState(string stateName)
        {
            var state = new AutomatonState()
            {
                Name = stateName
            };

            Graph.AddVertex(state);
            States[stateName] = state;
            return(state);
        }
Пример #4
0
        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));
            }
        }