• Nenhum resultado encontrado

Durante o dia é possível que um estudante de comunicação social passe por várias situações que impliquem uma decisão. Às vezes, antes de escolher um determinado caminho, ele mentalmente realiza uma sequência de passos para resolver um problema específico. Às vezes, esse procedimento está tão entranhado na rotina que é feito de forma automática.

14

Vale lembra a definição de algoritmo: um conjunto ordenado e finito de regras bem definidas destinadas à resolução de um problema.

44 A sequência de passos que resolve um determinado problema pode ser considerada um algoritmo (um exemplo prático seria uma receita de um bolo, por exemplo). Na verdade, algoritmos têm dentro de si uma sequência lógica. Existe uma racionalidade para criar esses passos. Por isso, professores da área de Ciência da Computação costumam dizer que bom “raciocínio lógico” é necessário para desenvolver habilidades de programação (MESQUITA, 2002).

Por esse tipo de raciocínio? Pode-se explicar de forma relativamente simples. O tratamento da informação por excelência é feito por meio de cálculo. Aqui é importante notar que o conceito de operação no sentido de ser uma ação organizada e metódica com vistas à produção de um resultado determinado é produzida - em um meio digital - por meio de códigos. Isso naturalmente vai implicar alguma questão de ordem matemática.

Porém, só é possível entender esse raciocínio como válido quando se percebe que existe a possibilidade de estender a definição de cálculo. O conceito vai além do conjunto de conjunto de operações matemáticas, se forem consideradas outras “ações organizadas e metódicas” como: selecionar, classificar, permutar, combinar, comparar, substituir, transcodificar, etc (CARDOSO, 2009).

A complexidade do mundo atual trouxe um conjunto de novas tarefas a serem exercidas pelos algoritmos. Embora, em sua essência, eles tenham algumas operações que poderiam estar presentes em qualquer tipo de algoritmo. Para Nicholas Diakopoulos (2014), por exemplo, as principais funções dos algoritmos são: priorização, classificação, associação e filtragem.

Outra questão importante é que algoritmo se apresenta como uma sequência finita (afinal de contas, é preciso que o cálculo atinja um resultado) e ordenada (convenientemente disposta para se atingir o resultado desejado) de operações (regras ou instruções), com vistas à resolução de uma determinada classe de problemas (realizando um conjunto de tarefas) (CARDOSO, 2009).

Um programa de computador é, portanto, uma equação corretamente elaborada combinando algoritmo, ou algoritmos, com uma estrutura de dados simbólicos, dentro de um computador, visando a consecução de uma ou mais tarefas, que traduzem um problema (MATULOVIC, 2008).

Para tanto, foi preciso desenvolver uma linguagem artificial para suprir a deficiência da linguagem natural na formalização de sistemas lógico-matemáticos. Não pode haver ambiguidade.

45 Ou seja, essa linguagem precisa ser construída numa fundamentação gramatical rigorosa, a fim de evitar os problemas verificados na linguagem natural15. Mais ainda: ela deve ser mais estática e menos evolutiva que a linguagem natural. Com isso, ela tem condições de garantir aspectos de objetividade e clareza aos sistemas nos quais ela estiver inserida.

Chegar nessa linguagem foi o objetivo de diversos matemáticos. O primeiro idealizador de uma proposta para se construir uma linguagem artificial, com o intuito de oferecer um tratamento formal aos sistemas lógicos, foi o matemático e filósofo alemão Gottfried Wilhem Von Leibniz16, em 1666, em seu Dissertatio

de Arte Combinatoria.

Segundo Attie (2002), ao tecer sua characteristica universalis ou lingua

philosophica, Leibniz pretendia dar uma representação da estrutura do

pensamento humano puro, através da elaboração de uma linguagem e de um cálculo denominado calculus ratiocinator, que teria por finalidade deduzir conclusões das premissas advindas da characteristica universalis . Apesar da iniciativa, nenhuma das suas teorias foi desenvolvida.

Para Leibniz, a linguagem comum, sujeita a ambiguidades e imprecisões de toda ordem, não seria o veículo ideal para a condução das ideias e da comunicação. Seu objetivo passou a ser a construção de uma língua racional, com leis sintáticas lógicas, criada a partir do levantamento das ideias mais simples, chamadas por ele de “alfabeto dos pensamentos humanos”, de forma que as ideias mais complexas pudessem ser desenvolvidas a partir desse “alfabeto” (ATTIE, 2002, p.3).

