Czy klasa prymitywnych funkcjonałów rekurencyjnych jest równoważna z klasą funkcji, które płód kończy?

9

Płód, jeśli o nim nie słyszałeś, możesz przeczytać tutaj . Wykorzystuje system „macierzy wywołań” i „grafów wywołań”, aby znaleźć wszystkie „zachowania rekurencyjne” wywołań rekurencyjnych w funkcji. Pokazanie, że funkcja się kończy, pokazuje, że wszystkie zachowania rekurencyjne wywołań rekurencyjnych wykonanych do funkcji są zgodne z pewnym „porządkiem leksykograficznym”. Jego sprawdzanie zakończenia pozwala na wszystkie prymitywne funkcje rekurencyjne i funkcje, takie jak funkcja Ackermanna. Zasadniczo umożliwia wielokrotną argumentację prymitywnej rekurencji. Jest to również w zasadzie kontroler terminacji Agdy; Uważam, że Coq ma również podobne funkcje, choć może bardziej ogólne.

Po przeczytaniu artykułu „Total Functional Programming” DA Turnera . Wyjaśnia, że ​​jego proponowany język byłby w stanie wyrazić wszystkie „prymitywne funkcjonały rekurencyjne”, jak widać w Systemie T zbadanym przez Godela. Mówi dalej, że ten system „znany jest z tego, że obejmuje każdą funkcję rekurencyjną, której całość można udowodnić za pomocą logiki pierwszego rzędu”.

Dawka płodu pozwala wszystkim prymitywnym funkcjom rekurencyjnym? Jeśli tak, to czy pozwala na funkcje, które nie są prymitywnymi funkcjami rekurencyjnymi? Czy można podać cytat z odpowiedzią na to pytanie? (nie jest to tak naprawdę konieczne, ponieważ jestem po prostu zainteresowany; po prostu fajne byłoby czytanie małżeństwa w tej sprawie)

Pytanie dodatkowe: pierwotne funkcje funkcjonalne rekurencyjne mają bardzo zwięzłą definicję w odniesieniu do kombinacji: wpisane S i K (które nie mogą wyrazić kombinatory punktu stałego), zero, funkcja następcy i funkcja iteracji; Otóż ​​to. Czy istnieją inne bardziej ogólne takie języki, które mają tak zwięzłą definicję i w których kończą się wszystkie wyrażenia?

Jake
źródło
Na Agdzie vs Coq: Zawsze czytam sprawdzanie terminacji Agdy, aby być bardziej zaawansowanym i akceptującym więcej funkcji, twoje jest pierwszym twierdzeniem, że jest inaczej (jest to dobra zasada przy porównywaniu Agdy do Coq, z wyjątkiem braku taktyki Agdy: Agda jest bardziej badawczy i otwarty na rozszerzenia, których stabilność jest mniej ustalona). Andreas Abel pracował nad jeszcze bardziej zaawansowanymi kontrolerami terminacji opartymi na rozmiarach, patrz jego praca nad MiniAgda, a także ten artykuł .
Blaisorblade
Istnieje „akceptuj więcej definicji funkcji” i „mają większą klasę funkcji obliczalnych”. Oba są nieporównywalne. Agda wygrywa w pierwszej kolejności, ale Coq wyraźnie wygrywa w drugiej kolejności.
cody
Powinienem wyjaśnić, że wcale nie używałem Coq, a Agda tylko trochę. Wydawało się, że z tego, co niewiele czytałem, Coq był w stanie zdefiniować szerszą klasę funkcji obliczalnych, ale nie wiedziałem, więc powiedziałem „Wierzę, że Coq ma również podobne funkcje, choć może bardziej ogólne”; „Belive” i „być może” zostały użyte do przekazania tego, czego nie znałem.
Jake

Odpowiedzi:

7

Tak, kontroler płodu może sprawdzać wszystko w Goedel's T. Możesz to pokazać za pomocą kontrolera, aby pokazać, że operator iteracji w T się kończy. Na przykład zadziała następująca definicja:

iter:A(AA)NAiterif0=iiterif(n+1)=f(iterifn)

Jest to bardzo łatwe do sprawdzenia dla kontrolera płodu (lub większości innych kontrolerów terminacji), ponieważ jest to oczywiście strukturalnie rekurencyjna definicja.

Zarówno Agda, jak i Coq zezwalają na potwierdzenie zakończenia funkcji, które wykraczają daleko poza to, co jest możliwe do udowodnienia, w przypadku arytmetyki pierwszego rzędu. Funkcja, która to umożliwia, polega na tym, że pozwalają one definiować typy poprzez rekurencję danych, co nazywa się „dużą eliminacją”. (W teorii zbiorów ZF schemat zastępowania aksjomat służy mniej więcej temu samemu celowi).

Prostym przykładem czegoś, co wykracza poza T, jest spójność samej T Goedela! Możemy podać składnię jako typ danych:

data T : Set where 
   N : T 
   _⇒_ : T → T → T

