Um determinado idioma regular contém um subconjunto infinito sem prefixos?


11

Um conjunto de palavras sobre um alfabeto finito é livre de prefixo se não houver duas palavras distintas em que um seja o prefixo do outro.

A questão é:

Qual é a complexidade de verificar se um idioma comum fornecido como NFA contém um subconjunto infinito sem prefixos?

Resposta (devido a Mikhail Rudoy, ​​aqui abaixo) : Isso pode ser feito em tempo polinomial, e acho que até em NL.

Parafraseando a resposta de Mikhail, seja (Σ,q0,F,δ) o NFA de entrada na forma normal (sem transições epsilon, trim) e seja L[p,r] (resp. ) o idioma obtido com o estado como estado inicial e como estado final (resp. estado como inicial e o conjunto como final). Para uma palavra deixar ser a palavra infinito obtido fazendo a iteração .L[p,R]p{r}pRuuωu

Os seguintes são equivalentes:

  1. O idioma contém um subconjunto infinito sem prefixos.L[q0,F]
  2. qQu G [ Q , Q ] { ε } v G [ Q , F ] v u ω , para que não seja um prefixo de .uL[q,q]{ε} vL[q,F]vuω
  3. qQ L[q,q]{ε} uL[q,q] vL[q,F] forma que não é um prefixo de .vuω

Prova:

3 2 trivial.

Para 2 1, basta ver que, para qualquer , temos que w ( u | v | ) v é um subconjunto infinito sem prefixo de L [ q 0 , F ] .wL[q0,q]w(u|v|)vL[q0,F]

Finalmente, 1 3 é a prova de "correção" na resposta de Mikhail.

Respostas:


7

Seu problema pode ser resolvido em tempo polinomial.

Para começar, converta o NFA fornecido em um NFA equivalente com as seguintes propriedades adicionais:

  • Não há transições epsilon
  • Todos os estados são alcançáveis ​​a partir do estado inicial

Sub-rotina útil

Suponha que tenhamos um NFA N , um estado q e uma sequência não vazia s . A seguinte sub-rotina nos permitirá avaliar o valor de verdade da seguinte declaração: "todo caminho em N do estado q para um estado de aceitação corresponde a uma string que é um prefixo da string sn para alguns n ". Além disso, essa sub-rotina será executada em tempo polinomial.

Primeiro, construa o NFA S com |s|+1 afirma que aceita todas as strings que não são prefixos de sn para nenhum n ( |s| estados de não aceitação em um loop para rastrear onde no "padrão" de sssss estamos até agora, e um estado de aceitação para se já tivermos desviado desse padrão). Em seguida, construa o NFA N que é exatamente como N mas tem q como seu estado inicial. Por fim, construa um NFA N finalNcuja linguagem L(N) é L(S)L(N) usando a construção de interseção NFA padrão. Observe que todas essas construções são polinomiais no tamanho da entrada.

Em seguida, basta testar se o idioma de N está vazio (o que pode ser feito em tempo polinomial com uma simples pesquisa gráfica). L(N)= se e somente se L(S)L(N)= , ou seja, todas as cordas em L(N) não estão em L(S) . Em outras palavras, o idioma de N está vazio se e somente se Naceita apenas cadeias que são prefixos de sn para alguns n . Isso pode ser reformulado exatamente como a declaração que estávamos tentando avaliar: "todo caminho em N do estado q para um estado de aceitação corresponde a uma string que é um prefixo da string sn para alguns n ".

Algoritmo principal

Considere o conjunto de estados no NFA que estão em algum loop. Para cada um desses estados, q , faça o seguinte:

Vamos P2 ser qualquer simples ciclo contendo q . Deixe s ser a cadeia correspondente ao circuito de P2 . Como o NFA não possui transições epsilon, s não está vazio. Em seguida, aplique a sub-rotina ao NFA, estado q e sequência s . Se a sub-rotina nos disser que todo caminho que começa em q no NFA e termina em um estado de aceitação corresponde a um prefixo de sn para alguns n , continue para o próximo estado q . Caso contrário, verifique se o idioma do NFA fornecido contém um subconjunto infinito sem prefixos.

Se tentarmos todos os estados q que estão em um loop e o algoritmo nunca sair, então mostramos que o idioma do NFA fornecido não contém um subconjunto infinito sem prefixos.

Correção (primeira metade)

Primeiro, suponha que o algoritmo acima afirme que a linguagem do NFA fornecida contém um subconjunto infinito sem prefixos. Digamos que essa saída foi selecionada considerando alguns loop P2 e algum estado q . Tal como anteriormente, s representa a cadeia correspondente ao P2 . Sabemos, de acordo com a sub-rotina, que nem todo caminho que começa em q no NFA e termina em um estado de aceitação corresponde a um prefixo de sn para alguns n (pois essa é a única saída da sub-rotina que levaria ao algoritmo principal saída nesse q ).

