O primeiro truque aqui é pensar na tabela de multiplicação como a tabela de transição de um autômato com cada estado representando uma letra em sua tabela de multiplicação, mas ainda não se preocupando com a aceitação. Portanto, as letras à esquerda e no corpo da tabela são na verdade estados - seria mais preciso escrevê-las como , mas não vou. As letras na parte superior são entradas.q a , q b , q cUMAquma, qb, qc
Em seguida, construa o autômato (" " para transposição) para multiplicação reversa , transpondo : T AUMATTUMA
UMATumabcumaumaumacbcumabcbcuma
Portanto, leva você ao estado , e da mesma forma passa para o estado de , como você observa.c A T ( c b a ) a A TA(abc)cAT(cba)aAT
No entanto, assume que você está indo da direita para a esquerda e ainda queremos ir da esquerda para a direita. Portanto, o segundo truque é reverter o autômato (e não a multiplicação, que nos faria voltar quando começamos), revertendo todas as setas, o que leva a um autômato não determinístico fornecido pela tabela de transição abaixo, com subconjuntos indicados por letras concatenadas para manter o frango coçando, então é realmente . (espero que eu tenha conseguido tudo certo - parece funcionar).A T R a c { a , c }ATATRac{a,c}
ATRabcabbcacabc∅aab∅cabcabcabc∅bbcabcacababc∅ccabacabcbcabc∅
Você pode interpretar isso como um autômato não determinístico com apenas as três linhas acima da linha ou uma versão determinada com todas as 8 linhas.
Finalmente, a máquina para resolver o problema é o autômato produto cruzado do original e , que é para executar o comportamento intersecção dos dois autômatos (não precisamos qualquer Mais). possui estados que são pares como . A função de transição executa e independente. Um único estado inicial entra em na entrada , em na entrada , etc. Um T R A × A T R A T A × A T R ⟨ um , um c ⟩ Uma Um t R ⟨ 1 , 1 ⟩ ⟨ um , um ⟩ um ⟨ b , b ⟩ bAATRA×ATRATA×ATR⟨a,ac⟩AATR⟨1,1⟩⟨a,a⟩a⟨b,b⟩b
Os estados de aceitação na versão não determinística são etc. Na versão determinística, os estados de aceitação são pares nos quais o primeiro componente está segundo conjunto de componentes, como ou .∈ ⟨ um , um ⟩ ⟨ b , b c ⟩⟨a,a⟩∈⟨a,a⟩⟨b,bc⟩
25 = 3 ⋅ 8 + 1 10 = 3 ⋅ 3 + 1A×ATR aumentado e determinado como mostrado tem estados, então me perdoe se eu não o escrever em detalhes. Mas a versão não determinística possui apenas estados.25=3⋅8+110=3⋅3+1
L L R L(∗) Se é um idioma regular, então , o idioma que consiste no inverso de todas as palavras em , também é regular. Tome isso como um exercício.L LR L
Como isso nos ajuda a resolver o problema? Seja os idiomas que consistem em todas as cadeias que são avaliadas para ao avaliar da esquerda para a direita. O idioma em que você está interessado é Isso mostra que, se você souber como provar , poderá criar um NFA para o idioma em questão. a , b , c ( L a ∩ L R a ) ∪ ( L b ∩ L R b ) ∪ ( L c ∩ L R c ) . ( ∗ )La,Lb,Lc a,b,c
De fato, se você usar a idéia da prova de , provavelmente poderá prosseguir e construir o autômato. Então, vamos considerar isso. Em particular, vamos tentar construir um NFA para , o idioma de todas as strings que são avaliadas como quando avaliadas da direita para a esquerda.L R a a(∗) LRa a
A ideia é essa. Suponha que a primeira letra que você vê seja . Em seguida, o restante da string deve ser avaliado como (já que implica ). Raciocínio semelhante se aplica quando a primeira letra é . Quando a primeira letra é , no entanto, o restante pode ser avaliado como ou ou ser nulo. Com um NFA, podemos adivinhar (e depois verificar nosso palpite).b b x = a x = b c a a bb b bx=a x=b c a a b
Essa dica deve lhe dar o suficiente para pensar e, esperançosamente, resolver o problema.
fonte
Fofa.
Primeiro, crie um autômato que calcule o produto da esquerda para a direita. Fácil! Coloque uma transição sempre que . Existem três estados representando os três produtos possíveis. Comece em um quarto estado com para todos os . O estado final é se e somente se o produto da palavra de entrada da esquerda para a direita for . x⋅y=z{ → a , → b , → c } → 1 → 1x→−→yz→ x⋅y=z {a→,b→,c→} 1→ x → x x1→−→−xx→ x x→ x
Agora vamos construir um autômato que calcula o produto da direita para a esquerda. Este será não determinístico. Como fazemos isso? Simples ... Para ir na outra direção, basta inverter tudo : as setas e a direção do produto.
Adicione um nó desconectado por causa da palavra vazia. Todos os nós são iniciais.1←
Agora, precisamos calcular os dois caminhos juntos, para pegar o produto dos dois autômatos: iff e . Seja os quatro estados sejam iniciais e os quatro estados sejam finais. Uma palavra é reconhecida por esse autômato não determinístico se o produto da esquerda para a direita e o produto da direita para a esquerda forem iguais .(x1→,x2←)−→y(z1→,z2←) x1→−→yz1→ x2←−→yz2← (1→,x←) (x→,x←) x
fonte
Parece que o seu principal problema está utilizando o não-determinismo, então deixe-me detalhar isso.
Vamos considerar o seu pequeno exemplo e a ideia de construção de Gilles. O autômato "computando" o produto da direita para a esquerda adivinha o resultado no início e o verifica . Portanto, existem três possibilidades:abc
Como você pode ver, o NFA é capaz de adivinhar e verificar todos os cálculos possíveis de baixo para cima . Como o idioma aceito é definido como o conjunto de cadeias que é aceito por pelo menos uma execução , todas as execuções que não aceitam a entrada são ignoradas; o NFA "sempre adivinha certo".
Agora é fácil para este NFA lembrar sua primeira escolha até o final. Se aceitar, ele pode comparar o símbolo lembrado com o produto lr (deterministicamente) obtido em paralelo (como a interseção da linguagem se relaciona com a NFA certamente é abordada em Ullman / Hopcroft e em qualquer outro livro básico).
fonte