Gramáticas e expressões

De uma forma geral, o processo de comunicação resume-se à transmissão de informação com base na troca de mensagens entre indivíduos. A transmissão de uma mensagem entre dois indivíduos inicia-se num deles, o emissor, que codifica a mensagem e a envia por intermédio de um canal. O outro indíviduo, o receptor, recebe a mensagem e descodifica-a com o propósito de a interiorizar. O suporte físico associado ao canal de comunicação dá azo à introdução de distorções na mensagem enviada. Diz-se que uma mensagem assim distorcida contém ruído.
O exemplo mais fulgurante de comunicação consiste na comunicação verbal falada. Neste caso, quem fala é o emissor, quem escuta é o receptor e o canal consiste nas vibrações sonoras que se propagam no ar. O emissor formula, portanto, uma mensagem com base num conjunto de palavras as quais são traduzidas em vibrações com o auxílio das cordas vocais. O receptor identifica as vibrações que são originadas naquele emissor em particular e tradu-las directamente dessas vibrações. Contudo, apesar do conjunto de palavras utilizadas ser limitado, é possível transmitir um conjunto de mensagens arbitrariamente complexas. Cada palavra encerra um significado atómico. As palavras poder-se-ão arranjar em sequência de modo a prover uma significação mais ampla. Nem todas as sequências que são possíveis de formar a partir do conjunto finito de palavras, designado por Léxico, codificam uma mensagem com significado. De facto, as palavras são agrupadas de acordo com um conjunto de regras específicas, recebendo a designação de Gramática, que variam de cultura para cultura. Cabe à Linguagem o estudo detalhado deste género de sistemas de comunicação. Pensando numa língua como sendo um conjunto específico de palavras sujeitas a uma determinada colecção de regras, a Linguagem centra-se portanto no estudo das línguas. Como os indivíduos humanos possuem uma enorme capacidade de adaptação, determinadas sequências de palavras, apesar de incorrectas, viabilizam a comunicação. Este pormenor está na base das alterações linguísticas que se verificaram ao longo da história tanto ao nível do léxico como da gramática. No entanto, o estudo formal de uma língua requer uma definição bem formada e concisa das regras que a compõem. É frequente designar por linguagem no sentido lato ao conjunto de todas as sequências válidas que é possível formar a partir do léxico e cuja validade é determinada pela respectiva gramática.
A comunicação de um ideia é conseguida por intermédio das frases, sendo estas constituídas por sequências válidas de palavras e as regras aplicam-se portanto ao nível destes elementos. Por exemplo, uma frase simples pode ser descrita como uma sequência de palavras iniciada por um “sujeito”, segundo de um “verbo” que, por sua vez, é seguido por um “complemento directo”. Numa língua constituída apenas por frases simples, estas poderiam ser escritas de forma geral como:

Frase -> Sujeito Verbo Complemento

Sendo definido o conjunto de palavras ou símbolos {“mesa”, “cadeira”, “chávena”, “prato”, “talher”}, o conjunto de verbos {“ser”, “estar”, “ter”, “fazer”} e de complementos {“mesa”, “cadeira”, “chávena”, “prato”, “talher”}, frases da língua simples supracitada são “mesa ter cadeira” ou “prato ser prato”. Por outro lado, a sequência “prato fazer chávena ter talher” não pode ser considerada como válida. Para gerar uma frase válida é suficiente substituir cada um dos símbolos ou palavras “Sujeito”, “Verbo” ou “Complemento” por cada uma das palavras que aí podem estar. Estas regras escrevem-se, portanto:

Frase -> Sujeito Verbo Complemento
Sujeito -> “mesa”, “cadeira”, “chávena”, “prato” ou “talher”
Verbo -> “ser”, “estar”, “ter” ou “fazer”
Complemento -> “mesa”, “cadeira”, “chávena”, “prato” ou “talher”

onde o conjunto de palavras é {“mesa”, “cadeira”, “chávena”, “prato”, “talher”, “ser”, “estar”, “ter”, “fazer”, “Frase”, “Sujeito”, “Verbo”}.

Mesmo uma frase mal-formada no sentido gramatical pode codificar uma mensagem bem-sucedida. Talvez seja esta a particularidade que impulsiona a evolução das linguagens ao longo da história. No entanto, uma sequência arbitrária de palavras pode estar longe de codificar uma mensagem perceptível. Por outro lado, existem linguagens cujas gramáticas estão de tal forma definidas que qualquer sequência da palavras ou símbolos que não as respeitem são completamente desprovidas de sentido. Neste rol encontram-se as linguagens de programação e as que estão associadas a expressões matemáticas como, por exemplo, as expressões aritméticass.
Uma expressão aritmética simples baseia-se no conjunto de símbolos {d, +, -, *, %, /, (, ), N, Expressão, Parcela, Termo, Factor, Expoente} e nas produções gramaticais

Expressão -> Parcela
Parcela -> Termo
Parcela -> -Termo
Parcela -> Parcela + Termo
Parcela -> Parcela – Termo
Termo -> Factor
Termo -> Termo * Factor
Termo -> Termo / Factor
Termo -> Termo % Factor
Factor -> Expoente
Factor -> Factor ^ Expoente
Expoente -> (Parecela)
Expoente -> N
N ->Nd
N ->d