data Term : T → Set where 
   zero : Term N
   succ : Term (N ⇒ N)
   k    : {A B : T} → Term (A ⇒ B ⇒ A)
   s    : {A B C : T} → Term ((A ⇒ B ⇒ C) ⇒ (A ⇒ B) ⇒ A ⇒ C)
   r    : {A : T} → Term (A ⇒ (A ⇒ A) ⇒ N ⇒ A)
   _·_  : {A B : T} → Term (A ⇒ B) → Term A → Term B

Zauważ, że zależność typów pozwala nam zdefiniować typ danych terminów zawierających tylko dobrze wpisane terminy T. Możemy wtedy dać funkcję interpretacji dla typów:

interp-T : T → Set 
interp-T N       = Nat 
interp-T (A ⇒ B) = (interp-T A) → (interp-T B)

To mówi, że Npowinny to być liczby naturalne Agdy, a strzałkę T należy interpretować jako przestrzeń funkcji Agdy. Jest to „duża” eliminacja, ponieważ definiujemy zestaw przez rekurencję w strukturze typu danych T.

Następnie możemy zdefiniować funkcję interpretacji, pokazując, że każdy termin T Goedela można interpretować terminem Agda:

interp-term : {A : T} → Term A → interp-T A
interp-term zero    = 0 
interp-term succ    = \n → n + 1
interp-term k       = \x y → x
interp-term s       = \x y z → x z (y z)
interp-term r       = Data.Nat.fold 
interp-term (f · t) = (interp-term f) (interp-term t)

(Nie mam Agdy na tym komputerze, więc niewątpliwie brakuje niektórych importów, deklaracji poprawności i literówek. Naprawianie to ćwiczenie dla czytelnika, który może być także redaktorem, jeśli im się podoba).

Nie wiem, jaka jest siła konsystencji Agdy, ale Benjamin Werner wykazał, że Rachunek Konstrukcji Indukcyjnych (rachunek jądra Coqa) jest zgodny z ZFC i niezliczoną liczbą niedostępnych kardynałów.

Neel Krishnaswami
źródło
Zauważ, że nie użyłeś dużej eliminacji w swoim przykładzie. Duża eliminacja w rzeczywistości nie dodaje mocy obliczeniowej. Impredykatywność ma: system F nie ma tego pierwszego, ale może wyrażać funkcje, których nie można wyrazić w systemie T.
cody
@cody: Funkcja interp-T oblicza zestaw z terminu, który dla mnie wygląda na dużą eliminację! Zdecydowanie jest tak, że duże eliminacje dodają mocy: teoria typu Martina-Loefa nie może nawet wyprowadzić niekonsekwencji od 0 = 1 bez dużej eliminacji. (Aby to zobaczyć, zauważ, że bez wszechświatów / dużych eliminacji możesz wymazać wszystkie zależności i uzyskać po prostu wpisany termin: to właśnie zrobili Harper i Pfenning w swoim dowodzie adekwatności dla LF.)
Neel Krishnaswami
Przepraszam: tak, funkcja interp-T rzeczywiście używa dużej eliminacji. Zgadzam się również, że udowodnienie 0! = 1 rzeczywiście tego wymaga. Jednak zdefiniowanie funkcji obliczalnych nie jest tym samym, co udowodnienie wyrażeń matematycznych . Moja odpowiedź nieco to wyjaśnia. Na przykład czysty rachunek konstrukcji nie może udowodnić 0! = 1. Może jednak stosunkowo łatwo zdefiniować funkcję Ackermanna.
cody
To pokazuje, że Agda ma bardziej ogólny sens, że może napisać interpreter dla systemu T, ale czy nie pokazuje pogody, czy też płód, język, który nie jest zależny od typu, jest bardziej ogólny. Czy płód może to zrobić? Czy Agda nadal byłaby w stanie to zrobić, gdyby nie „duża eliminacja”?
Jake
1
Dokumentacja Agdy mówi, że jej sprawdzanie zakończenia wykorzystuje algorytm płodu. Gdybyś wziął T i rozszerzył go o dopasowanie wzorca i definicje rekurencyjne sprawdzone przez płód, nie byłbyś w stanie napisać w nim interpretera dla T. W rzeczywistości nie zmieniłbyś w ogóle funkcji obliczalnych przez T - wszystkie zlecenia zakończenia Obliczenia płodu są dobrze uzasadnione w arytmetyce Peano. (Zobacz odpowiedź cody.) Algorytm płodu pozwala pisać więcej definicji , bez zmiany zestawu funkcji, które można obliczyć. Duże eliminacje Agdy faktycznie zwiększają zestaw funkcji.
Neel Krishnaswami,
3

W ramach wyjaśnienia powinienem zauważyć, że płód jest opracowywany przez Andreasa Abla , który opracował również oryginalny program sprawdzający zakończenie dla Agdy i od tego czasu pracował nad bardziej zaawansowanymi technikami przerywania .

Odpowiedź na twoje pytanie może być nieco rozczarowująca: klasa funkcji N do Nto dokładnie funkcje, które można zdefiniować w systemieF. Powód tego: wspomniana klasa jest równa możliwym do udowodnienia funkcji kończącej w arytmetyki drugiego rzędu (PA2), co z kolei jest równe funkcjom definiowanym w systemie F(patrz np. Dowody i typy , rozdział 11). Ponadto, jeśli usuniesz polimorfizm, wówczas upadasz do funkcji definiowanych wPA, które zdarza się zbieżne z tymi, które można zdefiniować w systemie T.

