public string Execute(string input, bool print_trace)
        {
            StringBuilder tape          = new StringBuilder(input);
            int           pos           = 0;
            State         current_state = this.start_state;

            Console.WriteLine($"Initial Tape State : {tape.ToString()}");

            // Turing machine iterator
            while (true)
            {
                State prev_state  = current_state;
                char  tape_symbol = tape[pos];
                var   key         = transition_function.GetInput(current_state, tape_symbol);

                if (key == null)
                {
                    Console.WriteLine($"Machine was halted, trap state reached (Missing transition), Final contents : \'{tape.ToString()}\'");
                    return(tape.ToString());
                }

                TransitionOutput output = transition_function.Transitions[key];


                tape[pos] = output.Symbol;
                pos      += (output.Direction == Directions.Left) ? -1 : 1;
                string dir = (output.Direction == Directions.Left) ? "<-" : "->";
                current_state = output.State;
                if (pos < 0)
                {
                    tape.Insert(0, this.blank);
                    pos = 0;
                }
                else if (pos >= tape.Length)
                {
                    tape.Insert(tape.Length, this.blank);
                }
                //Console.WriteLine($"Current State is \'{prev_state.Name}\', Read a symbol \'{tape_symbol}\', Transitioned to state \'{current_state.Name}\', Wrote Symbol \'{output.Symbol}\', Moved Tape {dir}");
                //Console.WriteLine($"Current State is \'{prev_state.Name}\', Read a symbol \'{tape_symbol}\', Transitioned to state \'{current_state.Name}\', Wrote Symbol \'{output.Symbol}\', Moved Tape {dir}");
                Console.WriteLine($"({prev_state.Name},{tape_symbol}) = ({current_state.Name}, {output.Symbol}, {dir})");
                //Console.WriteLine($"New State of tape : Pos is \'{pos}\', Content is : \'{tape.ToString()}\'");
                Console.WriteLine($"{tape.ToString()}");
                Console.WriteLine($"{new String(' ', pos)}^");
                Console.WriteLine();

                // String was accepted
                if (current_state.Final)
                {
                    Console.WriteLine($"String was accepted, Final contents : \'{tape.ToString()}\'");
                    return(tape.ToString());
                }
            }
        }
 public void AddTransition(TransitionInput input, TransitionOutput output)
 {
     transition_function.AddTransition(input, output);
 }
Ejemplo n.º 3
0
 public void AddTransition(TransitionInput input, TransitionOutput output)
 {
     transitions.Add(input, output);
     transition_inputs.Add(new Tuple <State, char>(input.State, input.Symbol), input);
 }