Vamos P3 ser um caminho cuja existência é afirmado pela sub-rotina: um caminho de q para um estado de aceitação de tal modo que a cadeia de caracteres correspondente t não é um prefixo de sn para qualquer n .

Seja P2 constituído por m cópias de P2 que m seja suficientemente grande que m|s|>|t|. Desde P2 representa um ciclo através q , P2 pode ser tratado como um caminho de q a q . A cadeia correspondente a P2 é sm

Seja P1 um caminho do estado inicial para q (que existe desde que todos os estados sejam alcançáveis ​​desde o início) e seja r a string correspondente a esse caminho.

Então o caminho que consiste em P1 , x cópias de P2 e P3 é um caminho de cálculo aceitante. A string correspondente a esse caminho é r(sm)xt . Assim, o NFA aceita todas as cadeias de caracteres da forma r(sm)xt . Este é um conjunto infinito de strings aceito pela NFA, e eu afirmo que esse conjunto de strings é livre de prefixos. Em particular, suponha que r(sm)xt seja um prefixo de r(sm)yt comy>x . Em outras palavras,t é um prefixo de(sm)yxt . Como(sm)yx tem comprimentom(yx)|s|m|s|>|t|, isso implica quet é um prefixo de(sm)yx=sm(yx) . Mas sabemos pela saída da sub-rotina quetnão é um prefixo desn para nenhumn. Assim,r(sm)xtnão pode ser um prefixo der(sm)yte, como desejado, o conjunto de cadeias de caracteres é livre de prefixo.

Assim, mostrei que, se o algoritmo principal mostrar que a linguagem do NFA contém um subconjunto infinito sem prefixos, esse é realmente o caso.

Correção (segunda metade)

A seguir, mostrarei a outra metade: se o idioma da NFA contiver um subconjunto infinito sem prefixos, o algoritmo principal apresentará esse fato.

Suponha que o idioma da NFA fornecido contenha um subconjunto infinito sem prefixos. Seja A o conjunto de caminhos de computação (aceitando) correspondentes a essas cadeias. Observe que A é um conjunto infinito de caminhos de computação aceitos cujas cadeias correspondentes nunca são prefixos uma da outra.

Digamos que um estado esteja "fazendo um loop" no NFA se existir um loop no NFA por esse estado e "não-fazendo um loop" caso contrário. Considere todos os caminhos do estado inicial para qualquer estado em loop que passe apenas por estados sem loop (exceto pelo estado de loop em que eles terminam). Seja P o conjunto desses caminhos. Cada caminho pP não pode ter um loop, pois os estados nesse loop seriam estados de loop e, portanto, p passaria por um estado de loop. Assim, os comprimentos dos caminhos em P são delimitados acima pelo número de estados no NFA e, portanto, P é finito (por exemplo, se o estado inicial for um estado em loop, o único caminho será o caminho vazio).

Podemos particionar A em |P|+1 subconjuntos com base em como os caminhos de computação em A iniciados. Em particular, para pP , deixar Ap ser o conjunto de todos os caminhos de computação em A que começam com o caminho p e deixar B ser o conjunto de todos os outros caminhos na A . Claramente, todos Ap s e B são disjuntos e sua união é todo o conjunto A . Além disso, Bcontém apenas caminhos que nunca passam por um estado de loop e, portanto, nunca fazem loop; assim B é finito. Podemos concluir, então, que alguns Ap deve ser infinito (caso contrário A seria uma união de um número finito de conjuntos finitos).

Como Ap é infinito, existem infinitos caminhos de computação, nenhum dos quais strings são prefixos um do outro, que aceitam caminhos começando com p . Seja q o estado atingido no final do caminho p . Podemos concluir que existem infinitos caminhos de aceitação, chame esse conjunto de A , começando em q todos os quais correspondem a cadeias que não são prefixos uma da outra.

Durante o algoritmo principal, executamos a sub-rotina no estado q e em algumas seqüências s . Essa sub-rotina nos diz se todo caminho aceitante que começa em q corresponde a uma string que é um prefixo de sn para algum n . Se esse fosse o caso, todos os infinitos caminhos aceitáveis ​​em A seriam prefixos de sn para vários n , o que implicaria que eles são todos prefixos um do outro. Como não é o caso, concluímos que, quando o algoritmo principal executa a sub-rotina no estado q, o resultado é o outro resultado possível. Isso, no entanto, leva o algoritmo principal a mostrar que a linguagem da NFA contém um subconjunto infinito sem prefixos.

