コード例 #1
0
 Sweep_Right_XthParm_MoveToNext(
     IEnumerable <State> undeterminedStates,
     List <string> NonHeaderLibrary)
 {
     foreach (State permState in undeterminedStates)
     {
         foreach (string nonheader in NonHeaderLibrary)
         {
             TransitionFunction permState_MoveToNext = new TransitionFunction(
                 permState.Actual, nonheader);
             permState_MoveToNext.DefineRange(permState.Actual, nonheader, SZMOVE_RIGHT);
             yield return(permState_MoveToNext);
         }
     }
 }
コード例 #2
0
 Sweep_Left_Complete_ActorState_0F_ChangeToNext(
     IEnumerable <DeterminedState> determinedStates_ActorStates_0F_Complete,
     List <string> TapeLibrary)
 {
     foreach (DeterminedState permStateCompleted in determinedStates_ActorStates_0F_Complete)
     {
         foreach (string character in TapeLibrary)
         {
             TransitionFunction completeState_MoveToBegin = new TransitionFunction(
                 permStateCompleted.Actual, character);
             completeState_MoveToBegin.DefineRange(permStateCompleted.TF.RangeState.Actual, character, SZSTAY);
             yield return(completeState_MoveToBegin);
         }
     }
 }
コード例 #3
0
        Sweep_Left_ActorState_N_MoveToPrevious(
            IEnumerable <DeterminedState> determinedStates_ActorStates_N_Write,
            List <string> NonHeaderLibrary)
        {
            foreach (DeterminedState dstateNthTape in determinedStates_ActorStates_N_Write)
            {
                foreach (string nonheadSymbol in NonHeaderLibrary)
                {
                    TransitionFunction determinedNState_MoveToPrevious = new TransitionFunction(
                        dstateNthTape.Actual, nonheadSymbol);

                    determinedNState_MoveToPrevious.DefineRange(
                        dstateNthTape.Actual, nonheadSymbol, SZMOVE_LEFT);

                    yield return(determinedNState_MoveToPrevious);
                }
            }
        }
コード例 #4
0
 Sweep_Left_ActorState_N_MoveHeadThenChangeToNLess1MoveToPrevious(
     IEnumerable <DeterminedState> determinedStates,
     List <string> NonHeaderLibrary)
 {
     foreach (DeterminedState dstate in determinedStates)
     {
         for (int i = NUM_TAPES; i > 0; i--)
         {
             if (dstate.TF.RangeHeadMove[i - 1] != SZSTAY)
             {
                 if (i > 1)
                 {
                     foreach (string character in NonHeaderLibrary)
                     {
                         // Exclude this combination because the head has moved before the beginning of the tape.
                         //if (!(character == "#" && dstate.TF.RangeHeadMove[i - 1] == SZMOVE_LEFT))
                         //{
                         TransitionFunction determinedNState_MoveHead = new TransitionFunction(
                             dstate.Actual + i + "a", character);
                         determinedNState_MoveHead.DefineRange(
                             dstate.Actual + (i - 1), SymMap[character], SZMOVE_LEFT);
                         yield return(determinedNState_MoveHead);
                         //}
                     }
                 }
                 else
                 {
                     foreach (string character in NonHeaderLibrary)
                     {
                         // Exclude this combination because the head has moved before the beginning of the tape.
                         //if (!(character == "#" && dstate.TF.RangeHeadMove[i - 1] == SZMOVE_LEFT))
                         //{
                         TransitionFunction determinedNState_MoveHead = new TransitionFunction(
                             dstate.Actual + i + "a", character);
                         determinedNState_MoveHead.DefineRange(
                             dstate.Actual + "F", SymMap[character], SZSTAY);
                         yield return(determinedNState_MoveHead);
                         //}
                     }
                 }
             }
         }
     }
 }
コード例 #5
0
        Sweep_Right_Complete_BeginActionStates(
            IEnumerable <DeterminedState> determinedStates,
            List <string> NonHeaderLibrary)
        {
            foreach (State permState in determinedStates)
            {
                foreach (string nonheader in NonHeaderLibrary)
                {
                    TransitionFunction permState_MoveToNext = new TransitionFunction(
                        permState.Actual, nonheader);
                    permState_MoveToNext.DefineRange(permState.Actual + NUM_TAPES, nonheader, SZSTAY);
                    yield return(permState_MoveToNext);
                }

                // Include the end symbol so that if the last head was on #, we can continue.
                TransitionFunction permState_MoveToNext2 = new TransitionFunction(
                    permState.Actual, END_SYMBOL);
                permState_MoveToNext2.DefineRange(permState.Actual + NUM_TAPES, END_SYMBOL, SZMOVE_LEFT);
                yield return(permState_MoveToNext2);
            }
        }
