[英]Designing a Turing Machine's state table
如果您已经拥有算法的伪代码,它们是否有助于描述图灵机的功能?
我正在学习复杂性理论课程,我花了一些时间来描述一个决定或接受某种语言(状态,转换等)的图灵机器,即使我知道如何用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的语言)。 我可以轻松地为他们编写伪代码,但编写图灵机更具挑战性(需要我很长时间),我想知道是否有一些技巧,资源或指导方针可以帮助我更好地解决这类问题。
免责声明:您的问题很一般,因此答案也是如此。 请注意,我不是TM的专家,这种方法通常效率不高(我甚至不能保证它总是有效的)。 我只是在这里记下一些想法。
我建议尝试这样的方法:取你的伪代码并减少它,使它只包含a)布尔变量和b) if
-statements。 例如:
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
S,以取代他们and
S; 使用not
删除else
块:
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
部分只是布尔值的赋值( do_a
域,所以它是你的新状态),写命令(如果没有,只写下已经存在的字母)和移动命令,因此明确地表示图灵机转换。
我希望上述任何一点都有道理。
您需要一个即用型工具,图灵机模拟器吗? 有很多可用的 。 或者实际上你想制作自己的? 这似乎是JavaScript中的有效实现: http : //klickfamily.com/david/school/cis119/TuringSim.html您可以很容易地分析代码并将其转换为C或C ++。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.