Como nota Chauí (2006) a teoria de Leibniz, principalmente no que diz respeito a linguagem, tinha como base conceitual a álgebra. Para ele, nada era mais universal, formal e rigoroso. Portanto, ela seria a única ferramenta capaz de produzir uma linguagem livre dos problemas encontrados na linguagem natural.

A álgebra, é inegável, possui símbolos próprios. Eles são universais, valem para todos os matemáticos, são reconhecidos de forma universal. Do mesmo modo a lógica deveria ser uma “linguagem perfeita, totalmente purificada das ambiguidades e contrassensos da linguagem cotidiana” (MATULOVIC, 2008).

15

Um exemplo simples de ambiguidade seria digitar em um buscador a palavra sadia. É uma referência a marca sadia ou a pessoa busca informações sobre uma vida sadia?

16

A maioria das obras de Leibniz não foi publicada durante a vida do autor. Posteriormente, Gerhardt divulgou parte dos trabalhos de Leibniz na obra Die philosophischen Schriften von G.W. Leibniz. Hildesheim: Georg Olms Verlag. v. 7, 1978. (Reimpressão da edição de 1890)

46 Leibniz propôs uma linguagem simbólica artificial, isto é, construída especialmente para garantir ao pensamento plena clareza nas demonstrações e nas provas.

Um outro idealizador, ainda conforme Chauí (2006), foi Hobbes, que assim como Leibniz, verificou que havia uma relação intrínseca entre a lógica e a matemática. Para ele, raciocinar era sinônimo de calcular, ou seja, “[...] quando raciocinamos simplesmente somamos, subtraímos, multiplicamos ou dividimos ideias [...]” (CHAUÍ, 2000, p. 03). Sendo assim, caberia à lógica determinar quais seriam as regras necessárias para esse cálculo, além de sistematizar e organizar a maneira correta de se usar a linguagem a fim de evitar qualquer tipo de ambiguidade.

Em 1849, na obra Investigação Sobre as Leis do Pensamento, George Boole apresentou um cálculo lógico fundamentado por uma álgebra matemática (que posteriormente ficou conhecida como álgebra de Boole), que integra atualmente, segundo Feitosa e Paulovich (2006, p.14), “os dispositivos eletrônicos (chips) que compõem as máquinas de processar”.

Esse modelo de dados booleano possui uma natureza binária. Os resultados de operações booleanas são obtidos a partir da comparação entre valores, baseada em relações de ordem ou igualdade.

A riqueza da álgebra Booleana surge em operações primitivas como E, OU e NÃO. Com esses elementos, ela é capaz de caracterizar as mais diversas situações que podem ocorrer em diferentes áreas de estudo, com base em grades, imagens e mapas temáticos disponíveis em alguma base de dados (CORDEIRO, BARBOSA, CÂMARA, 2007).

O caminho desbravado por Boole levou a avanços. Em 1936, quase dez anos antes da construção do primeiro computador, o matemático inglês Alan Turing propôs um modelo simples do que seria uma máquina para tratamento de informação, segundo as seguintes premissas (LÉVY, 1987):

• todos os processos passíveis de decomposição em uma seqüência finita e ordenada de operações sobre um alfabeto restrito, que alcançam ao resultado buscado, em um tempo finito, podem ser realizados por uma “máquina de Turing”;

• todos os trabalhos que uma máquina de Turing é capaz de realizar, são algoritmos ou procedimentos efetivos;

47 • uma máquina de Turing pode se encontrar em um número finito de estados

distintos e predeterminados, correspondendo cada estado a uma maneira diferente da máquina reagir às mensagens de entrada;

• para cada problema calculável corresponde ao menos uma máquina Allan Turing (uma tabela de instruções) capaz de resolvê-lo;

• existe uma classe de máquinas, as máquinas universais, capazes de resolver todos os problemas calculáveis ou de realizar todos os procedimentos efetivos; o poder da máquina universal reside em sua tabela de instruções, que lhe permite imitar o comportamento de qualquer máquina particular.

Trabalhar com uma sequência pré-determinada de passos também indica que o adágio popular é, nesse caso, verdadeiro: “quando a cabeça não pensa, o corpo padece”. Esse tipo de racionalidade pode estar associada a uma forma de resolver determinados problemas matemáticos, que depois acabaram auxiliando o desenvolvimento da área computacional. Demanda que, é claro, surgiu após a invenção e consolidação dos computadores.

