设计图灵机状态表

时间:2010-01-20 07:20:54

标签: automata turing-machines computation-theory

如果您已经拥有算法的伪代码,它们是否有助于描述图灵机的功能?

我正在学习复杂性理论课程,我花了一些时间来描述一个决定或接受某种语言(状态,转换等)的图灵机器,即使我知道如何用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相同数量的语言)。我可以轻松地为他们编写伪代码,但编写图灵机更具挑战性(需要我很长时间),我想知道是否有一些技巧,资源或指导方针可以帮助我更好地解决这类问题。

2 个答案:

答案 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_PREVIOUSMOVE_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 ++。