Невозможно написать язык программирования, который позволяет всем машинам, которые останавливаются на всех входах, и никаким другим. Тем не менее, кажется, что легко определить такой язык программирования для любого стандартного класса сложности. В частности, мы можем определить язык, на котором мы можем выразить все эффективные вычисления и только эффективные вычисления.
Например, для чего-то вроде : возьмите свой любимый язык программирования, и после того, как вы напишите свою программу (соответствующую Turing Machine ), добавьте три значения в заголовок: целое число и целое число и вывод по умолчанию . Когда программа скомпилирована, выведите машину Тьюринга которой задан ввод размера выполняющий на для шагов. Если не останавливается до выполнения шагов , выведите вывод по умолчанию, Если я не ошибаюсь, эти языки программирования позволят нам выразить все вычисления в и ничего более. Однако этот предложенный язык по своей сути неинтересен.
Мой вопрос: существуют ли языки программирования, которые захватывают подмножества вычислимых функций (таких как все эффективно вычисляемые функции) нетривиальным способом? Если нет, есть ли причина для этого?
источник
Ответы:
Одним из языков, пытающихся выразить только вычисления за полиномиальное время, является мягкое лямбда-исчисление . Система типов основана на линейной логике. В недавнем тезисе рассматриваются исчисления полиномиального времени и дается хорошее резюме последних разработок, основанных на этом подходе. Мартин Хофманн уже давно работает над этой темой. Более старый список соответствующих работ можно найти здесь ; Многие из его работ продолжаются в этом направлении.
Другая работа заключается в проверке того, что программа использует определенное количество ресурсов, используя зависимые типы или язык типизированных ассемблеров .
Тем не менее, другие подходы основаны на ограниченных ресурсом формальных исчислениях , таких как варианты окружающего исчисления.
Эти подходы обладают тем свойством, что хорошо типизированные программы удовлетворяют некоторым заранее заданным границам ресурсов. Ограничение ресурса может быть временем или пространством и, как правило, может зависеть от размера входных данных.
Ранняя работа в этой области посвящена строгой нормализации исчислений, а это означает, что все хорошо типизированные программы останавливаются. Система F , известная как полиморфное лямбда-исчисление, сильно нормализуется. У него нет оператора с фиксированной точкой, но, тем не менее, он достаточно выразителен, хотя я не думаю, что известно, какому классу сложности он соответствует. По определению, любое сильно нормализующее исчисление выражает некоторый класс завершающих вычислений.
Язык программирования Charity - довольно выразительный функциональный язык, который останавливается на всех входах. Я не знаю, какой класс сложности он может выражать, но функцию Аккермана можно написать в Charity.
источник
Взгляните на статью Гийома Бонфанте, в которой предложены две характеристики пространства логарифмирования и полиномиального времени с использованием языков программирования.
Гийом Бонфанте, Некоторые языки программирования для Logspace и Ptime, AMAST 2006, LNCS 4019, с. 66-80, 2006
источник
Я также хотел бы упомянуть неявную теорию сложности в качестве подхода к этому, поскольку я видел, что она возникла в нескольких связанных с этим вопросах. Процитирую этот ответ Нила Кришнасвами :
источник
Я удивлен, что никто не упомянул примитивную рекурсию. Ограничивая ограниченные циклы (т. Е. Количество итераций для каждого цикла должно быть рассчитано до начала цикла), полученная программа является примитивно-рекурсивной и, следовательно, суммарной. Дуглас Хофштадтер предложил язык программирования BLOOP, который допускает все и только примитивные рекурсивные функции.
источник
См. Также язык Pola для программирования PTIME и работы Джапаридзе по арифметике PTIME, например, http://arxiv.org/abs/0902.2969.
источник