Importância da string vazia


7

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?


11
O que faz você pensar que há apenas uma definição "correta" para o conceito?
Raphael

11
@ Rafael: o que faz você pensar que eu acho isso?
Quora Feans

11
Eu estava lendo nas entrelinhas. Um comentário melhor pode ter sido: você já tentou definir linguagens formais dessa maneira e provar alguns teoremas básicos?
Raphael

11
O que você quer dizer com "cadeia de referência nula"? Esse é um conceito de linguagem de programação? O que você quer dizer com "conceito separado"? Separado do que? Que diferença você faz entre o caractere grego ε e o caractere EOL, exceto pelo fato de que eles têm usos diferentes na representação de textos? Finalmente, o que você quer dizer com "necessidade", como costumamos fazer sem conceitos ou notações específicas, e fazer as coisas? Precisamos de linguagens de programação de alto nível? Bem, eles facilitam a programação de várias maneiras, mas não são indispensáveis. Você também parece confundir sintaxe e semântica.
babou

Cadeia de referência nula: seria uma variável de cadeia que aponta para um nulo (que significa valor inexistente). Conceito separado: você não tem um termo para uma sequência de comprimento 44, mas se preocupa em dar um nome a uma sequência de comprimento 0. Seguindo a mesma linha de pensamento, deve ser importante; caso contrário, você não daria um termo nem uma letra grega, a menos que planejasse usá-la repetidamente. Em relação à EOL: se a EOL pudesse cobrir todas as funções que o ε possui, a última seria redundante.
Quora Feans

Respostas:


12

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 , 1u

1u=u=u1

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ελ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ελ


11
Vale a pena notar que é um monóide. Investigar propriedades algébricas de linguagens formais pode produzir resultados interessantes, por exemplo, análise de semicondutores. (Σ,)
Raphael

8

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.abb=aww

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}


Se uma palavra é um prefixo em si é uma questão de definição. Se você decidir não considerar a string vazia, precisará alterar algumas definições para permitir uma variante consistente da teoria das strings. - - O caractere EOL pode realmente representar a sequência vazia. As representações podem usar qualquer dispositivo adequadamente estruturado. Eu posso usar os caracteres z, e, r, o e n para representar cadeias sobre , por exemplo, com "onezeroone" para representar o que geralmente é observado "101" e "nenhum" para a cadeia vazia . Não que eu recomendo. {0,1}
babou

Você pode fazer o que quiser, mas algumas definições são "melhores" que outras. E há razões. Estou dando uma dessas razões.
Yuval Filmus

Não tenho certeza de qual ponto você está respondendo. Parece ser apenas o primeiro. Se você não está permitindo a sequência vazia, sua definição de prefixo provavelmente é inadequada. Ou você pode explicar por que deveria ser melhor? A verdadeira razão que você deve dar para justificar que a cadeia vazia é fundamental é que é mais difícil (mas provavelmente possível) desenvolver a teoria sem ela. Por exemplo, você deve fornecer uma definição mais complexa do que significa uma string ser um prefixo de outra. É um ponto mais sutil. Pense nos gregos fazendo aritmética sem zero.
babou

Você também pode justificar a definição usual de prefixo versus o seu, que geralmente é chamada de prefixo adequado. Mas o seu exemplo sobre zero dá tudo - a vida é muito mais fácil com isso.
Yuval Filmus

Se a cadeia vazia não for permitida , minha definição de prefixo adequado é a definição usual de prefixo (quando a cadeia vazia é permitida) e minha definição de prefixo é que u é um prefixo de v se u for um prefixo adequado de v ou igual v. O objetivo é permanecer semanticamente consistente com a teoria que permite a cadeia vazia . Sim, a vida é mais fácil com a corda vazia ... mas as coisas não são diferentes sem ela, da maneira que você parecia sugerir em sua observação sobre uma palavra não ser mais um prefixo em si. Eu acho que é um ponto importante.
babou

6

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:ε

Um alfabeto é um conjunto finito de símbolos. Uma string sobre o alfabeto  é uma sequência finita , em que cada . Nós escrevemospara o comprimento de , com ; a palavra exclusiva de comprimento zero é denotada  . Uma substring de é qualquer string , em que . A concatenação das stringsΣ sΣs1ssiΣ|s|s|s1s|=εs1ssisj1ijs1se é a string de comprimento .t1tms1st1tm+m

Compare isso com:

Seja um símbolo distinto de fim de linha . Um alfabeto é um conjunto finito  de símbolos, como . Uma string sobre o alfabeto  é uma sequência finita que para e . Nós escrevemospara o comprimento de , com . Uma substring de é qualquer stringΣΣ sΣs1ssiΣ{}i<s=|s|s|s1s|=1s1ssisj , em que . A concatenação das strings e é a string de comprimento .1ij<s1st1tms1s1t1tm+m2

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:εΣ

  • ε é uma string ;Σ
  • se é uma cadeia e , então é uma cadeia .sΣσΣsσΣ

Isso também se torna mais complicado com seqüências terminadas:

  • é uma string ;Σ
  • se for uma string e , então será uma string .sΣσΣ{}sσΣ

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.s1ss


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).


