Pierwotne funkcje rekurencyjne są zdefiniowane ponad liczbami naturalnymi. Wydaje się jednak, że koncepcja powinna uogólnić na inne typy danych, pozwalając mówić o prymitywnych funkcjach rekurencyjnych, które mapują listy na przykład na drzewa binarne. Przez analogię częściowe funkcje rekurencyjne nad liczbami naturalnymi ładnie uogólniają się na funkcje obliczeniowe na dowolnym typie danych i chciałbym zrozumieć, jak zrobić ten sam rodzaj uogólnienia dla pierwotnych funkcji rekurencyjnych.
Intuicyjnie, gdybym miał zdefiniować prosty imperatywny język, który pozwalałby na podstawowe operacje, powiedzmy listy (takie jak konkatenacja, wzięcie głowy i ogona, porównanie elementów) oraz formę iteracji, która wymaga wcześniejszej wiedzy o liczbie iteracji ( takich jak iteracja elementów na niezmiennej liście), wówczas taki język powinien co najwyżej być w stanie obliczyć pierwotne funkcje rekurencyjne na listach. Ale w jaki sposób mogę to zrozumieć formalnie, a dokładniej, jak miałbym udowadniać, że mój język oblicza wszystkie prymitywne funkcje rekurencyjne na listach, a nie tylko ich podzbiór?
Dla jasności interesuje mnie raczej rozumienie pierwotnych funkcji rekurencyjnych jako dobrze zdefiniowanej klasy funkcji (jeśli rzeczywiście są), a nie tylko działanie samej pierwotnej funkcji rekurencyjnej, co wydaje się proste. Byłbym zainteresowany wskazówkami do wszystkiego, co napisano o prymitywnej rekurencji w stosunku do ogólnych struktur danych, a nawet w jakimkolwiek kontekście innym niż liczby naturalne.
aktualizacja: Być może znalazłem odpowiedź w artykule zatytułowanym Walther Recursion autorstwa McAllestera i Arkoudasa. (Postępowanie z CADE 1996. ) Wydaje się, że zawiera uogólnioną wersję prymitywnej rekurencji, a także silniejszą rekurencję Walthera. Zamierzam napisać odpowiedź na pytanie, kiedy to przeczytam, ale w międzyczasie ta notka może być pomocna dla innych z tym samym pytaniem.
źródło
Odpowiedzi:
Zasadniczo w języku z typami danych (takimi jak listy, drzewa itp.) Łatwo jest opisać język funkcji, które zachowują się dokładnie tak, jak oczekujemy pierwotnej rekurencji.
Na przykład, jeśli typem danych jestre i konstruktorów do1, ... ,don mieć typ
następnie rekursorr e cOre dla typu wyjściowego O będzie miał typ
a semantyka operacyjna będzie:
dla każdegoja .
Coś pełnego ust! Przynajmniej otrzymujemy liczby naturalne
zgodnie z oczekiwaniami (zauważ, że konstruktor zerowy ma zero argumentów!).
Jeśli teraz pozwolimy na stałe funkcje i prognozy, i pozwolimy na dowolne użycierecOD dla typów niefunkcyjnychO , to masz dokładnie prymitywną rekurencję.
Krzepiące, jeśli wszystkieTji s są również niefunkcjonalne, wówczas zwykłe kodowanie typu danych według Gödla daje te same prymitywne funkcje rekurencyjne.
Byłoby miło mieć bardziej elegancki opis tego procesu. Oto odpowiedź Carlosa: te typy danych można bardziej elegancko opisać w teorii kategorii jako początkowe algebry niektórych funktorów, często nazywane funktorami wielomianowymi . Rekursor jest wtedy (wariantem) początkowym morfizmem tej algebry, czasem nazywanym katamorfizmem przez ludzi próbujących coś pomylić. Ten morfizm istnieje dzięki konstrukcji początkowej algebry.
Paramorphism to tylko szczególny wariant opisałem powyżej.
źródło
Niedawno zadałem to pytanie i znalazłem kilka interesujących artykułów:
Finitary Indukcyjnie przedstawiona logika : (a) definiuje logikę, która zapewnia ogólne pojęcie prymitywnej rekurencji na dowolnym typie danych spełniającym określone wymagania (b) dowodzi, że logika ta jest konserwatywnym rozszerzeniem prymitywnej arytmetyki rekurencyjnej.
Złożoność programów pętli : dowodzi, że ich pojęcie programu pętli jest równoważne prymitywnym funkcjom rekurencyjnym.
Programy logiczne dla pierwotnych zestawów rekurencyjnych : dowodzi, że ich klasa programów logicznych jest równoważna z pierwotnymi funkcjami rekurencyjnymi.
Teoretyczna charakterystyka pierwotnych funkcji zbioru rekurencyjnego : dowodzi, że wszystkie pierwotne funkcje rekurencyjne w danym zbiorze są tylko tymi, które można zdefiniować w bardzo słabej teorii zbiorów.
źródło
Być może myślisz o koncepcji paramorfizmu ?
Z programowania funkcjonalnego z bananami, soczewkami, kopertami i drutem kolczastym :
Dla liczb naturalnych paramorfizm jest funkcjąh=(b,⊕) formularza
Na przykład funkcja silnia mab=1 i n⊕m=(n+1)×m .
W przypadku list funkcją byłby paramorfizmh formularza
źródło