Le lingue normali possono essere complete di Turing?


32

Stavo leggendo di Iota e Jot e ho trovato questa sezione confusa:

A differenza di Iota, in cui l'albero sintattico di una stringa può diramarsi a sinistra oa destra, la sintassi di Jot è uniformemente ramificata a sinistra. Di conseguenza, Iota è strettamente privo di contesto, ma Jot è un linguaggio regolare.

La mia comprensione è che sia Iota che Jot sono Turing completi. Ma a quanto pare, uno è privo di contesto e l'altro è regolare! Sicuramente le lingue regolari non possono essere complete in Turing?


3
Si noti che una lingua che descrive una macchina da banco può essere banalmente scritta in una lingua normale, ad esempio i = {0,1, -1}, b = {fine dell'input} (i + bi + bi) + b (i +) descrive un insieme di regole non vuoto seguito da un input non vuoto. O meglio, puoi interpretarlo in questo modo se hai un interprete, che, come menzionato nelle risposte, è un concetto separato per la classe della lingua.
Cubico

1
@Cubic: del resto, le macchine di Turing possono essere numerate in modo tale che ogni numero rappresenti esattamente una macchina (cioè siano numerabili), e quei numeri possono essere espressi in notazione unaria. Non ho mai studiato bene queste cose, quindi devo lavorare sulle definizioni, ma credo che 1*0sia un linguaggio normale ;-) Anche se non è un linguaggio di programmazione molto amichevole né per il programmatore né per lo scrittore di compilatori.
Steve Jessop,

Risposte:


40

In breve, la risposta è sì.

Ma stai mescolando due significati completamente indipendenti del termine "linguaggio" (sì, questo è confuso):

  • Una serie di stringhe. "Linguaggio senza contesto" significa "un insieme di stringhe che possono essere riconosciute usando una grammatica senza contesto".
  • Un modo per specificare un calcolo. "Lingua completa di Turing" indica "un modo per specificare i programmi in cui è possibile specificare la macchina Turing".

Nota che puoi parlare di "linguaggio C ++" da due punti di vista completamente non correlati, usando i due significati non correlati della parola "linguaggio":

  • C ++ come un insieme di stringhe che sono legali secondo la grammatica C ++
  • C ++ come modo per specificare i programmi.

I tratti del "linguaggio C ++" da questi due punti di vista non sono correlati.

Altri esempi per aiutarti a separare questi concetti:

  • L'espressione "[az] + @ [az]. [Az]" descrive una serie di stringhe riconoscibili da automi finiti, ovvero un linguaggio regolare. Tuttavia, è solo questo - un insieme di stringhe: non è un modo per specificare i programmi (a meno che non si attribuisca un modo di interpretare ciascuna stringa come un programma), quindi non ha senso parlare se è Turing o meno completare.
  • Il linguaggio dei diagrammi di flusso è un modo per specificare i programmi; a seconda del particolare sapore dei diagrammi di flusso, può essere o meno completo di Turing. Tuttavia, i diagrammi di flusso non sono stringhe, quindi non ha assolutamente senso parlare di diagrammi di flusso nel senso "linguaggio come un insieme di stringhe".

3
Vorrei aggiungere che (([a-z][0-9]*)*[A-Z][0-9]*([a-z][0-9]*)*->([a-zA-Z][0-9]*)*)*è una lingua normale in grado di descrivere la grammatica di qualsiasi lingua di classe 0
Erbureth dice Reinstate Monica il

2
{0,1}*

10

Mentre il set di programmi legali in Jot è regolare, Jot stesso è Turing completo. Ciò significa che ogni funzione calcolabile può essere espressa in Jot. Possiamo persino inventare una lingua in cui tutte le stringhe binarie sono legali, ma la lingua stessa è Turing completa (esercizio). Stai confondendo sintassi e semantica.

A proposito, anche i linguaggi senza contesto non sono (probabilmente) completi di NP, poiché hanno un algoritmo di analisi temporale polinomiale.


9

La sola sintassi (codificata negli alberi di sintassi) dei moderni linguaggi di programmazione è lontana da tutto ciò che fanno. In effetti, i linguaggi formali definiti dall'insieme di tutti i programmi in una determinata lingua che vengono compilati senza errori raramente sono anche privi di contesto .

Fattore semantico statico e dinamico nell'equazione. Sono invisibili nell'albero della sintassi ma determinano se un pezzo di codice è in realtà un programma e cosa calcola. In conclusione, il resp. Senza contesto. il linguaggio formale regolare che è definito dalla "sintassi" fornisce una sovrastima del linguaggio di programmazione.

Ora per rispondere alla tua domanda: sì, è possibile. Si consideri, ad esempio, qualsiasi numerazione di Gödel delle macchine di Turing; ottieni il "linguaggio di programmazione" di tutti i numeri naturali, ognuno dei quali rappresenta una TM. Certo, non è un bel linguaggio in cui programmare, ma è certamente un linguaggio completo di Turing che è regolare - banale, persino.


3
  1. Un linguaggio di programmazione è Turing completo se è abbastanza espressivo per specificare ogni funzione calcolabile dalle macchine Turing. Qui stiamo discutendo il potere dei linguaggi specificati nei linguaggi di programmazione . Ad esempio, non è difficile scrivere un interprete per le macchine Turing in Python, quindi Python è un linguaggio di programmazione completo di Turing.

  2. La sintassi di un linguaggio di programmazione , ovvero l'insieme di stringhe corrispondenti a programmi validi nel linguaggio di programmazione, è essa stessa un linguaggio. Ad esempio, considera l'insieme di tutti i possibili programmi Python. La sintassi di un linguaggio di programmazione può essere sensibile al contesto , context-free , regolare , ecc Siamo interessati la difficoltà di verificare che una stringa data è un programma valido nel linguaggio di programmazione (questo è fatto da compilatori / interpreti). Quando diciamo che la sintassi di un linguaggio di programmazione è senza contesto, significa che esiste una grammatica senza contesto per la sua sintassi e implica che ci sono automi push-down per verificare la validità dei programmi,

Si noti che la semplicità della sintassi di un linguaggio di programmazione non implica una limitazione della potenza computazionale dei programmi specificati in tali linguaggi di programmazione.


1

La risposta è si. Vedete, come afferma la risposta accettata, una grammatica è indipendente dal suo significato. Con le stesse parole di Chomsky:

Penso che siamo costretti a concludere che una grammatica è autonoma e indipendente dal significato ...

Chomsky, Syntactic Structures (1956)

Se una grammatica può produrre frasi sufficienti per descrivere tutte le cose che possono essere calcolate, allora possiamo assegnare arbitrariamente un significato computazionale alle sue frasi, una per ogni cosa che può essere calcolata.

Per quanto riguarda un vero esempio concreto, la lingua popolare whitespaceha una grammatica regolare e forse anche x86 assembly languages(necessita di verifica).


Non penso che questo passaggio significhi che la grammatica di Go è una lingua regolare in senso formale; Penso che significhi solo che la grammatica non è irregolare , cioè coerente. Se la sintassi di Go fosse in realtà un linguaggio regolare nella gerarchia di Chomsky, non sarebbe in grado di generare parentesi bilanciate e nidificate.
Tsleyson,

Sì, c'è ricorsione nella grammatica di Go. Aggiornamento post.
Eric
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.