Примитивно-рекурсивные функции определены над натуральными числами. Однако кажется, что концепция должна обобщаться на другие типы данных, что позволяет говорить о примитивных рекурсивных функциях, которые, например, отображают списки в двоичные деревья. По аналогии, частично рекурсивные функции над натуральными числами хорошо обобщаются на вычислимые функции для любого типа данных, и я хотел бы понять, как сделать такое же обобщение для примитивных рекурсивных функций.
Интуитивно понятно, что если бы мне нужно было определить простой императивный язык, который позволял бы выполнять базовые операции, скажем, списки (такие как конкатенация, взятие головы и хвоста, сравнение элементов) и форму итерации, которая требует заранее знать, сколько итераций произойдет ( например, перебирая элементы в неизменяемом списке), такой язык должен в лучшем случае иметь возможность вычислять примитивные рекурсивные функции над списками. Но как я могу понять это формально, а точнее, как мне доказать, что мой язык вычисляет все примитивно-рекурсивные функции по спискам, а не только их подмножество?
Чтобы быть ясным, я заинтересован в понимании примитивных рекурсивных функций как четко определенного класса функций (если они действительно есть), а не просто в операции самой примитивной рекурсии, которая кажется простой. Я был бы заинтересован в указателях на все, что было написано о примитивной рекурсии над общими структурами данных, или даже в любом другом контексте, кроме натуральных чисел.
обновление: возможно, я нашел ответ в статье под названием Walther Recursion , написанной Макаллестером и Аркоудасом. (Слушания CADE 1996. ) Это, кажется, содержит обобщенную версию примитивной рекурсии, а также более мощную рекурсию Вальтера. Я собираюсь написать ответ на свой вопрос, как только перевару это, но в то же время эта заметка может быть полезна для других с таким же вопросом.
источник
Ответы:
В целом, в языке с типами данных (такими как списки, деревья и т. Д.) Легко описать язык функций, которые ведут себя точно так, как мы ожидаем, что примитивная рекурсия будет вести себя.
Например, если тип данныхD и конструкторы c1,…,cn иметь тип
тогда рекурсорrecOD для типа выхода O будет иметь тип
и операционная семантика будет:
для каждогоя ,
Нечто полное рта! По крайней мере, для натуральных чисел мы действительно получаем
как и ожидалось (обратите внимание, что нулевой конструктор имеет нулевые аргументы!).
Если теперь мы допускаем постоянные функции и проекции, и разрешаем произвольное использованиег е грОD для не функциональных типовО тогда у вас точно примитивная рекурсия.
Обнадеживающе, если всеTJя s также не функционируют, тогда обычное кодирование типа данных Гёделя дает те же самые примитивные рекурсивные функции.
Было бы неплохо иметь более элегантное описание этого процесса. Вот почему приходит ответ Карлоса: эти типы данных можно более элегантно описать в теории категорий как начальные алгебры некоторых функторов, часто называемых полиномиальными функторами . Таким образом, рекурсор - это всего лишь (вариант) первоначальный морфизм этой алгебры, который люди, пытающиеся запутать , иногда называют катаморфизмом . Этот морфизм существует благодаря построению начальной алгебры.
Paramorphism это только частный вариант я описал выше.
источник
Недавно я задавал этот вопрос и нашел несколько интересных статей:
Финитарная индуктивно представленная логика : (а) определяет логику, которая обеспечивает общее понятие примитивной рекурсии над любым типом данных, удовлетворяющим определенным требованиям, (б) доказывает, что эта логика является консервативным расширением примитивно-рекурсивной арифметики.
Сложность программ цикла : доказывает, что их понятие программы цикла эквивалентно примитивным рекурсивным функциям.
Логические программы для примитивных рекурсивных множеств : доказывает, что их класс логических программ эквивалентен примитивным рекурсивным функциям.
Теоретико-доказательная характеристика примитивно-рекурсивных функций множества : доказывает, что все примитивно-рекурсивные функции над заданным множеством являются именно теми, которые можно определить в очень слабой теории множеств.
источник
Возможно, вы думаете о концепции параморфизма ?
Из функционального программирования с бананами, линзами, конвертами и колючей проволокой :
Для натуральных чисел параморфизм является функциейh = ( b , ⊕ ) формы
Например, факториальная функция имеетб = 1 а также n ⊕ m = ( n + 1 ) × m ,
Для списков параморфизм будет функциейчас формы
источник