コード例 #6
0
        public void GetInput(string fileName)
        {
            if (!File.Exists(fileName))
            {
                return;
            }

            System.IO.StreamReader file =
                new System.IO.StreamReader(fileName);

            Regex findAcceptStates = new Regex(@"^accept:\.*?");
            Regex findStartStates  = new Regex(@"^init:\.*?");
            Regex findName         = new Regex(@"^name:\.*");

            TransitionFunction TF = null;
            string             line;

            while ((line = file.ReadLine()) != null)
            {
                string[] splitLine    = ParseLine(line).ToArray();
                bool     tryParseLine = true;
                if (AcceptStates.Count == 0)
                {
                    Match match = findAcceptStates.Match(splitLine[0]);
                    // Get the accept states.
                    if (match.Success)
                    {
                        AcceptStates = ParseLine(line.Substring(match.Length)).ToList();
                        tryParseLine = !match.Success;
                    }
                }

                if (Name == "")
                {
                    Match match = findName.Match(splitLine[0]);
                    if (match.Success)
                    {
                        Name         = splitLine[0].Substring(match.Length).Trim();
                        tryParseLine = false;
                    }
                }

                if (StartState == "")
                {
                    Match match = findStartStates.Match(splitLine[0]);
                    if (match.Success)
                    {
                        StartState   = splitLine[0].Substring(match.Length).Trim();
                        tryParseLine = false;
                    }
                }

                if (splitLine.Length > 1 && tryParseLine)
                {
                    if (TF == null)
                    {
                        TF = new TransitionFunction(splitLine);
                    }
                    else
                    {
                        TF.DefineRange(splitLine);
                        TransitionFunctions.Add(TF);
                        TF = null;
                    }
                }
            }
        }
コード例 #7
0
        public void NullInput(ref string doc, string nullChar)
        {
            List <string> TapeLibrary = GetTapeLibrary();

            TapeLibrary.Add("#");
            TapeLibrary = TapeLibrary.Concat(TapeLibrary.Select(x => SymMap[x])).ToList();
            TapeLibrary.Add(END_SYMBOL);

            List <TransitionFunction> OutputTFs = new List <TransitionFunction>();

            TransitionFunction SetStart = new TransitionFunction(
                "qNullInputStart", "#");

            SetStart.DefineRange(
                "qNullInput", RETURN_SYMBOL, SZMOVE_RIGHT);
            OutputTFs.Add(SetStart);

            TransitionFunction DeleteChar = new TransitionFunction(
                "qNullInput", nullChar);

            DeleteChar.DefineRange(
                "qNullInput", "_", SZMOVE_RIGHT);
            OutputTFs.Add(DeleteChar);

            foreach (string symbol in TapeLibrary)
            {
                if (symbol != END_SYMBOL)
                {
                    TransitionFunction MoveToNext = new TransitionFunction(
                        "qNullInput", symbol);
                    MoveToNext.DefineRange(
                        "qNullInput", symbol, SZMOVE_RIGHT);
                    OutputTFs.Add(MoveToNext);

                    TransitionFunction Return = new TransitionFunction(
                        "qNullInputReturn", symbol);
                    Return.DefineRange(
                        "qNullInputReturn", symbol, SZMOVE_LEFT);
                    OutputTFs.Add(Return);
                }
                else
                {
                    TransitionFunction MoveToNext = new TransitionFunction(
                        "qNullInput", symbol);
                    MoveToNext.DefineRange(
                        "qNullInputReturn", symbol, SZMOVE_LEFT);
                    OutputTFs.Add(MoveToNext);
                }
            }

            TransitionFunction Complete = new TransitionFunction(
                "qNullInputReturn", RETURN_SYMBOL);

            Complete.DefineRange(
                this.StartState, "#", SZSTAY);
            OutputTFs.Add(Complete);

            this.StartState = "qNullInputStart";

            CompileOutputTFs(ref doc, OutputTFs);
        }
