La classe di funzionali di ricorsione primitiva è equivalente alla classe di funzioni che Fetus dimostra di terminare?


9

Feto, se non ne hai sentito parlare, può essere letto qui . Utilizza un sistema di "matrici di chiamata" e "grafici di chiamata" per trovare tutti i "comportamenti ricorsivi" delle chiamate ricorsive in una funzione. Mostrare che una funzione termina mostra che tutti i comportamenti ricorsivi delle chiamate ricorsive fatte a una funzione obbediscono a un certo "ordinamento lessicografico". Il suo controllo di terminazione consente tutte le primitive funzioni ricorsive e funzioni come la funzione di Ackermann. Fondamentalmente consente la ricorsione primitiva multi-argomento. Questo è fondamentalmente anche il controllo di terminazione di Agda; Credo che Coq abbia alcune strutture simili, anche se forse più generali.

Dalla lettura dell'articolo "Programmazione funzionale totale" di DA Turner . Spiega che il suo linguaggio proposto sarebbe in grado di esprimere tutti i "funzionali primitivi ricorsivi" come visto nel Sistema T studiato da Godel. Prosegue affermando che questo sistema è "noto per includere ogni funzione ricorsiva la cui totalità può essere dimostrata nella logica del primo ordine".

Dose Feto consente tutti i funzionali primitivi ricorsivi? In tal caso, consente funzioni che non sono funzionali ricorsivi primitivi? È possibile fornire una citazione per la risposta a questo? (questo non è in realtà necessario perché sono solo interessato; è solo che leggere un po 'di coniugi sulla questione sarebbe carino)

Domanda bonus: i funzionali ricorsivi primitivi hanno una definizione molto concisa in termini di combinatori: S e K digitati (che non possono esprimere i combinatori a punto fisso), zero, la funzione successore e la funzione di iterazione; questo è tutto. Esistono altre lingue più generali con una definizione così concisa e in cui terminano tutte le espressioni?


Su Agda vs Coq: leggo sempre il controllo di terminazione di Agda per essere più avanzato e accetta più funzioni, la tua è la prima affermazione contraria (questa è una buona regola empirica quando si confronta Agda con Coq, fatta eccezione per la mancanza di tattiche di Agda: Agda è più ricercato e aperto alle estensioni la cui stabilità è meno stabilita). Andreas Abel ha lavorato su controllori di terminazione ancora più avanzati basati su tipi dimensionati, guarda i suoi lavori su MiniAgda e anche questo documento .
Blaisorblade,

C'è "accetta più definizioni di funzioni" e "hanno una classe più ampia di funzioni calcolabili". I due sono incomparabili. Agda vince sul primo conteggio, ma Coq vince chiaramente sul secondo.
cody

Dovrei chiarire che non ho usato affatto Coq e Agda solo un po '. Sembrava che da quel poco che leggevo Coq fosse in grado di definire una classe più ampia di funzioni calcolabili ma non lo sapevo, quindi ho detto "Credo che Coq abbia delle strutture simili anche se forse più generali"; "credere" e "forse" erano usati per comunicare che non lo sapevo.
Jake,

Risposte:


7

Sì, il correttore Fetus può digitare qualsiasi cosa nel T. di Goedel. Puoi mostrarlo usando il controllore per mostrare che l'operatore di iterazione in T sta terminando. Ad esempio, funzionerà la seguente definizione:

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

Questo è molto facile da controllare per il correttore Fetus (o quasi ogni altro controllore di terminazione), poiché è una definizione ovviamente strutturalmente ricorsiva.

Agda e Coq consentono entrambi di dimostrare la conclusione di funzioni che vanno ben oltre ciò che è dimostrabilmente totale nell'aritmetica del primo ordine. La caratteristica che consente ciò è che consentono di definire i tipi mediante ricorsione sui dati, che si chiama "eliminazione di grandi dimensioni". (Nella teoria degli insiemi ZF, lo schema assiomatico di sostituzione ha approssimativamente lo stesso scopo.)

Un semplice esempio di qualcosa che va oltre T è la coerenza della T di Goedel stessa! Possiamo fornire la sintassi come tipo di dati:

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

Si noti che la dipendenza dal tipo ci consente di definire un tipo di dati di termini contenente solo i termini ben scritti di T. Possiamo quindi fornire una funzione di interpretazione per i tipi:

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

Questo dice che Ndovrebbero essere i numeri naturali di Agda e la freccia di T dovrebbe essere interpretata come lo spazio delle funzioni di Agda. Questa è una "grande" eliminazione, perché definiamo un set per ricorsione sulla struttura del tipo di dati T.

Possiamo quindi definire una funzione di interpretazione, dimostrando che ogni termine della T di Goedel può essere interpretato da un termine 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)

(Non ho Agda su questa macchina, quindi ci sono senza dubbio alcune importazioni mancanti, dichiarazioni di fissità e errori di battitura. Risolvere questo è un esercizio per il lettore, che può anche essere un editore, se lo desidera.)

Non so quale sia la forza di coerenza di Agda, ma Benjamin Werner ha dimostrato che il calcolo delle costruzioni induttive (calcolo del kernel di Coq) è coerente con lo ZFC, oltre a numerosi cardinali inaccessibili.