Aqui “d” representa um dos algarismos, isto é, um dos símbolos do conjunto {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}. Começando com o símbolo inicial “Expressão”, aplicando a primeira regra fica a sequência “Parcela”. Aplicando sucessivamente a quarta regra vem “Parcela + Termo + Termo”. Note-se que a aplicação da regra permite a substituição de “Parcela” por “Parcela + Termo”. A terceira regra permite obter a sequência “-Termo + Termo + Termo”. A aplicação sucessiva da sexta, décima e décima terceira regras resulta na sequência “-N+N+N”. As duas últimas regras estabelecem que o símbolo não terminal “N” é substituível por uma sequência arbitrária de algarismos. Deste modo, a sequência “-1+2+34” é admissível dentro no sistema. As outras regras permitem construir expressões complexas como “2*(-3+5)*6-7^3/(3 % 2)”. Por outro lado, não é possível construir a sequência “–1”. De facto, a sequência seria válida se fosse possível substituir o símbolo “Termo” por “-1” devido à terceira regra o que não ser pode verificar.
Acrescentando um conjunto de atribuitos a cada uma das regras, é possível descrever uma série de operações que poderão ter lugar quando uma substituição é realizada. Por exemplo, quando é realizada a substituição “Parcela -> Parcela + Termo”, é realizada a soma do valor que advém da parcela com o que advém do termo. As produções com atributos escrevem-se como:

Expressão -> Parcela <Retorna valor da Parcela>
Parcela -> Termo <Retorna valor do Termo>
Parcela -> -Termo <Retorna o simétrico do valor do Termo>
Parcela -> Parcela + Termo <Retorna o valor da soma da Parcela com o Termo>
Parcela -> Parcela – Termo <Retorna o valor da diferença da Parcela com o Termo>
Termo -> Factor <Retorna o valor do Factor>
Termo -> Termo * Factor <Retorna o produto do valor do Termo com o valor do Factor>
Termo -> Termo / Factor <Retorna o quociente do valor do Termo pelo valor do Factor>
Termo -> Termo % Factor <Retorna o resto da divisão do Termo pelo valor do Factor>
Factor -> Expoente <Retorna o valor do Expoente>
Factor -> Factor ^ Expoente <Retorna o valor do Factor elevado ao Expoente>
Expoente -> (Parecela) <Retorna o valor da parcela>
Expoente -> N <Retorna o valor de N convertido num número inteiro>
N ->Nd
N ->d

Um interpretador capaz de verificar se uma determinada sequência faz parte de uma linguagem poderá ser alterado para realizar determinadas operações sempre que uma produção seja utilizada. Outro exemplo de expressão é construída sobre o conjunto de símbolos {d, “{“, “}”, “,”, (, ), N, união, intersecção, Expressão, Parcela, Termo, Conjunto, Sequência} sujeito às regras

Expressão -> Parcela <Retorna o valor da Parcela>
Parecela -> Termo <Retorna valor do Termo>
Parcela -> Parcela união Termo <Retorna o valor da união da Parcela com o Termo>
Termo -> Termo intersecção Conjunto <Retorna o valor da intersecção do valor do Termo com o Conjunto>
Termo -> (Parcela) <Retorna o valor da parcela>
Termo -> Conjunto <Retorna o valor lido para o conjunto>
Conjunto -> {Sequência}
Sequência -> vazio
Sequência -> Sequência, N
Sequência -> N
N ->Nd
N ->d

Uma observação detalhada permite identificar uma série de características comuns entre ambos os conjuntos de regras. Identificando os operadores unários, tais como a obtenção do simétrico, que actuam em apenas um argumento e os operadores binários, tais como a soma ou o produto, que actuam sobre dois argumentos e a respectiva precedência (o produto precede a soma e a intersecção precede a união), as regras de produção gramaticais escrevem-se do mesmo modo, abstraindo das regras que permitem identificar os objectos matemáticos que as constituem.

Como uma grande variedade de expressões matemáticas se descrevem com base no formalismo supracitado, tenho desenvolvido algum código capaz de lidar com vários cenários cujo algoritmo exporei numa próxima oportunidade. Criei um projecto open source designado por Matutils no qual uma das funcionalidades prende-se precisamente com a leitura de vários tipos de expressões matemáticas. Apesar de ser um projecto funcional, ainda há muito a fazer em termos de documentação.

Sobre Sérgio O. Marques

Licenciado em Física/Matemática Aplicada (Astronomia) pela Faculdade de Ciências da Universidade do Porto e Mestre em Matemática Aplicada pela mesma instituição, desenvolvo trabalho no PTC (Porto Technical Centre) - Yazaki como Administrador de bases-de-dados. Dentro o meu leque de interesses encontram-se todos os temas afins às disciplinas de Matemática, Física e Astronomia. Porém, como entusiasta, interesso-me por temas relacionados com electrónica, poesia, música e fotografia.
Esta entrada foi publicada em Matemática, Sem categoria com as etiquetas , , , , . ligação permanente.

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s