Ponownie, powodem tego jest to, że spadek wychwycony przez „matryce wywoływania” jest udowodniony , i że dowód ten można przeprowadzić całkowicie wPA.

Nie oznacza to jednak, że płód nie jest bardziej przydatny niż systemT! W praktyce wymagane są bardziej złożone analizy terminacji, aby móc zaakceptować niektóre prezentacje funkcji obliczeniowych. Nie musisz na przykład wykonywać skomplikowanego dowodu w arytmetyki Peano za każdym razem, gdy piszesz funkcję unifikacyjną. Pod tym względem płód jest bardzo potężny i pozwala definiować funkcje w sposób, który nie byłby akceptowany przez Coq, Agda ani żaden inny powszechny system dowodowy.

cody
źródło
w jaki sposób klasa funkcji, które można zakończyć (PA ^ 2), może być równoważna klasie funkcji w systemie F, których nie można udowodnić, o ile mi wiadomo? Nie rozumiem też, w jaki sposób odpowiadasz na moje pytanie. Czy mówisz, że system T ma większą klasę obliczalnych funkcji, czy mówisz, że płód jest? Myślę, że nastąpił skok w twojej logice, który oczekiwał, że mam więcej doświadczenia niż w rzeczywistości. Podany link wydaje się również prowadzić do złej strony, która nie wyświetla się poprawnie.
Jake
Funkcje w systemie F zostają zakończone. Płód przechwytuje większą klasę funkcji obliczalnych niż system T, ale „przypadkowo”, jeśli usuniesz polimorfizm, wówczas płód przechwytuje dokładnie system T. Czy możesz mi powiedzieć, które łącze nie działa dla Ciebie? (i jakiej przeglądarki używasz :)
cody
1

Jeśli przez prymitywne funkcjonały rekurencyjne masz na myśli prymitywne funkcje rekurencyjne i wiesz, że płód zawiera funkcję Ackermanna, wówczas płód nie pokrywa się z klasą funkcji pr, ponieważ funkcja Ackermanna nie jest pierwotną rekurencyjną. Zostało to pokazane przez Ackermanna, a później uproszczony dowód przedstawił Rosza Peter w „ Konstruktion nichtrekursiver Funktionen ” 1935 (niestety, o ile wiem, tylko w języku niemieckim).

Jeśli szukasz większych klas funkcji rekurencyjnych, które mają zagwarantowane zakończenie, które mogą zbiegać się z klasą funkcji przechwyconych przez Płód, to może zainteresować Cię inne dzieło Roszy Peter.

Funkcja Ackermanna jest zawarta w klasie wielu funkcji rekurencyjnych zdefiniowanych przez Roszy Peter w „ Uber die mehrfache Rekursion ” 1937. Nieoficjalnie idea wielokrotnej rekurencji polega na tym, że możesz mieć wiele zmiennych rekurencyjnych, które mogą się zmieniać po kroku rekurencyjnym. Na przykładf(a,b) może zadzwonić f(a,b1) lub f(a1,b).

Jednak silniejszą klasę stanowi koncepcja rekurencji transfinitowej opisana w „ Zusammenhang der mehrfachen und transfiniten RekursionRoszy Peter. W przypadku rekurencji transfinitowej masz jedną zmienną rekurencyjną, która może wywoływać poprzedników wrt na specjalne zamówienie<

Na przykład można zinterpretować liczbę całkowitą jako parę liczb całkowitych i użyć kolejności

(a,b)<(c,d)(a<cbd)(acb<d)
Można to uogólnić dla potrójnych liczb całkowitych i tak dalej. Piotr nazywa te porządkiω2,ω3i tak dalej. Możesz pójść o krok dalej i zinterpretować liczbę całkowitą jako dowolną liczbę całkowitą. Pozwolićpi być i-ta liczba pierwsza. Następnie możemy rozważyćz=p1np2x1p3x2 gdzie n oznacza liczbę liczb całkowitych zakodowanych w z i xizawierają odpowiednio. wartość. Oznacza porządek dla takiej liczby liczb całkowitych jakωωi pokazuje po przekątnej, że tego rodzaju rekurencja jest silniejsza niż wielokrotna rekurencja. Nie jestem jednak pewien, czy istnieje charakterystyka składniowa tej klasy.

[edytuj] Pierwotne funkcje rekurencyjne nie są takie same jak pierwotne funkcje rekurencyjne, jak zauważono w komentarzu poniżej. Myślę jednak, że można przenieść koncepcję rekurencji transfinitowej na funkcjonały. Jednak nie jest jasne, czy nadal ma większą moc w stosunku do ustawienia funkcjonalnego.

John D.
źródło
2
klasa prymitywnych funkcjonałów rekurencyjnych typu skończonego jest bardziej ogólna niż klasa prymitywnych funkcji rekurencyjnych. Może na przykład wyrażać funkcję Ackermanna i można go zobaczyć w systemie Godela T.
Jake