Могут ли обычные языки быть завершенными по Тьюрингу?


32

Я читал о Йоте и Джоте и нашел этот раздел запутанным:

В отличие от Iota, где синтаксическое дерево для строки может разветвляться либо слева, либо справа, синтаксис Jot равномерно разветвляется слева. В результате, Йота не зависит от контекста, но Йот - это обычный язык.

Насколько я понимаю, и Йота, и Йот завершены по Тьюрингу. Но, по-видимому, один не зависит от контекста, а другой является регулярным! Конечно, обычные языки не могут быть полными по Тьюрингу?


3
Обратите внимание, что язык, описывающий машину Тьюринга, может быть тривиально написан на обычном языке, например, i = {0,1, -1}, b = {конец ввода} (i + bi + bi) + b (i +) описывает непустой набор правил, за которым следует непустой ввод. Или, скорее, вы можете интерпретировать это так, если у вас есть переводчик, который, как говорится в ответах, является отдельным понятием для класса языка.
Куб

1
@Cubic: в этом отношении машины Тьюринга могут быть пронумерованы таким образом, чтобы каждое число представляло ровно одну машину (то есть они счетные), и эти числа могут быть выражены в унарной записи. Я никогда не изучал этот материал должным образом, поэтому мне приходится работать над определениями, но я считаю, 1*0что это обычный язык ;-) Хотя это и не очень дружественный язык программирования ни для программиста, ни для разработчика компилятора.
Стив Джессоп

Ответы:


40

Короче говоря, ответ - да.

Но вы смешиваете два совершенно не связанных значения термина «язык» (да, это сбивает с толку):

  • Набор строк. «Контекстно-свободный язык» означает «набор строк, которые могут быть распознаны с использованием контекстно-свободной грамматики».
  • Способ определения вычислений. «Полный по Тьюрингу язык» означает «способ указания программ, в которых можно указать машину Тьюринга».

Обратите внимание, что вы можете говорить о «языке C ++» с двух совершенно не связанных точек зрения, используя два несвязанных значения слова «язык»:

  • C ++ как набор строк, допустимых в соответствии с грамматикой C ++
  • C ++ как способ определения программ.

Черты «языка C ++» с этих двух точек зрения не связаны.

Дополнительные примеры, которые помогут вам отделить эти понятия:

  • Выражение «[az] + @ [az]. [Az]» описывает набор строк, распознаваемых конечными автоматами, то есть регулярным языком. Однако это просто набор строк: это не способ указания программ (если только вы не приписываете способ интерпретации каждой такой строки как программы), поэтому нет смысла говорить о том, является ли это Тьюрингом или нет. полный.
  • Язык блок-схем - это способ указания программ; в зависимости от конкретного вида блок-схем, он может быть или не быть полным по Тьюрингу. Однако потоковые диаграммы не являются строками, поэтому совершенно бессмысленно говорить о потоковых диаграммах в смысле «язык как набор строк».

3
Я хотел бы добавить, что (([a-z][0-9]*)*[A-Z][0-9]*([a-z][0-9]*)*->([a-zA-Z][0-9]*)*)*это обычный язык, который может описывать грамматику любого языка класса 0,
говорит Эрбурет Reinstate Monica

2
{0,1}

10

В то время как набор юридических программ в Jot является регулярным, сам Jot завершается по Тьюрингу. Это означает, что каждая вычислимая функция может быть выражена в Jot. Мы даже можем придумать язык, на котором все двоичные строки допустимы, но сам язык является полным по Тьюрингу (упражнение). Вы путаете синтаксис и семантику.

Кстати, контекстно-свободные языки также (вероятно) не являются NP-полными, поскольку имеют алгоритм синтаксического анализа за полиномиальное время.


9

Один только синтаксис (как закодировано в деревьях синтаксиса) современных языков программирования далек от всего, что они делают. Фактически формальные языки, определяемые набором всех программ на данном языке, которые компилируются без ошибок, редко бывают даже контекстно-свободными .

Статический и динамический фактор семантики в уравнении. Они невидимы в синтаксическом дереве, но определяют, является ли фрагмент кода программой и что он вычисляет. Итог, без контекста соотв. регулярный формальный язык, который определяется «синтаксисом», дает избыточное приближение языка программирования.

Теперь, чтобы ответить на ваш вопрос: да, это возможно. Рассмотрим, например, любую геделевскую нумерацию машин Тьюринга; Вы получаете «язык программирования» всех натуральных чисел, каждое из которых представляет ТМ. Конечно, это не очень хороший язык для программирования, но это, конечно, полный по Тьюрингу язык, который является обычным - даже тривиальным.


3
  1. Язык программирования полон по Тьюрингу, если он достаточно выразителен, чтобы указывать каждую функцию, вычислимую на машинах Тьюринга. Здесь мы обсуждаем силу языков, указанных в языках программирования . Например, нетрудно написать интерпретатор для машин Тьюринга в Python, поэтому Python является языком программирования, полным по Тьюрингу.

  2. Синтаксис языка программирования , то есть набора строк, соответствующих действительным программам на языке программирования, сам является языком. Например, рассмотрим множество всех возможных программ Python. Синтаксис языка программирования может быть контекстно-зависимым , контекстно-свободным , обычным и т. Д. Нас интересует сложность проверки того, что данная строка является допустимой программой на языке программирования (это делают компиляторы / интерпретаторы). Когда мы говорим, что синтаксис языка программирования не зависит от контекста, это означает, что для его синтаксиса существует не зависящая от контекста грамматика, и подразумевается, что есть автомат для проверки правильности программ,

Обратите внимание, что простота синтаксиса языка программирования не подразумевает ограничения вычислительной мощности программ, указанных на этих языках программирования.


1

Ответ - да. Видите ли, как говорится в принятом ответе, грамматика не зависит от ее значения. По словам самого Хомского:

Я думаю, что мы вынуждены сделать вывод, что грамматика является автономной и независимой от значения ...

Хомский, синтаксические структуры (1956)

Если грамматика может дать достаточно предложений для описания всех вещей, которые могут быть вычислены, то мы можем произвольно назначать вычислительные значения ее предложениям - по одному для каждой вещи, которая может быть вычислена.

Что касается реального конкретного примера, популярный язык whitespaceимеет регулярную грамматику и, возможно, даже x86 assembly languages(нуждается в проверке).


Я не думаю, что этот отрывок означает, что грамматика Го является обычным языком в формальном смысле; Я думаю, это просто означает, что грамматика не является нерегулярной , то есть последовательной. Если бы синтаксис Go был обычным языком в иерархии Хомского, он был бы неспособен генерировать, например, сбалансированные, вложенные скобки.
Цлейсон

Да, в грамматике Го есть рекурсия. Обновление поста.
Эрик
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.