Является ли C++ рекурсивно перечислимым языком?

Я знаю, что C++ не разрешим. Но это рекурсивно перечислимо?

Давайте определим набор допустимых программ на C++ как любую четко определенную программу в соответствии с текущими стандартами C++.

Можно ли построить компилятор, который всегда может определить действительные программы на C++ за конечное время?

Или это ко-рекурсивно перечислимо?

Можно ли построить компилятор, который всегда может идентифицировать недействительные программы на C++ за конечное время?

Или нет?

1 ответ

Можно ли построить компилятор, который всегда может определить действительные программы на C++ за конечное время?

Да. При наличии достаточного количества времени и ресурсов компилятор C++ должен иметь возможность завершить компиляцию любой допустимой программы C++. Рекурсивно перечислимый язык требует машины Тьюринга, которая всегда завершается и дает положительный ответ, когда строка находится в языке, и компилятор делает это по существу.

Можно ли построить компилятор, который всегда может идентифицировать недействительные программы на C++ за конечное время?

Нет. Язык шаблонов C++ завершен по Тьюрингу, поэтому вы можете написать в нем бесконечную рекурсию. Из-за проблемы остановки невозможно определить, будет ли программа когда-либо завершать компиляцию, поэтому невозможно определить, будет ли программа C++ когда-либо успешно компилироваться.

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

Другие вопросы по тегам