コード例 #8
0
        Include_Shift_Right_On(
            string branchState,
            string returnState,
            bool putHead,
            Dictionary <string, string> branchStarterPairs,       //(from, to)
            List <string> TapeLibrary)
        {
            // This needs to be done prior to calling this.

            foreach (string sz in branchStarterPairs.Keys)
            {
                TransitionFunction determinedNState_BranchOnPound = new TransitionFunction(
                    branchState, sz);                 //symmap["#"]
                determinedNState_BranchOnPound.DefineRange(
                    branchState + "S" + branchStarterPairs[sz], RETURN_SYMBOL, SZMOVE_RIGHT);

                // Start the branch
                yield return(determinedNState_BranchOnPound);
            }


            #region Build Shift Right TFs and Shift States

            var TPLWD = TapeLibrary.ToList().Concat(new List <string>()
            {
                END_SYMBOL
            });
            foreach (string anySymbol in TapeLibrary)
            {
                foreach (string targetSymbol in TPLWD)
                {
                    // (q#, $) --> (q$, #, R)
                    if ((targetSymbol == END_SYMBOL && anySymbol == "#") ||
                        (targetSymbol != END_SYMBOL))
                    {
                        string             sourceState = branchState + "S" + anySymbol;
                        TransitionFunction dstateNthTape_ShiftRight = new TransitionFunction(
                            sourceState, targetSymbol);

                        string targetState = branchState + "S" + targetSymbol;
                        dstateNthTape_ShiftRight.DefineRange(
                            targetState, anySymbol, SZMOVE_RIGHT);

                        yield return(dstateNthTape_ShiftRight);
                    }
                }
            }
            #endregion

            #region Build Found End Shift Transition To (Move To Return to Proc) State.
            TransitionFunction dstateNthTape_ShiftFoundEnd = new TransitionFunction(
                branchState + "S" + END_SYMBOL, "_");

            dstateNthTape_ShiftFoundEnd.DefineRange(
                branchState + "S" + RETURN_SYMBOL, END_SYMBOL, SZMOVE_LEFT);
            yield return(dstateNthTape_ShiftFoundEnd);

            #endregion

            #region Build Move To Return to Proc TFs and Transition to Proc
            foreach (string anySymbol in TapeLibrary)
            {
                TransitionFunction dstateNthTape_ReturnToProcedure = new TransitionFunction(
                    branchState + "S" + RETURN_SYMBOL, anySymbol);

                dstateNthTape_ReturnToProcedure.DefineRange(
                    branchState + "S" + RETURN_SYMBOL, anySymbol, SZMOVE_LEFT);
                yield return(dstateNthTape_ReturnToProcedure);
            }

            TransitionFunction dstateNthTape_TransitionToProcedure = new TransitionFunction(
                branchState + "S" + RETURN_SYMBOL, RETURN_SYMBOL);

            // Determines whether or not for the
            string puthead = putHead ? SymMap["_"] : "_";
            dstateNthTape_TransitionToProcedure.DefineRange(
                returnState, puthead, SZSTAY);
            yield return(dstateNthTape_TransitionToProcedure);

            #endregion
        }
コード例 #9
0
        Include_Shift_Left_Safety_RightHanded(
            ref List <TransitionFunction> allTFS,
            List <string> TapeLibrary)
        {
            List <TransitionFunction> outputTFs = new List <TransitionFunction>();

            // Find each left moving tf
            List <TransitionFunction> leftMoveTFs = new List <TransitionFunction>();

            foreach (TransitionFunction tf in allTFS)
            {
                if (tf.RangeHeadMove[0] == SZMOVE_LEFT)
                {
                    leftMoveTFs.Add(tf);
                }

                //outputTFs.Add(tf);
            }

            // Now check all the states that those tfs turn into, these states potentialStates
            // Look for tfs for each potential state that writes on "#"
            List <TransitionFunction> offendingTFs = new List <TransitionFunction>();

            foreach (TransitionFunction tf in leftMoveTFs)
            {
                foreach (TransitionFunction otf in allTFS)
                {
                    if ((otf.DomainState.Actual == tf.RangeState.Actual) &&
                        (otf.DomainHeadValues[0] == "#") &&
                        (otf.RangeHeadWrite[0] != "#"))
                    {
                        offendingTFs.Add(otf);
                    }
                }
            }

            // Remove the offendingTFs from allTFs
            foreach (TransitionFunction tf in offendingTFs)
            {
                allTFS.Remove(tf);
                //outputTFs.Remove(tf);
            }

            // Create a subprocedure that moves right one,
            // then shifts everything right, writing blank in the new space
            // then returning to the state that it was in.
            string startState;
            string shiftStartState;
            string returnState;

            foreach (TransitionFunction tf in offendingTFs)
            {
                startState      = tf.DomainState.Actual;
                shiftStartState = startState + "B";
                returnState     = tf.RangeState.Actual;
                // Create the initial right shift.
                TransitionFunction moveRightTF = new TransitionFunction(startState, "#");
                moveRightTF.DefineRange(shiftStartState, "#", SZMOVE_RIGHT);

                // Create all the starts that get it to the shift right
                Dictionary <string, string> branchStarterPairs = new Dictionary <string, string>();
                foreach (string sz in TapeLibrary)
                {
                    branchStarterPairs.Add(sz, sz);
                }

                List <TransitionFunction> branch
                    = Include_Shift_Right_On(shiftStartState, startState, false, branchStarterPairs, TapeLibrary).ToList();
                outputTFs.Add(moveRightTF);
                outputTFs = outputTFs.Concat(branch).ToList();
            }

            return(outputTFs);
        }
