如果您已经拥有算法的伪代码,它们是否有助于描述图灵机的功能?
我正在学习复杂性理论课程,我花了一些时间来描述一个决定或接受某种语言(状态,转换等)的图灵机器,即使我知道如何用C语言编写它甚至组装。我想我只是没有足够的图灵机练习(工作),但我很感激任何建议。
修改
我不想制作图灵机模拟器,我想在纸上描述图灵机(字母,状态,过渡)来决定某种语言。
这是一个简单的例子,我的意思是,我需要编写一个超过0和1的字符串的图灵机,并将其中的所有0更改为1。例如,如果从磁带(输入)上的11010开始,它将在磁带(输出)上以11111停止。现在用高级语言,你知道它是这样的:
Go over every character on tape
If character is 0 change it to 1
图灵机描述非常类似于:
你有两种状态,q和停止。什么时候 你在州q,你看到1,去吧 向右而不改变它。如果 你看到0,把它改成1然后去 正确的。如果看到空白符号 (磁带结束)然后停止 状态。
正式地,你会有类似{q,halt}的状态。 {((q,1) - >(q,1,R)),((q,0) - >(q,1,R)),((q,#) - >(halt,0 ,L))}用于过渡。
现在这个问题很简单,但还有其他一些涉及更多(添加一元数或识别a,b和c相同数量的语言)。我可以轻松地为他们编写伪代码,但编写图灵机更具挑战性(需要我很长时间),我想知道是否有一些技巧,资源或指导方针可以帮助我更好地解决这类问题。
答案 0 :(得分:10)
免责声明:您的问题很一般,因此答案也是如此。请注意,我不是TM的专家,而且 这种方法通常效率不高(我甚至不能保证它总是有效的)。 我只是在这里记下一些想法。
我建议尝试这样的方法:拿你的伪代码并减少它
它只包括a)布尔变量和b)if
- 语句。
例如:
if THIS_LETTER_IS("A"):
found_an_even_number_of_A = not found_an_even_number_of_A
if THIS_LETTER_IS("Q") and previous_letter_was_X and found_an_even_number_of_A
and not checking_for_alternative_2:
# can't be a word of alternative 1, so check for alternative 2
going_back_to_start_to_check_for_alternative_2 = True
if going_back_to_start_to_check_for_alternative_2:
MOVE_TO_PREVIOUS
else:
MOVE_TO_NEXT
if going_back_to_start_to_check_for_alternative_2 and THIS_LETTER_IS(EMPTY):
# reached the beginning, so let's check for alternative 2
going_back_to_start_to_check_for_alternative_2 = False
checking_for_alternative_2 = True
当您嵌套if
时,请将其替换为and
s;使用else
删除not
块:
if something:
if something_else:
do_a
else:
do_b
变为
if something and something_else:
do_a
if something and not something_else:
do_b
每个if
块只应包含一个MOVE_TO_PREVIOUS
或MOVE_TO_NEXT
,可能包含WRITE
命令和任意数字
变量任务。
完成所有if
条款,以便每一个你的布尔值,并且始终检查当前的字母,重复
必要的街区。例如:
if something and something_else:
do_a
变为
if THIS_LETTER_IS("A") and something and something_else and something_i_dont_care_about_here:
do_a
if THIS_LETTER_IS("A") and something and something_else and not something_i_dont_care_about_here:
do_a
if THIS_LETTER_IS("Q") and something and something_else and something_i_dont_care_about_here:
do_a
if THIS_LETTER_IS("Q") and something and something_else and not something_i_dont_care_about_here:
do_a
现在,如果您有 n 布尔值和 m 字母,那么您应该 m * 2 n if
s。
想象一下,你已经将布尔值存储在一个位域中,因此布尔值的每个可能组合代表一个
整数。因此上面变成了
if THIS_LETTER_IS("A") and bitfield[0] and bitfield[1] and bitfield[2]:
do_a
if THIS_LETTER_IS("A") and bitfield[0] and bitfield[1] and not bitfield[2]:
do_a
# ...
然后变成
if THIS_LETTER_IS("A") and bitfield == 7:
do_a
if THIS_LETTER_IS("A") and bitfield == 3:
do_a
# ...
位域的整数值是图灵机状态。 do_a
部分只是对布尔值的赋值(即位域,所以它是你的新状态),写命令(如果没有,只需写出已经写过的字母)
那里)和一个移动命令,因此显然是一个图灵机过渡。
我希望以上任何一点都有道理。
答案 1 :(得分:1)
您需要一个即用型工具,图灵机模拟器吗?有quite many available。或者实际上你想制作自己的?这似乎是JavaScript中的有效实现:http://klickfamily.com/david/school/cis119/TuringSim.html您可以很容易地分析代码并将其转换为C或C ++。