OMI, a primeira parte da sua resposta está equivocada. A definição convencional visa definir abstratamente o que é uma string, independentemente de como ela é representada. A segunda definição é uma maneira formal de definir uma notação possível, mas não é o que você deseja para raciocinar sobre seqüências de caracteres. Você está reforçando uma confusão entre sintaxe e semântica sugerida pela pergunta um tanto embaraçosa do OP. O restante da sua resposta sofre o mesmo problema.
babou

No seu último parágrafo, você repete a confusão entre sintaxe e semântica. String vazia é um conceito abstrato, e pode muito bem ser representada no computador por uma referência nula, enquanto strings não vazias são representadas pelo que for considerado conveniente. O único requisito é que as funções de manipulação de cadeias sejam escritas de acordo para que a semântica matemática das cadeias seja adequadamente respeitada. Observe que o papel também é apenas para representar seqüências de caracteres. Entidades matemáticas abstratas não são deste mundo.
babou

@babou Como afirmei ("qualquer coisa que você possa fazer com a palavra vazia , você pode fazer com EOL"), as duas opções são semanticamente equivalentes e discuto qual é esse papel semântico (por exemplo, a identidade do operador de concatenação ) Separadamente, discuto como a EOL é sintaticamente inconveniente. De que maneira essa sintaxe confusa com semântica? ε
David Richerby

A primeira definição é padrão para o conceito abstrato. Não precisa dizer nada sobre a maneira como as strings são realmente representadas. O OP está preocupado com a representação e, na segunda definição, você está imitando uma representação proposta como se fosse a definição abstrata do conceito, o que é obviamente mais complicado. O símbolo não deve estar em , mas apenas um dispositivo de notação usado para terminar representações de sequência (possivelmente um inconveniente muito pequeno), para que a notação seja uniforme para a sequência vazia. Você confundiu sintaxe e semântica. Σ
babou

Como eu disse, sua declaração sobre o inconveniente sintático da EOL não é justificada. Você criou os problemas usando uma definição inadequada (sua segunda definição para cadeias). Na minha resposta (reescrita), no final, dou a definição que você deveria estar usando, o que mostra que esses problemas não existem. O ⊣ deve fazer parte da notação, não um símbolo na sequência representada.
babou

5

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 1e obedece aos seguintes axiomas. Primeiramente,+ é um monóide comutativo com identidade 0:

(A+B)+C=A+(B+C)
0+A=A+0=A
A+B=B+A

Em segundo lugar, é um monóide com identidade 1:

(AB)C=A(BC)
1A=A1=A
A multiplicação esquerda e direita distribui sobre a adição:
A(B+C)=(AB)+(AC)
(A+B)C=(AC)+(BC)
A multiplicação por 0 aniquila:
0A=A0=0
e, finalmente, a adição é idempotente:
A+A=A

"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:

A=1+A+A2+A3+

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:

a(0)=0
(AB)(0)=A(0)B(0)
(A+B)(0)=A(0)+B(0)
A(0)=1

Dada uma expressão regular E, E(0) é também 0 ou 1. Isto é1 se a cadeia vazia for um membro de Ee 0 de outra forma.

Também podemos definir uma derivada, chamada derivada de Brzozowski:

aa=1
ba=0
(A+B)a=Aa+Ba
ABa=A(0)Ba+AaB
Aa=AaA

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 Ea é o conjunto de strings em E que começam com o símbolo amas com isso aremovido. assimaEa é o conjunto de strings em E que começam com a.

Pensando nisso por um momento, se az é o alfabeto, então:

E=E(0)+aEa+bEb++zEz

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.


4

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 osozinho, 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 é:

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, 1i e siΣ para todos os valores de i. Nota-ses1s Onde é um caractere especial que não indica um símbolo em Σ. Nós escrevemos|s|para o comprimento de s, definido por |s1s|=. Uma substring des1s é qualquer string sisj, Onde 1ij. A concatenação de stringss1s e t1tm é a string s1st1tm 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 quefaz 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.


Aliás, entrei em tantos detalhes quanto quis, porque queria contestar a afirmação de Yuval Filmus de que a sequência vazia é "igual a zero", porque não é. Você está certo que eu não toquei na pergunta final, no entanto. Em minha defesa, isso é CS, não stackoverflow.
Pseudônimo

@Pseud Acho que Yuval Filmus quis dizer isso de uma maneira mais fraca. De qualquer forma, o que é zero ou não (para falar vagamente) depende de que tipo de estruturas matemáticas você olha, e o mesmo se aplica à cadeia vazia. Sua resposta foi justa a esse respeito, imho. Seu argumento foi interessante, porém, mas possivelmente um pouco pesado para o OP. Aliás, tento não deixar perguntas com respostas errôneas ou contestáveis ​​sem anotar em algum lugar para leitores mais ingênuos ou corrigi-lo se a resposta for minha. Sei que minha resposta foi indevidamente longa, mas você encontrou declarações errôneas ou discutíveis no que leu sobre ela.
babou 14/02
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.