参考.チューリングマシンのシミュレータ
!1テープ・チューリングマシン(Turing Machine)
!---------- ↓↓↓↓↓ ----------
!動作表(状態遷移表) ! 現在の状態、現在のテープの値 ! テープに書き込む値、移動方向、次の状態
100 DATA 1,_, _,R,1 !1進法による数の減算 DATA 1,1, 1,R,1 DATA 1,-, -,R,1 DATA 1,"=", _,L,2 DATA 2,1, "=",L,3 DATA 2,"-", _,L,2 !halt DATA 3,1, 1,L,3 DATA 3,"-", "-",L,4 DATA 4,_, _,L,4 DATA 4,1, _,R,1 !初期値 LET q=1 !状態q0 LET tp$="11111-11=" !テープの値 ※5-2の計算 LET p=1 !ヘッダ位置 !---------- ↑↑↑↑↑ ---------- !トレース CALL DispStatus !初期状態 LET Running=1 !実行フラグ DO WHILE Running=1 LET Running=0 LET n=1 !行番号 RESTORE 100 DO !一致するプログラム(動作表)を実行する READ IF MISSING THEN EXIT DO: p1,p2$,p3$,p4$,p5 IF p<1 OR p>LEN(tp$) THEN PRINT "テープから外れます。"; p STOP END IF IF q=p1 AND tp$(p:p)=p2$ THEN LET Running=1 LET tp$(p:p)=p3$ !テープへの書き込み SELECT CASE UCASE$(p4$) !ヘッドの移動 CASE "R" LET p=p+1 CASE "L" LET p=p-1 CASE ELSE END SELECT LET q=p5 !状態遷移 !トレース PRINT "動作";STR$(n);" →";p1;p2$;" ";p3$;" ";p4$;p5 !実行した動作 CALL DispStatus !遷移した状態 END IF LET n=n+1 LOOP LOOP PRINT "停止!" SUB DispStatus !現在の状態を表示する PRINT "テープの値=";tp$ PRINT "ヘッド位置=";p PRINT "状態=";q PRINT END SUB END
|