我们使用图灵机实现一个枚举器,枚举器应该输出图灵机接受的语言。来自Σ*的可接受单词被多次打印(每次迭代之前打印的单词将再次打印)。
为什么我们不能只说 - “对于Σ*中的每个单词运行M.如果它接受然后打印,如果拒绝然后继续下一个单词”。然后我们不会多次打印每个单词。
为什么不必要的打印?
图像中的算法是:
如果TM M
识别语言A
,我们可以为A
构建以下枚举器。假设s1
,s2
,s3
,...是Σ*
中可能的字符串列表。
E
=“忽略输入
1)对i
= 1,2,3,...
2)针对每个输入M
,i
,s1
,s2
步,运行s3
。 。 。 si
。
3)如果有任何计算接受,请打印出相应的sj
。“
如果M
接受特定字符串,它将显示在E
生成的列表中(实际上无限多次)
由于
答案 0 :(得分:0)
如评论中所述:问题是某些计算可能不会终止。因此,如果按顺序执行它们,则永远不会执行第一次非终止计算之后的那些。
给定的算法使用标准技术来解决这个问题:dovetailing。
您可以将步骤3更改为"如果任何计算在i
步骤之后接受,则打印" - 然后没有不必要的印刷品。但是,你必须在每次模拟过程中计算步数,这意味着一些额外的工作。作者选择了一个易于编程的选项,但效率不高。