A lógica, portanto, é parte essencial dos algoritmos. Ou seja, não se trata de encontrar a solução para determinado problema, mas também encontrar a melhor solução. Muitas vezes o nome dessa solução chama-se linguagem de programação. CORMEN (2013) traz uma definição sobre a expressão:

Linguagem de Programação é uma linguagem artificial desenvolvida para expressar sequências de ações que podem ser executadas por uma máquina, em particular um computador. Linguagens de programação podem ser usadas para criar programas que controlam o comportamento de uma máquina e/ou para expressar algoritmos com precisão. Existem muitas linguagens de programação. Assembly, C, Pascal, Java, Visual Basic são alguns exemplos de linguagem de programação (CORMEN, 2012, p. 17).

Porém é preciso deixar claro que o termo Algoritmo é antigo. Os algoritmos têm uma longa história, e a utilização da palavra “algoritmo” pode ser vista desde o século IX. Foi nesta época que o cientista, astrônomo e matemático persa Abdullah Muhammad Bin Musa Al-Khwarizmi usou pela primeira vez o termo “algoritmo”. Além dessa criação, muitos o chamam de “o Pai da Álgebra” (CORMEN, 2013).

48 Al-Khwarizmi tinha a reputação de ser um matemático brilhante, uma de suas obras recebeu o nome de Algorithmi de Numero Indorum, acerca de algoritmos que usavam o sistema de numeração decimal desenvolvido pelos indianos. Por outro lado, alguns autores defendem que a nomenclatura originou-se na palavra Al-goreten, que significa raiz – conceito esse que inclusive pode ser aplicado aos cálculos (BAUER; WÖSSNER, 2012).

Foi somente no século XII que Adelardo de Bath introduziu o termo “algoritmo”, levando em conta a tradução de um dos livros de al-Khwarizmi, no qual o termo foi traduzido para o latim como “Algorithmi”. Tal palavra originalmente se referia apenas às regras da realização de aritmética utilizando algarismos indoarábicos. O uso da palavra permitiu sua evolução, incluindo assim, todos os procedimentos definidos para resolver problemas ou realizar tarefas (JUNIOR, NAKAMITI, ENGELBRECHT e BIANCHI, 2012).

Na história dos estudos matemáticos, o trabalho dos antigos geômetros gregos, do matemático persa Al-Khwarizmi, dos matemáticos chineses e ocidentais culminaram na noção, já demonstrada anteriormente, de Leibniz do calculus ratiocinator, uma álgebra da lógica. (MACCORMICK, 2011)

Muito são os trabalhos relacionados a algoritmos ao longo da história. Um dos mais conhecidos algoritmos é conhecido como “Algoritmo Euclidiano”. Euclides criou um algoritmo que serve para calcular o máximo divisor comum (mdc).17

É interessante notar que outros algoritmos foram criados: o algoritmo de Arquimedes, por exemplo, dá uma aproximação do número Pi. O feito matemático de Arquimedes foi descrito em sua famosa obra Sobre a Medição do Círculo. Arquimedes afirmou que o valor de Pi é igual a 3,1416...

Assim, na sua contribuição, Pi passou a ser entendido como sendo a razão entre o raio e a circunferência do círculo, e estabeleceria que essa razão é igual a 2 × 3,1416 (MATULOVIC, 2008).

Para fazer isso, ele imaginou a utilização de uma sucessão de polígonos inscritos e circunscritos com número de lados crescente. Assim, Arquimedes conseguiu gerar uma sequência convergente de intervalos para estimar essa constante. Esse raciocínio levou, anos depois, ao desenvolvimento dos primeiros estudos no campo da aritmética intervalar18. Posteriormente, na década de 1950, surge um ramo da Computação Científica -

17

Esse exemplo é explicado em detalhes em: http://clubes.obmep.org.br/blog/sala-de-estudos-algoritmo-de- euclides-para-determinacao-de-mdc/diagramas/. Último acesso em 06 de junho de 2017.

18 A Aritmética Intervalar (AI) ́e uma ferramenta numérica para manipulação e operação com intervalos.

Mais detalhes podem ser encontrados em: < http://www2.dbd.puc- rio.br/pergamum/tesesabertas/0912351_2011_cap_2.pdf >

49 através de alguns estudos isolados - com base nos apontamentos de Arquimedes, conforme detalha SUNAGA (1958).