Isso conclui a prova de correção.


Eu não entendo como a manipulação de loop funciona, pois um determinado estado pode fazer parte de (exponencialmente) muitos loops. Obviamente, se qualquer um desses dois loops puder ser usado para gerar uma sequência não periódica, estamos prontos. q
JAPH

O que você quer dizer com manipulação de loop? No algoritmo principal, para cada estado você escolher apenas um loop que passa por q (qualquer circuito fora do potencialmente exponencialmente muitos) e chamar isso de loop P 2 (afterwords você executa a sub-rotina no estado q e corda s , onde s é a cadeia associada com P 2 ). A sub-rotina lida essencialmente com a verificação de se é possível gerar uma sequência não periódica usando esse loop. Se sim, então terminamos. Se não (e, além disso, não para cada q ), todo o seu idioma é uma união de sequências periódicas, então também terminamos. qqP2qssP2q
Mikhail Rudoy

Para fazer a minha pergunta mais clara, aqui está uma simples NFA com estado inicial , estado final T e três transições: q um q , q b q , q um T . O loop para a não gera as seqüências livres de prefixo, mas o loop para b gera . qTqaqqbqqaTab
japh

Na verdade, o circuito para faz gerar um conjunto de prefixo livre: o conjunto de cadeias de um * b um todo o uso de um ciclo. Na minha algoritmo, se o loop que você escolher para q é a um circuito, em seguida, a rotina vai determinar que não, nem todos os caminhos aceitar a partir de q tem uma série de forma a * , e assim o algoritmo principal será dizer que um prefixo infinita existe um subconjunto livre. Se o loop que o algoritmo usa para q é, em vez disso, o loop b , a sub-rotina determina que nem todos os caminhos que aceitam iniciar em q possuem uma string no formato baabaaqaqaqbq , e também neste caso o algoritmo tem a mesma saída. b
Mikhail Rudoy

Obrigado Mikhail! Eu acho que sua resposta resolve a questão.
Googlo

2

Definições

Definição 1 : Seja S um conjunto de palavras. Dizemos que S é praticamente livre de prefixos infinitos (nome inventado para o propósito desta resposta) se houver as palavras u0,,un, e v1,,vn, tais que:

  • Para cada n1 , un e vn não estão vazios e começam com letras distintas;

  • S={u0v1,,u0unvn+1,} .

A intuição é que você pode colocar todas essas palavras em uma árvore com raízes infinitas (a é a raiz, as são as folhas e os restantes nós internos) da seguinte forma, de forma que as palavras em S sejam exatamente os rótulos dos caminhos da raiz para uma folha:

   u₀    u₁    u₂
■-----•-----•-----•⋅⋅⋅
      |     |     |
      | v₁  | v₂  | v₃
      |     |     |
      ▲     ▲     ▲

Proposição 1.1 : Um conjunto bastante livre de prefixos é infinito.

Prova de proposição 1.1 : Suponha que u0unvn+1 é um prefixo estrito de u0umvm+1 . Existem dois casos:

  • Se n<m então vn+1 é um prefixo de un+1umvm+1 . Isso é impossível porque un+1 e vn+1 têm primeiras letras distintas.

  • Se n>m então um+1unvn+1 é um prefixo de vm+1 . Esta é impossível, porque um+1 e vm+1 têm distintas primeiras letras.

Proposição 1.2 : Um conjunto livre de prefixos bem infinito é infinito.

Prova de proposição 1,2 : 1,1 Na prova, mostrou-se que se nm seguida, u0unvn+1 e u0umvm+1 não são comparáveis para o fim prefixo. Portanto, eles não são iguais.


Prova principal

Proposição 2 : Qualquer conjunto sem prefixos infinito contém um bom conjunto sem prefixos.

Proposição 3 : Um idioma contém um conjunto livre de prefixos infinito se e somente se ele contém um conjunto livre de prefixos bem infinito.

Prova abaixo.

Prova da proposição 3 : pela proposição 2. pelas proposições 1.1 e 1.2.

Proposição 4 : O conjunto de subconjuntos bem livres de prefixos de um idioma regular (codificado como uma palavra infinita u0¯v1^u1¯v2^u2¯ ) é ω regular (e o tamanho do Büchi autômato reconhecendo que é polinomial no tamanho da NFA reconhecendo a linguagem regular).

Prova abaixo.

Teorema 5 : Decidindo se um idioma regular descrito por um NFA contém um subconjunto infinito livre de prefixos pode ser feito em tempo polinomial no tamanho do NFA.

