Os idiomas regulares podem ser completos de Turing?

32

Eu estava lendo sobre Iota e Jot e achei esta seção confusa:

Diferentemente de Iota, onde a árvore sintática de uma sequência pode ramificar-se à esquerda ou à direita, a sintaxe Jot é ramificada à esquerda de maneira uniforme. Como resultado, o Iota é estritamente livre de contexto, mas o Jot é uma linguagem comum.

Meu entendimento é que tanto Iota quanto Jot estão completos em Turing. Mas, aparentemente, um é livre de contexto e o outro é regular! Certamente idiomas regulares não podem ser completos de Turing?

sdleihssirhc
fonte
3
Observe que um idioma que descreve uma máquina de turing pode ser escrito trivialmente em um idioma regular, por exemplo, i = {0,1, -1}, b = {final da entrada} (i + bi + bi) + b (i +) descreve um conjunto de regras não vazio seguido por uma entrada não vazia. Ou melhor, você pode interpretá-lo dessa maneira, se você tiver um intérprete, que, como as respostas mencionam, é um conceito separado para a classe da linguagem.
Cubic
1
@ Cubic: por falar nisso, as máquinas de Turing podem ser numeradas de modo que cada número represente exatamente uma máquina (ou seja, são contáveis), e esses números podem ser expressos em notação unária. Eu nunca estudei essas coisas corretamente, então tenho que trabalhar nas definições, mas acho que 1*0é uma linguagem comum ;-) Embora não seja uma linguagem de programação muito amigável para o programador ou o compilador-escritor.
21715 Steve Joplin

Respostas:

40

Em suma, a resposta é sim.

Mas você está misturando dois significados completamente não relacionados ao termo "linguagem" (sim, isso é confuso):

  • Um conjunto de cordas. "Linguagem livre de contexto" significa "um conjunto de strings que podem ser reconhecidos usando uma gramática livre de contexto".
  • Uma maneira de especificar um cálculo. "Linguagem completa de Turing" significa "uma maneira de especificar programas nos quais a máquina de Turing pode ser especificada".

Observe que você pode falar sobre "a linguagem C ++" de dois pontos de vista completamente independentes, usando os dois significados não relacionados da palavra "linguagem":

  • C ++ como um conjunto de strings que são legais de acordo com a gramática C ++
  • C ++ como uma maneira de especificar programas.

As características da "linguagem C ++" desses dois pontos de vista não são relacionadas.

Mais exemplos para ajudá-lo a separar esses conceitos:

  • A expressão "[az] + @ [az]. [Az]" descreve um conjunto de strings reconhecíveis por autômatos finitos, ou seja, uma linguagem comum. No entanto, é apenas isso - um conjunto de strings: não é uma maneira de especificar programas (a menos que você atribua uma maneira de interpretar cada uma dessas strings como um programa), portanto, não faz sentido falar se é ou não Turing- completo.
  • A linguagem dos fluxogramas é uma maneira de especificar programas; dependendo do sabor particular dos fluxogramas, ele pode ou não estar completo com Turing. No entanto, fluxogramas não são cadeias de caracteres, portanto, não faz sentido falar sobre fluxogramas no sentido de "linguagem como um conjunto de cadeias de caracteres".
jkff
fonte
3
Eu acrescentaria que (([a-z][0-9]*)*[A-Z][0-9]*([a-z][0-9]*)*->([a-zA-Z][0-9]*)*)*é uma linguagem comum capaz de descrever a gramática de qualquer linguagem da classe 0
Erbureth diz Reinstate Monica
2
{0 0,1}
10

Enquanto o conjunto de programas legais no Jot é regular, o próprio Jot é Turing-complete. Isso significa que cada função computável pode ser expressa em Jot. Podemos até criar uma linguagem na qual todas as strings binárias são legais, mas a própria linguagem é Turing completa (exercício). Você está confundindo sintaxe e semântica.

A propósito, as linguagens livres de contexto também (provavelmente) não são completas para NP, pois possuem um algoritmo de análise de tempo polinomial.

Yuval Filmus
fonte
9

Somente a sintaxe (como codificada nas árvores de sintaxe) das linguagens de programação modernas está longe de tudo o que fazem. De fato, as linguagens formais definidas pelo conjunto de todos os programas em uma determinada linguagem que são compiladas sem erros raramente são livres de contexto .

A semântica estática e dinâmica é fator na equação. Eles são invisíveis na árvore de sintaxe, mas determinam se um pedaço de código é realmente um programa e o que ele calcula. Bottom line, o resp livre de contexto. linguagem formal regular, definida por "sintaxe", fornece uma super - aproximação da linguagem de programação.

Agora, para responder sua pergunta: sim, é possível. Considere, por exemplo, qualquer numeração Gödel de máquinas de Turing; você obtém a "linguagem de programação" de todos os números naturais, cada um representando uma TM. É verdade que não é uma linguagem agradável de se programar, mas certamente é uma linguagem completa de Turing que é regular - trivial, até.

Rafael
fonte
3
  1. Uma linguagem de programação é Turing-complete se for expressiva o suficiente para especificar todas as funções computáveis ​​pelas máquinas de Turing. Aqui estamos discutindo o poder das linguagens especificadas nas linguagens de programação . Por exemplo, não é difícil escrever um intérprete para máquinas de Turing em Python, portanto, Python é uma linguagem de programação completa de Turing.

  2. A sintaxe de uma linguagem de programação , ou seja, o conjunto de strings correspondentes a programas válidos na linguagem de programação, é ela própria uma linguagem. Por exemplo, considere o conjunto de todos os programas Python possíveis. A sintaxe de uma linguagem de programação pode ser sensível ao contexto , livre de contexto , normal , etc. Estamos interessados na dificuldade de verificar se uma determinada string é um programa válido na linguagem de programação (isto é feito por compiladores / intérpretes). Quando dizemos que a sintaxe de uma linguagem de programação é livre de contexto, significa que existe uma gramática livre de contexto para sua sintaxe e implica que há autômatos push-down para verificar a validade dos programas,

Observe que a simplicidade da sintaxe de uma linguagem de programação não implica uma restrição no poder computacional dos programas especificados nessas linguagens de programação.

Kaveh
fonte
1

A resposta é sim. Você vê, como a resposta aceita afirma, uma gramática é independente de seu significado. Nas próprias palavras de Chomsky:

Acho que somos forçados a concluir que uma gramática é autônoma e independente de significado ...

Chomsky, Estruturas sintáticas (1956)

Se uma gramática pode produzir sentenças suficientes para descrever todas as coisas que podem ser computadas, podemos atribuir arbitrariamente significado computacional às suas sentenças - uma para cada coisa que pode ser calculada.

Quanto a um exemplo concreto real, a linguagem popular whitespacepossui uma gramática regular e talvez até x86 assembly languages(precisa de verificação).

Eric
fonte
Não acho que essa passagem signifique que a gramática de Go seja uma linguagem regular no sentido formal; Eu acho que isso significa apenas que a gramática não é irregular , ou seja, consistente. Se a sintaxe de Go fosse realmente uma linguagem comum na hierarquia de Chomsky, seria incapaz de gerar, por exemplo, parênteses aninhados e equilibrados.
tsleyson
Sim, há recursão na gramática de Go. Atualizando postagem.
Eric