Определения машин Тьюринга всегда явно указывают на то, что пустой символ не является частью входного алфавита.
Интересно , что идет не так , когда вы бы сделать его частью входного алфавита, потому что фактически пустой символ , уже , кажется, часть входных данных.
Чтобы объяснить, что «кажется» в последнем предложении, рассмотрим следующее.
В настройках по умолчанию бесконечное количество пустых символов появляется справа от ввода. Когда головка ленты перемещается над первым пустым символом, вычисление может просто продолжаться, поскольку оно не должно быть в состоянии принятия или отклонения.
Теперь предположим, что вычисление будет впоследствии записывать символы из входного алфавита справа от этого первого пустого символа, затем возвращаться в крайнее левое положение, а также возвращаться в начальное состояние. Затем он «начнется заново» с другой ленты. По сути, теперь он начинается с другого ввода, где справа от пробела находятся символы ввода, которых раньше не было. Ввод, кажется, эффективно включает в себя пустой символ. Дальнейшее поведение машины теперь также может быть другим: после повторного столкновения с пробелом теперь будут встречаться другие символы справа.
Предположим, что этот сценарий действительно возможен, почему бы вам не рассмотреть пустую символьную часть входного алфавита и почему бы вам не разрешить включать его как часть «начального» ввода?
Возможно, это просто способ определить входные данные так, чтобы они не всегда были бесконечными?
источник
Ответы:
Основная причина в том, что он позволяет машине определять конец ввода: это (символ перед) первый пробел. Если вы допустили пропуски на входе, аппарат никогда не узнает, сможет ли он найти больше входных данных, сканируя дальше вправо. Конечно, вы могли бы решить эту проблему с помощью специального символа «конец ввода», но затем вы должны настаивать на том, чтобы этого не было на входе, поэтому вы просто переместили проблему на один уровень глубже.
Это также значительно упрощает определение начальных условий: вход является непустой частью начальной ленты, которая должна быть конечной и непрерывной. И если вы хотите, чтобы пустой символ был частью входного алфавита, вы всегда можете добавить дополнительный символ (назовите его «пробел» или что-то в этом роде) и заставить машину вести себя так, как вы хотите, когда она ее видит.
источник
Вы можете определить пустой символ как часть алфавита. Проблема заключается в том, что если машина Тьюринга с входом b010010b (где b обозначает пустое значение ) никогда не читает после второго b, то машина будет вести себя одинаково на всех входах, начиная с b010010b.
Эти машины Тьюринга называются префиксными машинами Тьюринга , и они очень полезны для доказательства некоторых теорем о колмогоровской сложности.
источник
Очень короткий ответ: алфавит ленты - это набор символов, которые могут появиться на ленте, и он включает в себя пустой символ. Входной алфавит является набором символов , которые могут появиться в первоначальном входе , и он не включает пустой символ. Основной алфавит, о котором заботится аппарат, - это ленточный алфавит: ему все еще нужны правила, что делать, например, когда он видит пробел.
Это различие важно, как говорили другие, чтобы машина могла определить, где заканчивается ее ввод. Это та же самая причина, по которой вы не можете (с пользой) поместить нулевой символ в середину строки в C: нулевой символ зарезервирован для обозначения «последнего ненулевого символа перед концом данных, поэтому когда вы видите это, все готово ». Если вам нужно ожидать ноль символов в середине строки, писать
strlen
становится намного сложнее.источник