Prova do teorema 5 : Pela proposição 3, é suficiente testar se ele contém um subconjunto livre de prefixos bastante infinito, o que pode ser feito em tempo polinomial construindo o autômato Büchi fornecido pela proposição 4 e testando o não vazio de seu idioma (que pode ser feito em tempo linear no tamanho do autômato Büchi).


Prova da proposição 2

Lema 2.1 : Se S é um conjunto sem prefixo, o mesmo ocorre w1S (para qualquer palavra w ).

Prova 2.1 : Por definição.

Lema 2.2 : Seja S um conjunto infinito de palavras. Deixe w:=lcp(Sn) ser a mais longa prefixo comum a todas as palavras em S . S e w1S têm o mesmo cardeal.

Prova 2.2 : Defina f:w1SS por f(x)=wx . É bem definido por definição de w1S , injetivo por definição de f e surjetivo por definição de w .

Prova da proposição 2 : Construímos un e vn por indução em n , com a hipótese de indução Hn composta pelas seguintes partes:

  • (P1) Para todosk{1,,n} ,u0uk1vkS ;

  • (P2) Para todos osk{1,,n} ,uk evk não estão vazios e começam com letras distintas;

  • (P3) Sn:=(u0un)1S é infinito;

  • (P4) Não existe um prefixo não vazio comum a todas as palavras emSn . Em outras palavras: Não existea letra a tal queSnaΣ .

Observação 2.3 : Se tivermos sequências que verificam Hn sem (P4) , podemos modificar un para torná-las também satisfatórias (P4) . De fato, basta substituir un por unlcp(Sn) . (P1) não é afetado. (P2) é trivial. (P4) é por construção. (P3) é pelo lema 3.

Agora construímos as seqüências por indução em n :

  • Inicialização: H0 é verdadeiro usando u0:=lcp(S) (isto é, usando u0:=ε e aplicando a observação 3.1).

  • Etapa de indução: suponha que tenhamos as palavras u1,,un e v1,,vn modo que Hn para alguns n . Vamos construir un+1 e vn+1 modo que Hn+1 .

Como Sn é infinito e sem prefixo (pelo lema 1), ele não contém ε modo que Sn=aΣ(SnaΣ) . Como Sn é infinito, existe uma letra a tal que SnaΣ é infinito. Por (P4) , existe uma letra b distinta de a tal que SnbΣnão está vazio. Escolha vn+1SnbΣ . Tomando un+1 para ser a satisfaria (P1) , (P2) e (P3) , aplicamos a observação 3.1 para obter (P4) : un+1:=alcp(a1Sn).

(P1) u1unvn+1u1un(SnbΣ)S .

(P2) Por definição deun+1 evn+1 .

(P3) a1Sn é infinito por definição dea , eSn+1 é, portanto, infinito pelo lema 3.

(P4) Por definição deun+1 .


Prova de proposição 4

Prova da proposição 4 : Seja A=(Q,,Δ,q0,F) ser um NFA.

A idéia é a seguinte: lemos u0 , lembramos onde estamos, lemos v1 , voltamos para onde estávamos depois de ler u0 , lemos u1 , lembro onde estamos, ... Lembramos também a primeira letra que foi leia cada vn para garantir que un comece com outra letra.

Foi-me dito que isso poderia ser mais fácil com os autômatos com várias cabeças, mas eu não estou muito familiarizado com o formalismo, então vou descrevê-lo usando um autômato Büchi (com apenas uma cabeça).

Nós estabelecemos Σ:=Σ¯Σ^ , onde os símbolos sobrelinhadas vai ser usado para o descreve uk s e os símbolos com chapéus para o vk s.

Definimos Q:=Q×({}(Q×Σ)) , onde:

  • (q,) significa que você está lendo algumun ;

  • (q,(p,a)) significa que você terminou de ler algunsun no estadop , que agora está lendovn+1 que começa coma e que, assim que terminar, voltará parap para ler umun+1 que não começar coma .

Definimos q0:=(q0,) porque começamos lendo u0 .

Definimos F como F×Q×Σ .

O conjunto de transições é definido da seguinte forma:

  • " un " Para cada transição qaq , adicione (q,)a¯(q,) ;

  • " un a vn+1 " Para cada transição qaq , add (q,)a^(q,(q,a)) ;

  • " vn " Para cada transição qaq , adicionar (q,(p,a))a^(q,(p,a)) ;

  • " vn to un " Para cada transição pap onde p é final e a letra b distinta de a , adicione (q,(p,b))a¯(p,) ;

Lema 4.1 : u0¯v1^u1¯v2^un¯vn+1^ é aceito por A se se para cada n1 , un e vn não estiverem vazios e começarem com letras distintas , e para cada n0 , u0unvn+1L(A) .

Prova do lema 4.1 : deixada para o leitor.

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.