Una lingua totale che solo una lingua completa di Turing può interpretare


16

Qualsiasi lingua che non sia completa di Turing non può scrivere da sola un interprete. Non ho idea di dove l'ho letto, ma l'ho visto usato diverse volte. Sembra che questo dia origine a una sorta di linguaggio definitivo "ultimo" non turing; quello (i) che può soloessere interpretato da una macchina di Turing. Queste lingue non sarebbero necessariamente in grado di calcolare tutte le funzioni totali dai naturali ai naturali né sarebbero necessariamente isomorfe (cioè forse le lingue finali A e B esistono in modo tale che esiste una funzione F che A può calcolare ma B non può). Agda è in grado di interpretare il sistema T di Godel e Agda è totale, quindi un linguaggio così estremo dovrebbe essere strettamente più potente del sistema T di Godel. Mi sembra che un linguaggio del genere sarebbe almeno altrettanto potente di agda (anche se non ho prove, solo un sospetto).

Qualche ricerca è stata fatta in questo senso? Quali risultati sono noti (ovvero si conosce un linguaggio così "ultimo")?

Bonus: sono preoccupato che esista un caso patologico che non può calcolare funzioni che il Sistema T di Godel potrebbe ancora essere interpretato da una macchina di Turing perché consente di calcolare alcune funzioni davvero strane. È questo il caso o possiamo sapere che un tale linguaggio sarebbe in grado di calcolare qualsiasi cosa il Sistema T di Godel potrebbe calcolare?


2
Le tue dichiarazioni sono confuse a causa del modo in cui usi la terminologia. Invece di fare affidamento sulla terminologia, cerca di formulare la tua domanda in modo matematicamente rigoroso e chiaro in modo che possiamo capire la tua domanda. Cosa intendi per linguaggio di programmazione nel contesto della teoria della calcolabilità? Intendi un elenco di funzioni calcolabili?
Kaveh,

1
La mia ipotesi su ciò che leggi: se una lingua è abbastanza forte e contiene la funzione universale di un'altra classe di funzioni, allora può definire la funzione diagonale per quella classe. Se è una classe di funzioni totali, la funzione diagonale non può essere nella classe.
Kaveh,

È stato dichiarato in modo informale dove l'ho trovato. Qualcosa letteralmente in linea con quello che ho dato qui. Non so neanche come affermarlo in modo matematico. Dopo alcune letture non sono sicuro di quale sia la "funzione diagonale di una classe di funzioni". Penso ai tuoi termini che intendo dire che "una classe di funzioni totali non può contenere la propria funzione universale" e quindi penso di chiederti "per quale classe di funzioni totali C è il caso che nessuna classe di funzioni totali contenga il funzione universale per C ". Se capisco cos'è una "funzione universale", penso che sia corretto.
Jake,

1
A rigor di termini, questa non è una domanda a livello di ricerca. Inoltre, perché questa è una wiki della comunità? O è?
Andrej Bauer,

"Sembra che questo dia origine a una specie di linguaggio completo" definitivo "non trending; quello (i) che può essere interpretato solo da una macchina di Turing." non seguire questa affermazione sembra un non sequitur, che cosa vuoi dire, perché sembra così?
vzn,

Risposte:


42

Questa è una domanda mal formulata, quindi prima diamo un senso. Lo farò secondo lo stile della teoria della calcolabilità. Quindi userò i numeri anziché le stringhe: un pezzo di codice sorgente è un numero, piuttosto che una stringa di simboli. Non importa, si può sostituire con s t r i n g tutto di seguito.Nstring

Lasciate essere una funzione coppia .m,n

Supponiamo che un linguaggio di programmazione sia dato dai seguenti dati:L=(P,ev)

  1. un insieme decidibile di "programmi validi", ePN
  2. un calcolabile e parziale funzione .ev:P×NN

Il fatto che sia decidibile significa che esiste una mappa calcolabile totale v a l i d : N{ 0 , 1 } tale che v a l i d ( n ) = 1Pvun'liod:N{0,1} . Informalmente, stiamo dicendo che è possibile dire se una determinata stringa è un pezzo di codice valido. La funzione e v è essenzialmente un interprete per la nostra lingua: e v ( m , n ) esegue il codice m sull'input n - il risultato potrebbe essere indefinito.vun'liod(n)=1nPevev(m,n)mn

Ora possiamo introdurre alcuni termini:

  1. Una lingua è totale se è una funzione totale per tutti m P .nev(m,n)mP
  2. Una lingua interpreta la lingua L 2 = ( P 2 , e v 2 )L1=(P1,ev1) L2=(P2,ev2) se esiste tale che e v 1 ( u , n , m ) e v 2 ( n , m ) per tutto n PuP1ev1(u,n,m)ev2(n,m)nPe . Qui u è il simulatore per L 2 implementato in L 1 . È anche noto come il programma universale per L 2 .mNuL2L1L2

Altre definizioni di " interpreta L 2 " sono possibili, ma non mi permetta di entrare in questo ora.L1L2

Diciamo che e L 2 sono equivalenti se si interpretano a vicenda.L1L2