Nota che non hai usato l'eliminazione di grandi dimensioni nel tuo esempio. La grande eliminazione in realtà non aggiunge potere computazionale. L'impredicatività fa: il sistema F non ha il primo, ma può esprimere funzioni non espressibili nel sistema T.
cody

@cody: la funzione interp-T calcola un set da un termine, che mi sembra una grande eliminazione! È sicuramente il caso che grandi eliminazioni aggiungano potere: la teoria dei tipi di Martin-Loef non può nemmeno derivare l'incoerenza da 0 = 1 senza una grande eliminazione. (Per vedere questo, nota che senza universi / grandi eliminazioni puoi cancellare tutte le dipendenze e ottenere un termine semplicemente digitato: questo è ciò che Harper e Pfenning hanno fatto nella loro prova di adeguatezza per LF.)
Neel Krishnaswami

Mi dispiace: sì, la funzione interp-T utilizza davvero una grande eliminazione. Concordo anche sul fatto che dimostrare 0! = 1 lo richiede davvero. Tuttavia, definire le funzioni calcolabili non è la stessa cosa che provare affermazioni matematiche . La mia risposta chiarisce un po 'questo. Il puro calcolo delle costruzioni, ad esempio, non può dimostrare 0! = 1. Può, tuttavia, definire la funzione di Ackermann con relativa facilità.
cody

Ciò dimostra che Agda ha un senso più generale, può scrivere un interprete per il sistema T, ma non mostra il tempo o no Fetus, una lingua che non è tipizzata in modo dipendente, è più generale. Feto può farlo? Agda sarebbe ancora in grado di farlo se non fosse per "una grande eliminazione"?
Jake,

1
La documentazione di Agda afferma che il suo controllore di terminazione utilizza l'algoritmo Fetus. Se prendessi T e lo estendessi con pattern matching e definizioni ricorsive controllate da Fetus, non saresti in grado di scrivere un interprete per T in esso. In effetti, non cambieresti affatto le funzioni calcolabili da T: tutti gli ordini di terminazione calcolati da Fetus sono dimostrati fondamentalmente nell'aritmetica di Peano. (Vedi la risposta di cody.) L'algoritmo Fetus ti consente di scrivere più definizioni , senza cambiare il set di funzioni che puoi calcolare. Le grandi eliminazioni di Agda aumentano effettivamente l'insieme di funzioni.
Neel Krishnaswami,

3

A titolo di chiarimento, dovrei notare che Fetus è sviluppato da Andreas Abel , che ha anche sviluppato il controllo di terminazione originale per Agda , e da allora ha lavorato su tecniche di terminazione più avanzate .

NNFPA2FPAT

PA

T


come può una classe di funzioni che stanno terminando in modo dimostrabile (PA ^ 2) essere equivalente alla classe di funzioni nel sistema F che non sono in grado di terminare per quanto ne so? Inoltre non capisco come mi stai rispondendo alla domanda. Stai dicendo che il sistema T ha una classe più ampia di funzioni calcolabili o stai dicendo che il feto lo è? Penso che ci sia stato un balzo nella tua logica che si aspettava che avessi più retroscena di quello che effettivamente faccio. Anche il collegamento fornito sembra condurre a una pagina non valida che non viene visualizzata correttamente.
Jake,

Le funzioni nel sistema F terminano tutte. Fetus acquisisce una classe più ampia di funzioni calcolabili rispetto al sistema T, ma "per caso", se rimuovi il polimorfismo, Fetus acquisisce solo il sistema T. Puoi dirmi quale link non funziona per te? (e quale browser stai usando :)
cody

1

Se per funzionali primitivi ricorsivi intendete funzioni ricorsive primitive e sapete che il feto contiene la funzione di Ackermann, allora il feto non coincide con la classe di funzioni pr poiché la funzione di Ackermann non è ricorsiva di base. Ciò è stato mostrato da Ackermann e in seguito una dimostrazione semplificata è stata data da Rosza Peter in " Konstruktion nichtrekursiver Funktionen " 1935 (purtroppo solo in tedesco per quanto ne so).

Se cerchi classi più grandi di funzioni ricorsive che sono garantite per terminare che potrebbero coincidere con la classe di funzioni acquisite da Fetus, allora potrebbero interessarti altre opere di Rosza Peter.

f(a,b)f(a,b1)f(a1,b)

<

(a,b)<(c,d)(a<cbd)(acb<d)
ω2,ω3piiz=p1np2x1p3x2nzxiωω

[modifica] Le funzioni ricorsive primitive non sono le stesse di quelle ricorsive primitive come indicato nel commento qui sotto. Eppure penso che si potrebbe trasferire il concetto di ricorsione transfinita ai funzionali. Tuttavia, non è chiaro se sia ancora più potente rispetto a un'impostazione funzionale.


2
la classe di funzionali ricorsivi primitivi di tipo finito è più generale della classe di funzioni ricorsive primitive. Può esprimere la funzione di Ackermann per esempio e può essere visto nel sistema di Godel T.
Jake
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.