コード例 #10
0
        Sweep_Left_ActorState_N_FoundPreviousWriteThenChangeToMoveHeadState(
            IEnumerable <DeterminedState> determinedStates)
        {
            foreach (DeterminedState dstate in determinedStates)
            {
                for (int i = NUM_TAPES; i > 0; i--)
                {
                    string             NthParameterOfDeterminedState          = dstate.SubScripts[i - 1];
                    TransitionFunction determinedNState_FoundPreviousAndWrite = new TransitionFunction(
                        dstate.Actual + (i).ToString(), NthParameterOfDeterminedState);

                    string NthTapeTransitionWrite = dstate.TF.RangeHeadWrite[i - 1];
                    string NthTapeTransitionMove  = dstate.TF.RangeHeadMove[i - 1];


                    if (NthTapeTransitionMove != SZSTAY)
                    {
                        determinedNState_FoundPreviousAndWrite.DefineRange(
                            dstate.Actual + (i).ToString() + "a", NthTapeTransitionWrite, NthTapeTransitionMove);
                    }
                    else
                    {
                        if (i > 1)
                        {
                            determinedNState_FoundPreviousAndWrite.DefineRange(
                                dstate.Actual + (i - 1), SymMap[NthTapeTransitionWrite], SZMOVE_LEFT);
                        }
                        else
                        {
                            determinedNState_FoundPreviousAndWrite.DefineRange(
                                dstate.Actual + "F", SymMap[NthTapeTransitionWrite], SZMOVE_LEFT);
                        }
                    }

                    yield return(determinedNState_FoundPreviousAndWrite);

                    // Also accept H as B.
                    if (NthParameterOfDeterminedState == SymMap["_"])
                    {
                        TransitionFunction determinedNState_FoundPreviousAndWrite_H = new TransitionFunction(
                            dstate.Actual + (i).ToString(), SymMap["#"]);

                        if (NthTapeTransitionWrite != "_")
                        {
                            if (NthTapeTransitionMove != SZSTAY)
                            {
                                determinedNState_FoundPreviousAndWrite_H.DefineRange(
                                    dstate.Actual + (i).ToString() + "a", NthTapeTransitionWrite, NthTapeTransitionMove);
                            }
                            else
                            {
                                if (i > 1)
                                {
                                    determinedNState_FoundPreviousAndWrite_H.DefineRange(
                                        dstate.Actual + (i - 1), SymMap["#"], SZMOVE_LEFT);
                                }
                                else
                                {
                                    determinedNState_FoundPreviousAndWrite_H.DefineRange(
                                        dstate.Actual + "F", SymMap["#"], SZMOVE_LEFT);
                                }
                            }
                        }
                        else
                        {
                            if (NthTapeTransitionMove != SZSTAY)
                            {
                                determinedNState_FoundPreviousAndWrite_H.DefineRange(
                                    dstate.Actual + (i).ToString() + "a", "#", NthTapeTransitionMove);
                            }
                            else
                            {
                                if (i > 1)
                                {
                                    determinedNState_FoundPreviousAndWrite_H.DefineRange(
                                        dstate.Actual + (i - 1), SymMap["#"], SZMOVE_LEFT);
                                }
                                else
                                {
                                    determinedNState_FoundPreviousAndWrite_H.DefineRange(
                                        dstate.Actual + "F", SymMap["#"], SZMOVE_LEFT);
                                }
                            }
                        }
                        yield return(determinedNState_FoundPreviousAndWrite_H);
                    }
                }
            }
        }
コード例 #11
0
 public DeterminedState(string actual, State start, string basestate, TransitionFunction tf, params string[] parms) : base(actual, start, parms)
 {
     BaseState = basestate;
     TF        = tf;
 }