Como já explicado no capítulo anterior, as evidências históricas indicam que a primeira formalização de algoritmos computacionais ocorreu em 1936 nos trabalhos de Alan Turing e Alonzo Church. Esse algoritmo é conhecido como “Máquina de Turing”, o qual formou a base da ciência da computação.

É preciso retomar a Máquina de Turing para explicar algumas questões pertinentes a esta tese. Ela é uma máquina de estado finito com a habilidade de ler suas entradas mais de uma vez e também de apagar ou substituir os valores de suas entradas. Possui uma memória auxiliar ilimitada, o que permite superar as deficiências das máquinas de estado finito.

Por exemplo, uma máquina de Turing pode ser entendida como máquina de estado finito, dividida em células, cada uma delas contendo no máximo um símbolo de um alfabeto disponível.

Em um dado momento, apenas algumas células contêm algum valor. A unidade de estado, que lê a cada momento o conteúdo das células que estão em uma fita, pode, no momento seguinte e de acordo com o valor lido no momento anterior, parar ou fazer uma dentre três opções:

• Imprimir um símbolo do alfabeto; • Passar ao estado seguinte;

• Mover para a célula da direita (D) ou esquerda (E).

Essa ação só foi possível pela existência de um algoritmo escrito para que a máquina pudesse realizar esses passos. Mas afinal, o que é um Algoritmo?

De forma bastante simples, um algoritmo pode ser definido como “um conjunto de instruções para resolver um problema” (CORMEN, 2012, p. 22).

Algoritmos estão na base da programação de computadores. Usando o jargão da informática uma definição possível seria: “conjunto das regras e procedimentos lógicos perfeitamente definidos que levam à solução de um problema em um número finito de etapas” (ALMEIDA , 2008, p.16).

Knuth (1973, p. 189), destaca que os algoritmos computacionais possuem uma lista de cinco propriedades que são aceitas como requisitos para um algoritmo:

• Finitude: “Um algoritmo deve terminar sempre depois de um número finito de etapas”.

50 • Definição: “Cada passo de um algoritmo deve ser definido com precisão. As ações a serem executadas deverão ser especificadas rigorosamente e sem ambiguidades para cada caso”.

• Entrada: “Valores que são dados ao algoritmo antes que ele inicie. Estas entradas são tomadas a partir de conjuntos de objetos especificados”.

• Saída: “...os valores resultantes das ações do algoritmo relacionadas com as entradas especificadas”.

• Eficácia: “...todas as operações a serem realizadas no algoritmo devem ser suficientemente básicas que podem, em princípio, ser feitas com precisão e em um período de tempo fi nito por um homem usando papel e lápis”.

Knuth (1973) admite que, embora sua descrição de um algoritmo possa ser intuitivamente clara, falta-lhe rigor formal, uma vez que não é exatamente claro o que significam as expressões “definidos com precisão”, “especificadas rigorosamente e sem ambiguidades”, “suficientemente básicas”, e assim por diante.

Note que um algoritmo não é especificamente a solução do problema, pois, se assim fosse, cada problema só teria um único algoritmo. Portanto, um algoritmo é um caminho ou os passos que se deve seguir para se chegar à solução de um problema.

Dessa forma, existem muitos caminhos que levam a uma solução satisfatória. Minsky (1967), cientista da área de inteligência artificial, afirma que um algoritmo é um procedimento eficaz. O termo também é usado por Knuth. Segundo Minsky trata-se de “um conjunto de regras que nos diz, de momento a momento, precisamente como se comportar”.

O importante é entender que um algoritmo é uma sequência lógica de passos, com começo, meio e fim. Cada passo desse algoritmo deve ser expresso de forma clara, utilizando, muitas vezes, um formalismo específico, justamente para que não deixe qualquer dúvida, ou seja, não haja ambiguidade na sua interpretação. Essa sequência de passos tem um objetivo específico, que geralmente é a resolução de um problema. Para tanto, esse algoritmo pode receber dados de entrada, muitas vezes chamados de variáveis, e como busca a resolução de um problema, essa resposta do algoritmo visando a solução do problema gera dados de saída.

Uma maneira possível de resumir a complexidade de um algoritmo é estabelecer a seguinte pergunta: se existe um problema que é necessário resolver, o que será feito desenvolver uma solução? Como expressá-la? À última pergunta responde-se muito facilmente: usando uma linguagem (SEQUEIRA, 2004).

