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:
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 é:
Uma cadeia u é um prefixo de uma cadeia v se houver uma cadeia w de tal forma que uw = v
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:
Uma string u é um prefixo adequado de uma string v, se for um prefixo de ve não for igual a v.
No entanto, quando a sequência vazia não é permitida , você deve declarar essas definições de forma consistente, mas diferente. Por exemplo:
Uma cadeia u é um prefixo adequado de uma cadeia v, se houver uma cadeia w, tal que uw = v
Observe que w deve ter pelo menos um símbolo. Então você pode definir:
Uma cadeia u é um prefixo de uma cadeia v se u for um prefixo adequado de v ou u = v.
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:
Um alfabeto é um conjunto finitoΣde símbolos. Uma
string s sobre o alfabeto Σ é uma sequência finita de ℓ símbolos si, Onde 0≤ℓ, 1≤i≤ℓ e
si∈Σ para todos os valores de i. Nota-ses1…sℓ⊣ Onde ⊣ é um caractere especial que não indica um símbolo em Σ. Nós escrevemos|s|para o comprimento de
s, definido por |s1…sℓ⊣|=ℓ. Uma substring des1…sℓ⊣ é qualquer string si…sj⊣, Onde 1≤i≤j≤ℓ. A concatenação de stringss1…sℓ⊣
e t1…tm⊣ é a string s1…sℓt1…tm⊣ de comprimento ℓ+m.
Observe que, como conseqüência, a cadeia exclusiva de comprimento zero é denotada ⊣.
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.