menu

quarta-feira, 29 de julho de 2015

Programas para a Máquina de Post sem o uso do simulador

Máquina  de Post


O que eu considero mais interessante (e importante) no estudo das máquinas abstratas é que para entendê-las basta lápis e papel. Não existe a necessidade, a não ser para facilitar os estudos, do uso do simulador, podemos criar nossos programas à moda antiga, como tudo realmente começou. No caso da Máquina de Post darei um exemplo a seguir.

Fluxograma Máquina de Post Duplo Balanceamento


Retirei esse programa do livro "Teoria da Computação - Máquinas Universais e Computabilidade (Volume 5 - 3ª edição, página 184). O programa verifica o duplo balanceamento de palavras formadas pelos símbolos a e b, ou seja verifica se uma palavra é do tipo aaabbb ou bbbaaa, mesma quantidade de um símbolo seguida pela mesma quantidade do outro símbolo. Clique para ampliar o fluxograma:

fluxograma maquina de post


Executando o programa

Caso 1: ACEITA

A seguir, a execução do programa (através da fila) para a entrada X = aaabbb

a
a
a
b
bb    


Primeiramente, o símbolo auxiliar é concatenado no fim da fila da palavra X:
X = aaabbb#

a
a
a
b
bb#   


O primeiro símbolo é lido, como era um símbolo esperado ele é apenas destruído sem ser concatenado no fim da fila, pois não será mais necessário, a fila fica assim:
X = aabbb#

a
a
b
b
b#




O segundo símbolo foi lido, como agora estamos esperando um b, enviamos o símbolo lido para o fim da fila, pois posteriormente ele será usado:
X = abbb#a

a
b
b
b
#a





Novamente:
X = bbb#aa

b
b
b
#
aa





Opa, finalmente encontramos um símbolo b respectivamente ao símbolo a que destruímos anteriormente, até agora está tudo ok, então o símbolo é apenas apagado:
X = bb#aa

b
b
#
a
a






Agora o programa vai ler um por um dos símbolos restantes e enviar ao fim da fila, até encontrar o símbolo auxiliar:
X = b#aab

b
#
a
a
b






Agora a primeira varredura da palavra foi completa, verifique como ficamos com dois símbolos à menos, isso porque, para verificar se a palavra está correta, o programa retira um símbolo a e um símbolo b. A partir de agora, para manter a estrutura do tipo fila, o programa realiza varreduras circulares na palavra até não restar mais nenhum símbolo ou até que a entrada seja rejeitada:

X = #aabb
#
a
a
b
b





X = aabb#
a
a
b
b
#





X = abb#
a
b
b
#







X = bb#a
b
b
#
a







X = b#a
b
#
a








X = #ab
#
a
b








X = ab#
a
b
#







X = b#
b
#








Após realizar as varreduras necessárias e não ter entrado em nenhum caso de REJEITA, restou apenas o símbolo auxiliar:

X = #
#









Mesmo assim o programa vai tentar realizar mais uma varredura, apagando o símbolo auxiliar e o concatenando no fim da palavra novamente:

X = #
#









É agora que o programa entra no caso do aceita, pois ao tentar realizar essa última varredura ele encontra apenas o # o destrói e a palavra é aceita, deixando a fila vazia e o programa termina sua execução:











Caso ainda não tenha entendido, basta pensar exatamente como uma fila funciona, quando alguém se retira de uma fila, ou volta para o fim, ou vai embora. No caso da máquina de Post, quando um símbolo é lido ou ele vai para o fim da fila ou é destruído.

_________________________________________________________________________________

Caso 2: REJEITA

A seguir, a execução do programa (através da fila) para a entrada X = aaabb, entrada que deve ser rejeitada pois apresenta um símbolo b a menos do que deveria:

a
a
a
b
b
    


Primeiramente, o símbolo auxiliar é concatenado no fim da fila da palavra X:
X = aaabb#

a
a
a
b
b#
   


O primeiro símbolo é lido, como era um símbolo esperado ele é apenas destruído sem ser concatenado no fim da fila, pois não será mais necessário, a fila fica assim:
X = aabb#

a
a
b
b
#





O segundo símbolo foi lido, como agora estamos esperando um b, enviamos o símbolo lido para o fim da fila, pois posteriormente ele será usado:
X = abb#a

a
b
b
#
a





Novamente:
X = bb#aa

b
b
#
a
a






Opa, finalmente encontramos um símbolo b respectivo ao símbolo a que destruímos anteriormente, até agora está tudo ok, então o símbolo é apenas apagado:
X = b#aa

b
#
a
a








Agora a primeira varredura da palavra foi completa, verifique como ficamos com dois símbolos à menos, isso porque, para verificar se a palavra está correta, o programa retira um símbolo a e um símbolo b. A partir de agora, para manter a estrutura do tipo fila, o programa realiza varreduras circulares na palavra até não restar mais nenhum símbolo ou até que a entrada seja rejeitada:

X = #aab
#
a
a
b








X = aab#
a
a
b
#







X = ab#
a
b
#








X = b#a
b
#
a








X = #a
#
a









X = a#
a
#








Como tínhamos um símbolo b a menos na palavra ele não vai encontrar o símbolo correspondente e vai entrar em um caso de REJEITA pois encontrou o símbolo auxiliar antes da hora:

X = #
#








ENTRADA REJEITADA!











_________________________________________________________________________________

Com isso, encerro as postagens sobre a Máquina de Post, se estiverem com dúvidas, comentem à vontade!
Não deixem de ler as demais postagens sobre a Máquina de Post: 


Um comentário :

  1. Gostei. Muito bom. Difícil encontrar material hein?! Estou pesquisando ainda, mas seria legal encontrar códigos de implementaçoes da máquina em linguagens de programação...

    ResponderExcluir

Comente!