CS3343 Analysis of Algorithms |
Turing Machine
Interpreter |
| Turing Machine Interpreter | |
|---|---|
// Interpreter.java: Turing machine interp.
public class Interpreter {
int zero; // tape center, length=zero*2
char[] t; // tape, not accessible by index
int scan; // initial char being scanned
int lc; // location counter
int ec; // execution counter
int offSet = 10; // dist either side of 0
public Interpreter() {
zero = 100;
t = new char[zero*2];// symmetric at 0
for (int i = 0; i < t.length; i++)
t[i] = '0';
}
// for doubling program, size to double
public void initA(int n) {
for (int i = 0; i < n; i++)
t[zero + i] = '1';
}
// for power prog, from n 1s, get 2^(n+1)
public void initB(int n) {
t[zero] = '1';
for (int i = 0; i < n; i++)
t[zero + i + 2] = '1';
}
public void printState(int[][] c) {
for (int i = zero - offSet; i < zero +
offSet; i++)
System.out.print(t[i]);
System.out.println(" lc:" + lc+",op:" +
c[lc][0] + ",scan:"+scan+",ec:"+ec);
for (int i = 0; i < scan - zero +
offSet; i++)
System.out.print(" ");
System.out.println("|");
}
|
void interp(int[][] c) {
int op; // current operator
scan = zero;
lc = 1;
ec = 0;
while ( (op = c[lc][0]) != 4 && ec < 500) {
ec++;
printState(c);
switch(op) {
case(0): // print 0
t[scan] = '0'; lc++;
break;
case(1): // print 1
t[scan] = '1'; lc++;
break;
case(2): // move left
scan--; lc++;
break;
case(3): // move right
scan++; lc++;
break;
case(4): // stop
break;
case(5): // if 0 is scanned goto i
if (t[scan] == '0') lc = c[lc][1];
else lc++;
break;
case(6): // if 1 is scanned goto j
if (t[scan] == '1') lc = c[lc][1];
else lc++;
break;
case(7): // (end marker)
break;
} // switch
} // while
}
public static void main(String[] argv) {
// coded doubling program
int [][] a =
{{-1, -1},{0, 0}, {2, 0}, {6, 2},
{1, 0}, {3, 0}, {6, 5}, {1, 0}, {3, 0},
{6, 1}, {4, 0}, {7, 0} };
// coded 2^(n+1) program
int [][] b =
{{-1, -1},{0, 0}, {2, 0}, {6, 2},
{1, 0}, {3, 0}, {6, 5}, {1, 0}, {3, 0},
{6, 1}, {3, 0}, {5, 22}, {3, 0}, {6, 12},
{2, 0}, {0, 0}, {2, 0}, {6, 16}, {2, 0},
{6, 18}, {3, 0}, {6, 1}, {4, 0}, {7, 0}};
Interpreter in = new Interpreter();
in.initA(4); // # of 1's initially
in.interp(a); // run a
// in.initB(3); // # of 1's initially
// in.interp(b); // run b
}
} |
| Turing Machine Representation | |
|---|---|
// Code.java: Turing machine code
public class Code {
String[] c = {"000", "001", "010", "011",
"100", "101", "110", "111"};
String[] p = {"print 0", "print 1",
"move left", "move right", "stop",
"if 0 is scanned goto ",
"if 1 is scanned goto ", "end"};
void printCode(int x[][]){
for (int i = 1; i < x.length; i++){
System.out.print(c[x[i][0]]);
if (x[i][0] == 5) {
System.out.print(" ");
for (int j = 0; j < x[i][1]; j++)
System.out.print("0");
System.out.print(" 1");
}
else if (x[i][0] == 6) {
System.out.print(" ");
for (int j = 0; j < x[i][1]; j++)
System.out.print("1");
System.out.print(" 0");
}
System.out.println();
}
System.out.println();
}
|
void printProg(int x[][]){
for (int i = 1; i < x.length; i++){
if (i < 10) System.out.print(" ");
System.out.print(i + ". " +
p[x[i][0]]);
if (x[i][0] == 5)
System.out.print(x[i][1]);
else if (x[i][0] == 6)
System.out.print(x[i][1]);
System.out.println();
}
System.out.println();
}
public static void main(String[] argv) {
Code code = new Code();
// coded doubling program
int [][] a =
{{-1,-1},{0,0}, {2,0}, {6,2},
{1,0}, {3,0}, {6,5}, {1,0}, {3,0},
{6,1}, {4,0}, {7,0}};
// coded 2^(n+1) program
int [][] b =
{{-1,-1},{0,0}, {2,0}, {6,2},
{1,0}, {3,0}, {6,5}, {1,0}, {3,0},
{6,1}, {3,0}, {5,22}, {3,0}, {6,12},
{2,0}, {0,0}, {2,0}, {6,16}, {2,0},
{6,18}, {3,0}, {6,1}, {4,0}, {7,0}};
code.printProg(a);
code.printCode(a);
code.printProg(b);
code.printCode(b);
}
} |