No sentido de uma string distinta de uma string de referência nula, qual é a importância de uma string vazia no CS (e especialmente nas linguagens formais)?
Por que você precisa de um conceito separado, o de 'string vazia', que até tem sua própria letra grega (ε)?
Um personagem EOL não poderia substituí-lo?
formal-languages
terminology
Quora Feans
fonte
fonte
Respostas:
Existe um significado matemático para a cadeia vazia. De fato, o produto da concatenação das palavras é uma operação associativa. Mas essa operação também tem um elemento neutro , a palavra vazia. Por esse motivo, a palavra vazia também é frequentemente indicada por , o que permite escrever, para cada palavra ,1 1 você
Obviamente, se o alfabeto for , não é uma boa ideia denotar a palavra vazia por e provavelmente essa é a razão pela qual a notação (ou algumas vezes ) foi introduzida. Mas, como Yuval Filmus apontou, a palavra vazia é uma palavra com o comprimento , ou seja, não contém letra.{ 0 , 1 } 1 1 ε λ 0 0
É certamente preocupante denotar a palavra vazia por (ou por uma letra grega ou ), mas você deve tomá-la como uma notação convencional, da mesma maneira que denota o conjunto vazio por .1 1 ε λ ∅
fonte
A cadeia vazia é igual a zero. Representa "nada", mas é um conceito fundamental. Como um exemplo muito simples, uma palavra é um prefixo de uma palavra se para alguma palavra . Se você não permitir a sequência vazia, uma palavra não seria um prefixo.a b b=aw w
O caractere EOL é um caractere em um conjunto de caracteres específico. Se estivermos interessados em cadeias de caracteres acima de , não temos EOL. Além disso, EOL é um caractere, portanto, uma sequência que consiste em EOL não está vazia.{0,1}
fonte
Usar um caractere de fim de linha (EOL) é equivalente em termos de poder expressivo - qualquer coisa que você possa fazer com a palavra vazia , você pode redefinir para fazer com EOL - mas usá-lo seria uma dor monumental na bunda . As definições convencionais são:ε
Compare isso com:
Observe a capacidade extra e o potencial de erros de um por um, especialmente na definição de concatenação. Além disso, considere definir autômatos sobre essas seqüências terminadas. Além de verificar se sua entrada possui as propriedades que a linguagem exige, qualquer autômato deve agora verificar se o último caractere da entrada é , o que (acho) adicionará dois estados a cada autômato.⊣
A cadeia vazia tem a mesma função que zero nos números naturais. É a identidade da operação mais básica (concatenação para seqüências de caracteres, adição para naturais). Isso é importante se você deseja construir qualquer tipo de estrutura algébrica, como grupos ou monóides , que dê acesso a uma grande área de resultados matemáticos potencialmente úteis. De maneira mais direta, é um excelente exemplo de base para induções, pois a hipótese geralmente é trivial para a cadeia vazia. De fato, quando você faz indução em cadeias, está implicitamente usando a seguinte definição indutiva de cadeias:ε Σ
Isso também se torna mais complicado com seqüências terminadas:
Obviamente, você poderia fazer o contrário e dizer que se é uma string, então . Nesse ponto, há pouco a escolher entre seqüências terminadas e não terminadas, mas sua indução pode ser mais adequada para adicionar caracteres no final do que no início.s σs
Seqüências de caracteres terminadas são adequadas para programação, mas não são adequadas para matemática. Ao programar, você precisa saber como a sequência termina; quando você está fazendo matemática, é óbvio que é o último caractere da maneira como a string é escrita.s1…sℓ sℓ
Acabei de perceber que você pergunta sobre a diferença entre uma referência nula e a string vazia. Uma referência nula não é nenhuma string; a cadeia vazia é uma cadeia, mas não possui caracteres. Se você preferir, é a diferença entre ter um pedaço de papel em branco (sequência vazia) e não ter nenhum papel (referência nula).
fonte
Resposta curta: o conjunto vazio (ou seja, o conjunto de cadeias que não contém cadeias) é igual a zero, mas a cadeia vazia (ou seja, o conjunto de cadeias que contém uma cadeia de comprimento zero) é igual a um.
Uma maneira de axiomatizar linguagens formais é como um semicondutor idempotente. Um semiring é uma estrutura com duas operações binárias+ e ⋅ e dois elementos distintos 0 e 1 e obedece aos seguintes axiomas. Primeiramente,+ é um monóide comutativo com identidade 0 :
Em segundo lugar,⋅ é um monóide com identidade 1 :
"Adição" pode ser interpretada como união de conjuntos e "multiplicação" pode ser interpretada como concatenação de cadeias.
Ah, e o link é muito profundo. O operador de fechamento Kleene, que é intuitivamente definido como:
comporta-se como exponenciação. Pense na série de poder deex , além do fato de que a adição é idempotente.
Caracteres de terminal se comportam como variáveis. Em particular, podemos definir avaliação em zero:
Dada uma expressão regularE , E(0) é também 0 ou 1 . Isto é1 se a cadeia vazia for um membro de E e 0 de outra forma.
Também podemos definir uma derivada, chamada derivada de Brzozowski:
A única regra ímpar aqui é a da multiplicação. É quase como a regra do produto familiar; a diferença se deve ao fato de a concatenação não ser comutativa.
O que a derivada significa intuitivamente é que∂E∂a é o conjunto de strings em E que começam com o símbolo a mas com isso a removido. assima∂E∂a é o conjunto de strings em E que começam com a .
Pensando nisso por um momento, sea…z é o alfabeto, então:
Este é o teorema de Taylor, apenas para idiomas regulares. Além disso, também é uma regra para criar DFAs diretamente a partir de expressões regulares!E(0) é 1 se e somente se o estado inicial for um estado final e os outros termos são as transições.
Uma coisa notável sobre isso é que os operadores familiares de expressão regular (mais alguns menos familiares, como interseção de conjunto e diferença de conjunto) são completamente determinados por suas derivadas, além de sua avaliação em zero. Isso é o que esperaríamos do teorema fundamental do cálculo, mas é interessante vê-lo aqui também.
Aliás, essa teoria também se adapta a linguagens recursivas e sem contexto, mas você precisa de um pouco mais de maquinaria para o que não vou abordar aqui.
fonte
Uma questão fundamental sobre matemática
Essa resposta foi reorganizada depois que o OP forneceu mais precisões quanto ao significado e intenção de sua pergunta. Também comento outras respostas aqui, pois é complicado fazê-lo no formato de comentário usual. Comentá-los também fornece informações adicionais sobre os problemas relevantes.
Em poucas palavras
Sua intuição está certa de que a string vazia desempenha um papel especial no estudo de strings e linguagens formais, e essa é a razão pela qual costuma receber um nome ou notação especial. As cordas sobre um determinado conjunto de símbolos formam uma estrutura algébrica chamada monóide, com a operação de concatenação que possui um elemento neutro: a corda vazia. Veja a resposta de J.-E. Pin .
Você também está certo de que pode haver muitas outras notações ou representações para isso. A escolha da representação é ditada por conveniência, perspicácia e simplificação do discurso, raciocínio e computação.
Uma dessas conveniências, como você legitimamente se pergunta, é ter uma notação uniforme para todas as cadeias, incluindo a vazia. Isso pode ser alcançado de várias maneiras, seja no papel ou no computador. Terminar cadeias com um símbolo especial que supostamente não pertence ao conjunto de símbolos incluído nas cadeias é uma maneira de fazê-lo. Eu acho que é isso que você sugere com a EOL. Isso foi feito há 45 anos por Denis Ritchie para a linguagem de programação C, exceto que ele usou o byte 0, também anotou NUL ou ^ @, em vez de EOL.
No texto, isso pode ser feito com aspas ou com um estilo final⊣ . Observe, porém, que enquanto o⊣ sozinho, denotará a cadeia vazia; ela terminará todas as cadeias, o que não é o caso do uso da letra ε. Eles não desempenham exatamente o mesmo papel sintático.
Em princípio, um símbolo de terminação como EOL, ^ @ ou⊣ também não pode ser um símbolo pertencente a uma sequência, a menos que você adicione mecanismos de representação mais complexos.
No computador, a cadeia de referência nula pode ser usada para representar a cadeia vazia. Caso contrário, é apenas um conceito de programação que não tem nada a ver com o conceito abstrato de string.
No entanto, sua pergunta foi um pouco confusa e não muito bem estabelecida. A fala de um " conceito separado " sugere questões semânticas, em vez de re-representação sintática. E você estava misturando representações textuais impressas, que usam ε, mas não EOL, com representação por computador que faz o oposto.
Com muito mais detalhes
Esta é uma pergunta estranha. A seu modo, também levanta uma ou duas questões fundamentais sobre a matemática.
A compreensão de tais questões não é óbvia, como testemunha as inadequações de algumas respostas dadas por usuários obviamente competentes e as inadequações da própria pergunta. Foi isso que me atraiu a essa pergunta.
Esses dois problemas estão preocupados com:
entendimento adequado dos respectivos papéis e usos da sintaxe e da semântica em matemática e programação;
entendimento adequado do efeito de "remover um conceito de uma teoria existente" .
A segunda questão, que tem a ver com semântica, provavelmente foi abordada por lógicos e possivelmente por historiadores da ciência. Mas não me lembro de tê-lo abordado formalmente (ou possivelmente não o reconheci).
Uma confusão entre sintaxe e semântica provavelmente surgiu do fato de o OP falar de um " conceito separado ", onde ele deveria falar de uma " notação separada ". Esse erro é provavelmente justo no caso dele, pois ele está tentando entender os problemas. Mas confundiu ainda mais alguns usuários que responderam, claramente Yuval Filmus e eu, ao usarmos a palavra "conceito" como deveria ser.
Sobre a Semântica
Percebo agora que o próximo parágrafo não é sobre a pergunta que você pretendia; mas é a pergunta que você escreveu e que deve ser entendida como semântica e foi por várias pessoas, enquanto você quis dizer sintaxe (a ser abordada na parte da sintaxe abaixo).
Vamos começar com a sua pergunta " Por que você precisa de um conceito separado, o de 'string vazia'? ", Que entendi como: "podemos usar strings, na teoria e na programação, sem considerar a string vazia?" , como aparentemente Yuval Filmus.
O fato é que geralmente não precisamos da string vazia , mas geralmente é mais conveniente tê-la. A maior parte da teoria provavelmente poderia ser desenvolvida sem nunca considerar cadeias vazias. Afinal, muita aritmética foi desenvolvida pelos gregos sem considerar zero como um número. O zero foi introduzido sintática e semanticamente apenas alguns séculos depois na Índia. Estender o sistema numérico não é apenas introduzir novos conceitos, mas também uma maneira de simplificar o entendimento e o uso de conceitos antigos. A introdução de zero e dos números negativos facilitou a compreensão das propriedades dos números positivos naturais, e assim por diante. Algumas propriedades das funções nos reais (como convergência de séries) são muito mais fáceis de analisar e entender quando você considera a extensão para números complexos.
Portanto, a introdução de novos conceitos e extensões na matemática geralmente é uma boa maneira de tornar as teorias mais simples (e geralmente mais poderosas para expressar problemas).
Introduzir a string vazia junto com as "strings naturais" simplificará as teorias construídas sobre as strings, e isso é bom o suficiente. Normalmente, como afirmado em outras respostas, ter a cadeia vazia nos permite considerar as cadeias como representantes (modelos) de estruturas algébricas conhecidas (monóides) e aplicar diretamente todos os resultados conhecidos sobre essas estruturas. De fato, como observado por J.-E. Pin, a string vazia está diretamente relacionada à operação de concatenação em strings (e eu acrescentaria, da mesma maneira que zero está relacionado à adição de números inteiros).
Nós não precisamos ou não da string vazia, mas é muito mais conveniente fazer matemática com ela do que sem ela. E isso também se aplica à programação (que é uma forma de matemática que visa produzir provas construtivas).
Uma questão de consistência
No entanto, eu discordo da resposta de Yuval Filmus sobre o efeito de não permitir o conceito de uma corda vazia, da mesma forma que os gregos não considerariam um número zero. Introduzir zero como um novo número não seria aceitável se tivesse alterado os resultados conhecidos da aritmética. Na melhor das hipóteses, teria sido considerada uma teoria diferente, com seu próprio objetivo.
Da mesma forma, uma teoria de strings deve fornecer resultados consistentes, independentemente de permitir ou não a string vazia. Mas ambas as abordagens devem usar definições consistentes para que isso seja aparente e significativo, e Yuval Filmus não fez isso.
Quando a cadeia vazia é permitida , a definição usual de prefixo é:
onde o ponto indica a concatenação da string. Isso permite que uma string seja um prefixo de si mesma, usando w = ε (a string vazia). Então você pode definir:
No entanto, quando a sequência vazia não é permitida , você deve declarar essas definições de forma consistente, mas diferente. Por exemplo:
Observe que w deve ter pelo menos um símbolo. Então você pode definir:
Com essas definições consistentes, uma palavra permanece um prefixo em si mesma, mesmo quando a sequência vazia não é permitida na teoria.
Portanto, o argumento a ser levantado não é que não permitir que a string vazia altere as propriedades das strings (pelo menos não de maneira tão trivial), como afirmado por Yuval Filmus. A questão é muito mais que torna o estudo das cordas mais complicado, da mesma maneira que a aritmética é mais complicada quando você não pode falar de zero.
Sobre a sintaxe
A segunda questão é sintática. Como as strings devem ser representadas, no papel ou no computador. Em particular, assumindo que concordamos que é útil ter o conceito de uma string vazia, como ela deve ser representada sintaticamente, para que possamos conversar ou escrever sobre ela.
A questão realmente se coloca para todos os conceitos matemáticos: como eles devem ser representados para que possamos conversar ou escrever sobre eles e fazê-lo da maneira mais conveniente possível. Grande parte da evolução da matemática também está relacionada ao aprimoramento da sintaxe, da representação de conceitos. Um exemplo trivial é o constrangimento de fazer aritmética com a antiga representação romana de números inteiros.
A primeira resposta sobre a string vazia é que você pode querer que isso seja consistente com a representação de outras strings. Normalmente, a representação de uma sequência incluirá a sequência de símbolos nas sequências, além de algumas notações adicionais, como aspas: " gattaca ", por exemplo. Torna-se bastante natural representar a sequência vazia como "".
Se você prefere representar o exemplo acima como gattaca⊣ , a representação natural da sequência vazia é ⊣ (como observado implicitamente por David Richerby).
Portanto, a pergunta sobre a necessidade de introduzir uma notação separada (em vez de um conceito separado , como realmente está escrito) tem uma resposta negativa. Não, não é necessário. Notação uniforme, representação uniforme, é possível para todas as cadeias, incluindo a cadeia vazia.
No entanto, se você simplesmente representar a sequência pela sequência de símbolos incluídos, como gattaca , sem outros caracteres, a sequência vazia se tornará invisível sintaticamente, o que é bastante inconveniente. Então é necessário introduzir alguma notação específica, como a letra grega ε ou outro nome.
Da mesma forma, ao estudar seqüências abstratas, é um pouco estranho usar "" para representar a sequência vazia, apenas porque não cria frases claras e agradáveis no discurso oral, quando os cientistas conversam entre si, o que deve acontecer Em ocasião. Por isso, é melhor dar um nome a ele. Dizer cadeia vazia pode funcionar, mas é estranho por escrito. Daí o hábito de usar um único símbolo de letra, como costuma ser feito em matemática, para denotar entidades de relevância específica,
A sugestão de representar a palavra vazia por EOL é essencialmente a mesma que representá-la por⊣ . É simplesmente uma representação de strings com um caractere final especial. EOL é apenas um caractere especial "de alguma forma disponível em computadores".
Como observado acima para aritmética de número inteiro romano, a escolha de uma representação deve ser ditada por conveniência, especialmente em um ambiente algorítmico. Há muitas maneiras de representar seqüências de caracteres em geral, e a seqüência vazia em particular, no computador. Do ponto de vista teórico, não importa muito o que você escolher. Do ponto de vista prático, é essencial escolher uma que torne as operações e a manipulação de strings mais eficientes. Esse é um problema básico em qualquer classe de algoritmos e estruturas de dados.
Sobre a confusão de sintaxe e semântica
A resposta de David Richerby é interessante por sua confusão de sintaxe e semântica.
Ele tenta introduzir o uso sintático da EOL sugerido na pergunta, que ele substitui pelo símbolo⊣ , mas ele estranhamente o mistura com a definição do domínio semântico de strings, tornando o que é suposto ser apenas uma notação parte desse domínio semântico.
Sua segunda definição deveria ter sido a seguinte:
Essa definição é apenas uma variante notacional da definição convencional dada por David Richerby. Não introduz qualquer complexidade ou " habilidade extra " e nada muda para automatizar a teoria, pela simples razão de que⊣ faz parte da notação, não é um símbolo nas strings. E fornece uma notação uniforme para todas as strings, incluindo a vazia.
Yuval Filmus comete um erro semelhante em sua segunda observação , já que a EOL é um dispositivo de notação sintática para representar strings, não como um símbolo em strings, enquanto{0,1} refere-se à lista de símbolos que podem constituir cadeias, semanticamente.
Para resumir as respostas
J.-E. A resposta de Pin é bastante correta, mas aborda apenas uma parte da pergunta, em relação à importância da string vazia. Não trata da possibilidade de uma notação uniforme.
As respostas de Yuval Filmus e David Richerby confundem sintaxe e semântica, rejeitando, assim, erroneamente a sugestão da pergunta OPś de usar a EOL. Também o argumento de Yuval Filmus para afirmar a importância semântica da string vazia é muito discutível. Embora deos faça algum sentido, a observação de David Richerby sobre o uso da referência nula também é um tanto injustificada: ela poderia muito bem ser usada para representar a cadeia vazia, desde que o código seja escrito adequadamente.
A resposta do pseudônimo é um exagero teórico sobre a importância da cadeia vazia na linguagem formal, mas na verdade não discute as questões levantadas pela pergunta.
Quanto à minha própria resposta , só espero que ela resolva adequadamente os problemas e não contenha erros, mas é longe demais.
fonte