Sweep_Right_XthParm_FoundNextChangeToNextState( IEnumerable <State> undeterminedStates) { foreach (State permState in undeterminedStates) { // e.g. mkTFs (q1,0,1) and (q1,0,0), match q1o. So 1, and 0, are potential // transition parameters. List <TransitionFunction> potentialPermStates = GetPossibleTFs(permState); foreach (TransitionFunction permMatchedTF in potentialPermStates) { string permMatchedPotentialChar = permMatchedTF.DomainHeadValues[permState.SubScripts.Count]; TransitionFunction permState_TransitToNext = new TransitionFunction( permState.Actual, SymMap[permMatchedPotentialChar]); string szNextState = permState.Actual + SymMap[permMatchedPotentialChar]; permState_TransitToNext.DefineRange(szNextState, SymMap[permMatchedPotentialChar], SZMOVE_RIGHT); yield return(permState_TransitToNext); // Branch on _ if (permMatchedPotentialChar == "_") { TransitionFunction permState_TransitToNextBranch = new TransitionFunction( permState.Actual, SymMap["#"]); string szNextState2 = permState.Actual + SymMap["_"]; permState_TransitToNextBranch.DefineRange(szNextState2, SymMap["#"], SZMOVE_RIGHT); yield return(permState_TransitToNextBranch); } } } }
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); } } }
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); } } }
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); } } }
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); //} } } } } } }
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); } }
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); }
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 }
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); }
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); } } } }