Programação  
 
Rede de conhecimento computador >> Programação >> Programação De Computador Idiomas >> Content
Como se pode demonstrar que um idioma é regular?
Existem várias maneiras de demonstrar que um idioma é regular. Aqui está um colapso dos métodos comuns, juntamente com explicações e exemplos:

1. Construindo um autômato finito (FA) ou autômato finito determinístico (DFA)

* Explicação: Se você pode construir um DFA ou NFA (autômato finito não determinístico) que aceita * tudo * e * apenas * as seqüências de caracteres no idioma, o idioma é regular.
* Como fazer:
* Defina os estados: Os estados da sua FA representam a "memória" do que foi visto até agora na sequência de entrada. Pense em quais informações são essenciais para lembrar para determinar se a string está no idioma.
* Defina as transições: As transições determinam como a FA se move de estado para estado com base nos símbolos de entrada. Verifique se suas transições refletem corretamente as regras do idioma.
* Defina o estado inicial: Onde o autômato começa a processamento.
* Defina os estados aceitadores: Os estados que indicam a sequência estão no idioma.
* Exemplo: Considere o idioma l ={strings sobre {a, b} que contêm "ab" como uma substring}.

`` `
Estados:Q0 (Start), Q1, Q2 (aceitação)

Transições:
- Q0, a -> Q1 (visto e 'a' até agora, potencialmente levando a "ab")
- Q0, B -> Q0 (visto A 'B', Redefinir)
- Q1, a -> Q1 (visto 'aa' até agora, ainda procurando "ab")
- Q1, B -> Q2 (Visto 'Ab'!)
- Q2, A -> Q2 (já visto 'Ab', então qualquer entrada mais importante nos mantém aceitando)
- Q2, B -> Q2 (já visto 'Ab', então qualquer entrada mais importante nos mantém aceitando)

Start State:Q0
Estado de aceitação:Q2
`` `

Você pode desenhar um diagrama de estado para visualizar esta FA.

2. Construindo uma expressão regular

* Explicação: Se você pode escrever uma expressão regular que descreva * tudo * e * apenas * as seqüências de caracteres no idioma, o idioma é regular.
* Como fazer:
* Entenda os operadores básicos de expressão regular:
* Concatenação:`ab` (corresponde à string" ab ")
* União (ou):`a | B` (corresponde a" a "ou" b ")
* Kleene Star (zero ou mais repetições):`a*` (corresponde "", "a", "aa", "aaa", ...)
* Kleene Plus (uma ou mais repetições):`a+` (corresponde a "a", "aa", "aaa", ...)
* Parênteses para o agrupamento:`(a | B) C` (corresponde" AC "ou" BC ")
* Classes de personagens:`[abc]` (corresponde 'a', 'b' ou 'c')
* Intervalos:`[a-z]` (corresponde a qualquer letra minúscula)
* Divida o idioma em partes menores e combine -as usando os operadores.
* Exemplo: Usando o mesmo idioma L ={strings sobre {a, b} que contêm "ab" como uma substring}.

A expressão regular é:`(a | b)*ab (a | b)*`

* `(a | b)*` significa zero ou mais ocorrências de 'a' ou 'b' (qualquer sequência de 'a's e' b's).
* `ab` é a substring necessária.
* `(a | b)*` novamente permite qualquer sequência de 'a's e' b's* depois* "ab".

3. Usando propriedades de fechamento de idiomas regulares

* Explicação: Os idiomas regulares são fechados sob determinadas operações. Isso significa que, se você aplicar essas operações a idiomas regulares, o resultado também será um idioma regular. As propriedades de fechamento comuns incluem:
* União
* Concatenação
* Kleene Star
* Interseção
* Complementação
* Diferença
* Reversão
* Homomorfismo (substituição)
* Como fazer:
1. Mostre que o idioma pode ser construído a partir de idiomas regulares mais simples e conhecidos usando operações de fechamento.
2. Por exemplo, se você pode mostrar que seu idioma é a união de dois idiomas regulares, você provou que é regular.
* Exemplo: Seja l1 ={strings sobre {a, b} começando com 'a'} e l2 ={strings sobre {a, b} terminando com 'b'}. L1 e L2 são regulares (você pode escrever facilmente expressões regulares para eles:`a (a | b)*` e `(a | b)*b`).

Agora, considere o idioma l =l1 ∩ l2 ={strings sobre {a, b} começando com 'a' * e * terminando com 'b'}.

Como os idiomas regulares são fechados sob interseção, L também é regular. Sua expressão regular é `a (a | b)*b`.

4. Teorema de Myhill-nerode

* Explicação: O teorema de Myhill-irode fornece uma condição necessária e suficiente para que um idioma seja regular. Ele afirma que um idioma l é regular se e somente se tiver um número finito de *sufixos distinguíveis *. Dois sufixos *x *e *y *são distinguíveis em relação a *l *se existir uma string *z *tal que exatamente um dos *xz *ou *yz *está em *l *. Em termos mais simples:um idioma L é regular se você puder dividir todos os prefixos possíveis em um número finito de classes de equivalência.
* Como fazer isso (mais avançado):
1. Defina uma relação de equivalência baseada em sufixos distinguíveis:`x ≡ y` se e somente se para todas as cordas` z`, `xz ∈ L` se e somente se` yz ∈ L`.
2. Mostre que o número de classes de equivalência sob essa relação é finito. Se for, o idioma é regular. O número de classes de equivalência é igual ao número de estados no DFA mínimo para o idioma.
* Exemplo: Seja L ={0 n 1 n | n ≥ 0}. Esta é uma linguagem * não regular * (usada para demonstrar o lema de bombeamento). Para entender intuitivamente o aplicativo Myhill-irode:

Considere os prefixos 0, 00, 000, .... se eu fosse regular, eventualmente dois prefixos, digamos 0 i e 0 j (onde eu eu para 0 i , você recebe 0 eu 1 i , que * está * em L. No entanto, se você anexar 1 i para 0 j , você recebe 0 j 1 i , que * não está * em l (porque j> i). Assim, 0 i e 0 j são distinguíveis. Como você pode criar um número infinito de prefixos distinguíveis, o idioma não é regular. O teorema de Myhill-irode é frequentemente usado para provar que um idioma * não é * regular.
5. O lema de bombeamento para idiomas regulares (para provar um idioma * não * regular)

* Explicação: O lema de bombeamento é uma ferramenta para provar que um idioma não é * regular. Ele afirma que se um idioma l é regular, existe um comprimento de bombeamento *p *(um número inteiro), de modo que qualquer string *s *em l com comprimento maior ou igual a *p *possa ser dividida em três substringas, *x *, *y *e *z *, onde *s *=*xyz *e as seguintes condições seguram:
1. Para cada i> =0, xy i Z está em L. (você pode "bombear" a parte y qualquer número de vezes e o resultado ainda está no idioma).
2. | Y |> 0. (A parte "bombeada" deve ter comprimento pelo menos 1).
3. | Xy | <=p. (A parte "bombeada" deve ocorrer dentro dos primeiros caracteres P).
* Como usá-lo para provar a não regularidade:
1. Suponha que L seja regular.
2. Suponha que o comprimento do bombeamento seja *p *. (Você não sabe o que é * P *, mas você assume que ele existe).
3. Escolha uma string * s * em l tal que | s |> =*p *. A chave aqui é escolher uma string * s * que levará a uma contradição mais tarde. Esta é geralmente a parte mais complicada.
4. considere todas as maneiras possíveis de dividir * s * em * xyz * tal que | y |> 0 e | xy | <=*p *.
5. Z* não é** em l. Isso contradiz o lema de bombeamento, que diz que * para todos * i, xy i Z deve estar em L.
6. Desde que você encontrou uma contradição, sua suposição inicial de que L é regular deve ser falsa. Portanto, L não é regular.
* Exemplo: Seja l ={a n B n | n> =0}. Prove que L não é regular.

1. Suponha que L seja regular.
2. Vamos * P * o comprimento do bombeamento.
3. escolha * s * =a p b p . Observe que | s | =2p> =p.
4. Considere as possíveis divisões de * s * em * xyz * com | y |> 0 e | xy | <=*p *. Desde | xy | <=* p * e * s * começa com um p , * xy * deve consistir apenas em 'A's. Portanto:
* x =a j para alguns j> =0
* y =a k para alguns k> 0 (porque | y |> 0)
* z =a p-j-k b p
5. escolha i =0. Então xy i z =xz =a j A p-j-k b p =a p-k b p . Desde k> 0, p - k p-k b p não está * em L.
6. contradição! O lema de bombeamento diz que, por tudo, xy eu Z deve estar em L. encontramos uma divisão e um valor de i para o qual não é.
7. portanto, l não é regular.

Considerações -chave e práticas recomendadas:

* Escolha o método certo: O melhor método depende do idioma.
* Para idiomas simples, a construção de um DFA/NFA ou expressão regular é frequentemente a mais fácil.
* Para idiomas construídos a partir de outros idiomas regulares usando operações padrão, use propriedades de fechamento.
*Para os idiomas suspeitos de serem *não regulares *, use o teorema do lema de bombeamento ou Myhill-irode.
* clareza e rigor: Ao provar que um idioma é regular, defina claramente sua expressão de autômato/regular e explique por que aceita * todas as seqüências * no idioma e * apenas * essas strings. Em outras palavras, prove as duas direções da implicação. Uma descrição vaga não é suficiente.
* Minimização: Se você construir um DFA, é útil (mas não é necessário) para minimizá -lo. Um DFA minimizado é único para um determinado idioma.
* Prática: Trabalhar em muitos exemplos é a melhor maneira de entender esses conceitos e desenvolver a intuição necessária para aplicá -los de maneira eficaz.

Em resumo, provar que um idioma é regular normalmente envolve demonstrar sua equivalência a uma definição formal de regularidade:construindo diretamente uma máquina (FA) ou padrão (expressão regular) que a reconhece, ou mostrando que ela é construída a partir de componentes regulares usando operações conhecidas que preservam a regularidade. O lema de bombeamento, por outro lado, é usado para refutar a regularidade.

Anterior :

Próximo :
  Os artigos relacionados
·Como incrementar DOS Variável Valor 
·Como Jogar QCP 
·Como utilizar as funções em QBasic 
·Como redefinir um AppPool IIS Com PowerShell 
·Como criar um CSS Sprite Barra de Navegação 
·Como faço para salvar um arquivo no Xcode 
·Como substituir caracteres usando XPath 
·Quais são os diferentes tipos de sistemas de codificaç…
·Como atualizar o Python 2.6 
·Diferenças entre o feedback Controle e Controle Feed F…
  Artigos em destaque
·Como criar um arquivo usando PHP 
·Como adicionar Folha nó para TreeView no Vb.Net Usando…
·Como analisar um arquivo CSV usando VB 
·Como fazer jogos de vídeo com nenhuma programação 
·Como transferir os resultados para um cliente em PHP 
·Como Randomize Itens ListView em Visual Basic 6 
·Java GUI Projeto Tutorial 
·Como excluir um elemento de uma Sublist no Esquema 
·Como alterar a senha SYSMAN 
·Definição de campo no Visual Basic 6.0 
Cop e direita © Rede de conhecimento computador https://ptcomputador.com Todos os Direitos Reservados