51 Mas no que tange a solução do problema a questão se torna mais complexa. Afinal, se a solução desenvolvida corresponder a um conjunto de instruções bem definidas e sem qualquer ambiguidade, é possível afirmar que algoritmo foi criado para resolver esse determinado problema, desde que a partir de um conjunto de entradas produza determinadas saídas (ALMEIDA, 2008).

É importante perceber que a noção de algoritmo é uma abstração. Algoritmos, em sua essência, são métodos de resolver problemas. Mas à concretização de um algoritmo numa dada linguagem já não se chama algoritmo: chama-se programa. Sob esse ponto de vista, todas as versões escritas de um algoritmo são programas, mesmo que expressos numa linguagem natural, desde que não façam uso da sua característica ambiguidade (SEQUEIRA, 2004).

Portanto, pode-se chegar a uma distinção fundamental: algoritmo é um método de resolução de um dado problema expresso em linguagem natural. Já programa é a concretização de um algoritmo numa dada linguagem de programação.

Os passos, as etapas, as ações que devem ser realizadas ou executadas, devem seguir uma sequência lógica. Mas o que é lógica, afinal? De forma bem simples, lógica pode ser definida como “uma forma coerente de encadear ações, seguindo uma determinada convenção ou regra” (CORMEN, 2012).

Lógica é uma parte da filosofia que estuda os fundamentos, as estruturas e as expressões humanas do conhecimento. É atribuída a Aristóteles (séc. IV a.C.) a sua criação. Por isso, ele é considerado o pai da lógica. O objetivo de Aristóteles era estudar o pensamento humano e distinguir interferências e argumentos certos e errados.

No campo da informática a lógica está vinculada a “organização e planejamento das instruções em um algoritmo, a fim de viabilizar a implantação de um programa”.

Ou seja, no mundo computacional, as instruções seguem uma sequência na qual, em um primeiro momento, possuem um estado inicial, depois são comandados a obedecer uma determinada ordem. A realização dessa tarefa demanda um período de tempo finito. Após, se espera que surjam resultados esperados e bem definidos. Assim, tais instruções são escritas na forma de um algoritmo que utiliza “o conceito da Lógica Formal para fazer com que o computador produza uma série sequencial de entrada, processamento e saída” (REGIS, 2010).

A Lógica Formal, que também é conhecida como Lógica Simbólica, tem como objetivo a estruturação do raciocínio. É importante trabalhar, compreender a relação entre conceitos. Além disso, seu uso correto fornece um meio de compor provas de declarações. “Na Lógica Formal, os conceitos são rigorosamente definidos, e as orações são

52 transformadas em notações simbólicas precisas, compactas e não ambíguas” (MONDINI, 2008).

A lógica formal ou simbólica fornece, portanto, os princípios para formalização do processo de construção dos algoritmos. Mas como podemos utilizar todas essas definições para construir algoritmos apropriadamente?

Por exemplo, ao seguir as instruções de uma receita para fazer um determinado prato é utilizado um ordenamento lógico. É possível imaginar em uma sequência de passos para fazer um sanduíche simples, de presunto, queijo e alface? Qual seria a primeira providência? Provavelmente estabelecer qual tipo de pão será utilizado.

A partir de um conjunto de decisões surge uma ordem lógica. Isso é fundamental para que outras pessoas possam entender procedimento adotado e repetir a feitura do sanduíche. Existem muitas formas de expressar esse algoritmo ou receita de sanduíche.

Uma possível solução poderia ser a seguinte:

Pegue duas fatias de pão e coloque-as separadamente sobre o prato.

Coloque duas fatias de queijo sobre uma das fatias de pão.

Coloque uma fatia de presunto sobre as fatias de queijo.

Coloque uma folha de alface sobre a fatia de presunto.

Coloque a fatia de pão vazia sobre as alfaces.

O sanduíche está pronto19.

Esse tipo de algoritmo é conhecido como “algoritmo não computacional”. Ele não pode ser implementado em um computador. Ou seja, as entradas são fatia de pão, queijo, presunto, etc. A saída, o sanduíche pronto. Não seria possível que as entradas fossem inseridas no computador para que o algoritmo funcionasse e montasse o sanduíche.

É interessante ressaltar que essa é apenas uma das possíveis soluções para o problema. Existem outras formas de resolver e de informar as etapas. Mas cada uma das

19

Essa é uma versão reduzida. Sanduíches podem ser até mais complexos como é mostrado por Cormen em