免责声明:您的问题非常笼统,因此这个答案也是如此。请注意,我不是 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
s 时,用 s 替换它们and
;通过使用删除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
or 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
部分只是对布尔值(即位域,所以这是您的新状态)、写入命令(如果没有,只需写入已经存在的字母)和移动命令的分配,因此明确地是图灵机转换。
我希望以上任何一个都有意义。