Esiste il linguaggio "più potente" delle macchine di Turing (che si chiama "una macchina di Turing") in cui n N è una codifica di una macchina di Turing e φ ( n , m ) è la funzione calcolabile parziale che "esegue la macchina di Turing codificata da n sull'ingresso m ". Questo linguaggio può interpet tutte le altre lingue, ovviamente, dal momento che abbiamo richiesto e v di essere calcolabile.T=(N,φ)nNφ(n,m)nmev

La nostra definizione di linguaggi di programmazione è molto rilassata. Affinché ciò accada, richiediamo altre tre condizioni:

  • implementa la funzione successore: c'èL tale che e v ( s u c c , m ) = m + 1 per tutti m N ,SuccPev(Succ,m)=m+1mN
  • implementa la funzione diagonale: c'è d iL tale che e v ( d i una g , m ) = m , m per tutti m N ,dioun'gPev(dioun'g,m)=m,mmN
  • è chiuso per composizione di funzioni: se L implementa f e g implementa anche f g ,LLfgfg

Un risultato classico è questo:

Teorema: se una lingua può interpretare se stessa, non è totale.

Prova. Supponiamo è il programma universale per un totale langauge L implementato in L , cioè per tutti m P e n N , e v ( u , m , n ) e v ( m , n ) . Come successore, diagonale ed e v ( u , - ) sono implementati in L , così è la loro composizione k uLLmPnN

ev(u,m,n)ev(m,n).
ev(u,)L . Esiste n 0P tale che e v ( n 0 , k ) k , k ) + 1 , ma poi e v ( u , n 0 , n 0) e v (kev(u,k,k)+1n0Pn 0 , n 0ev(n0,K)ev(u,K,K)+1 Poiché non c'è un numero uguale proprio successore, ne consegue che L non è totale o che L non viene interpretata stessa. QED.
ev(u,n0,n0)ev(n0,n0)ev(u,n0,n0)+1
LL

Ricorda che potremmo sostituire la mappa successiva con qualsiasi altra mappa senza fixpoint.

Ecco un piccolo teorema che penso risolverà un malinteso.

Teorema: ogni lingua totale può essere interpretata da un'altra lingua totale.

Prova. Sia una lingua totale. Otteniamo un L totale che interpreta L confinando con L il suo valutatore e v . Più precisamente, lasciare che P ' = { 0 , n | n P } { 1 , 0 } e definire e v ' come e v ' ( b , n , mLL'LLevP'={0,n|nP}{1,0}ev' Ovviamente,L'è totale perchéLè totale. Per vedere cheL'in grado di simulareLbasta prendereu=1,0

ev'(B,n,m)={ev(n,m)Se B=0,ev(m0,m1)Se B=1 e m=m0,m1
L'LL'L , Da allora e v ' ( u , m , n ) e v ( m , n ) , come richiesto. QED.u=1,0ev'(u,m,n)ev(m,n)

Esercizio: [aggiunto il 27/06/2014] La lingua costruita sopra non è chiusa sotto composizione. Correggi la dimostrazione del teorema in modo che L ' soddisfi i requisiti extra se L lo fa.L'L'L

LL'L'LLL


Se ho selezionato la casella di spunta wiki non era intenzionale.
Andrej Bauer,

2
Esiste un potere extra nelle lingue in cui non puoi dire se un determinato programma è valido o no?
Phylliida,

3
@DaniPhye: se la sintassi del linguaggio non è semidecidabile, è possibile "nascondere" la potenza computazionale nella sintassi. Ad esempio, le regole del linguaggio potrebbero richiedere che ogni funzione sia dotata di un bit che indica se la funzione è totale. Potremmo quindi implementare is_total, che altrimenti non è calcolabile, ma non è possibile implementare la valutazione (perché dovresti calcolare anche il bit della funzione risultante). In generale, direi che non è un linguaggio di programmazione se non puoi nemmeno implementare un parser per questo.
Andrej Bauer,

3
Come funziona "Se una lingua può interpretarsi da sola, allora non è totale" gel con questo risultato: un interprete di sé per F-omega ?
Cactus,


18

Qualsiasi lingua che non sia completa di Turing non può scrivere da sola un interprete.

Questa affermazione non è corretta. Considera il linguaggio di programmazione in cui la semantica di ogni stringa è "Ignora l'input e interrompi immediatamente". Questo linguaggio di programmazione non è completo di Turing ma ogni programma è un interprete per la lingua.


Ah! Questo è un buon punto. Quindi ci devono essere determinati requisiti su ciò che la lingua calcola. Sembra che debbano essere fatti alcuni requisiti minimi sul potere della lingua per rendere vera questa affermazione. Sembra che se chiedessimo di essere in grado di risolvere i problemi aritmetici di base, allora potrebbe valere.
Jake,

@Jake Potresti effettivamente riuscire a cavartela con qualcosa di incredibilmente debole come "la lingua definisce almeno una funzione non costante" o "la lingua definisce più di una funzione". Il mio controesempio è chiaramente banale per qualsiasi definizione ragionevole di "banale".
David Richerby,

Mi sembra un problema interessante a cui pensare. Se trovo qualcosa, ti risponderò.
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.