UNIVERSIDADE SALVADOR - UNIFACS DEPARTAMENTO DE CIÊNCIAS EXATAS E DE COMUNICAÇÃO CURSO DE CIÊNCIA DA COMPUTAÇÃO BRUNO VIDAL MONTES CAIO CÉSAR DE CARVALHO SAMPAIO JOSÉ RICARDO FREITAS SANTOS JÚNIOR RUBENVAL SANTOS SAMPAIO PROLOG – Conceitos e Avaliação Salvador 2007 2 BRUNO VIDAL MONTES CAIO CÉSAR DE CARVALHO SAMPAIO JOSÉ RICARDO FREITAS SANTOS JÚNIOR RUBENVAL SANTOS SAMPAIO PROLOG – Conceitos e Avaliação Trabalho apresentado ao Curso de Ciência da Computação da Universidade Salvador – UNIFACS, como exigência da disciplina Tópicos Especiais em Informática I, ministrada pela professora Christiane Santana. Salvador 2007 3 1. HISTÓRIA O nome “Prolog” foi criado em Marseille, França, no ano de 1972, por Philippe Roussel, como abreviatura para “Programmation en Logique”. A linguagem teve origem a partir de um projeto do pesquisador Alain Colmerauer, no ano de 1970, cujo objetivo era desenvolver uma ferramenta de tradução automática, o qual deu origem a um sistema chamado Q-systems, predecessor do Prolog. Em julho de 1970, Robert Pasero e Philippe Roussel haviam sido convidados por Alain para participar de seu projeto e ficaram responsáveis por desenvolver a dedução lógica juntamente com Jean Trudel. Utilizando o Algol-W e o Q-systems eles conseguiram realizar a seguinte conversa com a máquina: Usuário Gatos matam ratos. Tom é um gato que não gosta de ratos que comem queijo. Jerry é um rato que come queijo. Max não é um rato. O que Tom faz? Computador Tom não gosta de ratos que comem queijo. Tom mata ratos. Usuário Quem é o gato? Computador Tom. Usuário O que Jerry come? Computador Queijo. 4 Usuário Quem não gosta de ratos que comem queijo? Computador Tom. Usuário O que Tom come? Computador O que gatos que não gostam de ratos que comem queijo comem. A princípio parecia ter-se conseguido alcançar o objetivo, mas o problema era que esta lógica era baseada em um sistema de cláusulas e regras muito extenso. Finalmente em 1972, com auxílio financeiro do governo da França e com o conceito de Robert Kawalski da interpretação procedimental das cláusulas de Horn, foi possível criar uma linguagem (Prolog) eficaz e definitiva que permitiu a seguinte comunicação com a máquina: Usuário Todo psiquiatra é uma pessoa. Toda pessoa que ele analisa está doente. Jacques é um psiquiatra em Marseille. Jacques é uma pessoa? Onde está Jacques? Jacques está doente? Computador Sim. Em Marseille. Não sei. 5 Por fim, no ano de 1973, a Escola de Inteligência Artificial da Universidade de Edinbugrh, EUA, convidou Philippe para uma visita a tal instituição, a qual gerou o aprimoramento do Prolog de forma que este poderia ser utilizado para diversos fins, entre os quais, a inteligência artificial. 2. PARADIGMA DE PROGRAMAÇÃO O paradigma de programação declarativo, o qual o Prolog pertence, difere dos outros paradigmas pelo fato de que baseia-se em axiomas matemáticos para a interpretação de suas funções. Um programa neste paradigma descreve como algo deve ser, não como este deve ser exibido, ou seja, ao contrário de uma linguagem imperativa, onde é necessário um algoritmo especificando como fazer algo, numa linguagem declarativa especifica-se apenas os resultados a serem alcançados, deixando o algoritmo sob responsabilidade do software de suporte que o executa (equivalente ao compilador da imperativa). Apesar de não ter tido tanta repercussão e utilidade no mundo científico se comparado com o paradigma imperativo, há campos da ciência onde somente uma linguagem declarativa pode ser utilizada de forma adequada, como na inteligência artificial, por exemplo. O paradigma declarativo se baseia em uma programação lógica, funcional ou restritiva. A programação funcional utiliza-se de funções matemáticas para implementar seus axiomas e determinar o cálculo a ser realizado. A linguagem mais conhecida deste gênero é o Lisp. A programação restritiva refere-se ao uso de restrições na construção de relações entre variáveis e geralmente utiliza-se de outros paradigmas de programação como complemento de sua estrutura. Suas implementações mais conhecidas são o Oz (para linguagem funcional) e o Kaleidoscope (para linguagem imperativa). A programação lógica, por sua vez, usa fatos e regras de forma simbólica que expressam uma lógica onde se torna possível fazer perguntas e obter respostas. Tais respostas são obtidas de forma relacional (perguntas x fatos declarados) através da utilização da Álgebra de Boole e de axiomas matemáticos. O Prolog é um exemplo de linguagem lógica. 6 3. CARACTERÍSTICAS Assim como a maioria das linguagens existentes, há vários ambientes onde se pode trabalhar com Prolog, proporcionando a formulação de perguntas e a execução das respostas. Um programa em Prolog pode rodar em modo interativo, a partir de consultas a uma base de dados fornecida pelo usuário, a qual descreve a solução a ser obtida por meio de fatos e regras. Dessa forma, é possível elaborar, de forma simples, uma lógica a ser seguida pelo programa e permitir que o computador responda questões como as que foram realizadas pelos idealizadores do Pascal, e que foram demonstradas anteriormente. As perguntas formuladas pelo usuário seguem um padrão e podem retornar diferentes valores de acordo com o modo como a pergunta foi feita. Tais respostas podem ser valores lógicos (verdadeiro ou falso) ou valores fornecidos pelo usuário no banco de dados (como o nome de uma pessoa, por exemplo). Para exemplificar o uso do banco de dados e também ter como base um software para teste e demonstração, escolhemos, dentre os existentes, o SWIProlog (www.swi-prolog.org) por ser gratuito e simples de usar, apesar de ser em inglês. No caso do SWI-Prolog, o banco de dados é um arquivo de extensão PL contendo informações em texto, as quais são fornecidas pelo usuário através de um editor de texto qualquer, mas seguindo os padrões do Prolog (um fato/regra por linha, sempre terminando com ponto). Após a criação deste arquivo PL o SWI-Prolog pode abri-lo para consulta através do menu “File / Consult...”, possibilitando o uso dos dados para obtenção das respostas desejadas. Uma característica interessante do Prolog é que ele sempre retorna um valor negativo caso não encontre argumentos declarados para determinada questão em seu banco de dados. Por exemplo, ao declarar que tom é um gato e jerry um rato, a resposta para a pergunta “mickey é um gato?” seria Não (“No”, no caso do SWI-Prolog), uma vez que mickey não foi declarado como gato. Todavia, caso uma regra não esteja definida neste banco de dados e uma pergunta do tipo “O que mickey é?” fosse feita, a mesma retornaria um erro, pois não há definição para mickey. Nestes dois casos a resposta negativa ou o erro acontecem porque não é necessário, no Prolog, que todas as possibilidades sejam descritas, mas somente aquelas que façam parte da lógica do programa. Contudo, uma declaração errada 7 no banco de dados (fora dos padrões aceitos pelo Prolog) resultaria numa falha ao consultar o arquivo, impossibilitando a formulação de perguntas e, consequentemente, a obtenção das respostas. 4. TIPOS DE DADOS Em Prolog existe apenas um tipo de dado, conhecido como Termo, e que é responsável pela interpretação lógica. Este termo pode representar uma palavra, um texto, um número, uma estrutura complexa, enfim, o que determina o valor do termo é o seu conteúdo, declarado pelo usuário através dos fatos e regras. Por exemplo, dizer que “jerry é um rato”, logicamente falando, significa que jerry é um nome e é do tipo rato, ou seja, tecnicamente falando, jerry é um nome de um rato. 5. DECLARAÇÃO, ESCOPO E VARIÁVEIS O programador que usa Prolog pode escolher livremente os nomes das constantes, variáveis, funções e predicados de seu programa, apenas tendo cuidado com o uso repetido de nomes, pois isso indica que dois termos são iguais, como dizer que Jerry é um rato e um gato, por exemplo. Vale salientar que isto não gera conflitos na execução, mas provavelmente vai interferir na lógica do programa. Por isso, nomes diferentes devem ser dados a objetos que possuem escopos distintos. O escopo de uma variável é aferida a partir do(s) fato(s)/regra(s) a qual pertence, ou seja, implementado no arquivo armazenador dos dados para consulta, já os demais nomes (constantes, funções ou predicados) fazem parte do programa propriamente dito. Portanto, uma variável pode assumir valores diferentes durante todo o programa, já que ela não armazena nenhum valor, apenas é usada para exibir um resultado. Em contrapartida, outros nomes permanecem com o mesmo sentido no programa (se jerry é um rato, será sempre um rato). A declaração de nomes no Prolog pode ser feita tanto no arquivo banco de dados como na execução do programa. Para as variáveis o padrão adotado é que esta sempre começa com uma letra maiúscula, podendo ser apenas uma letra, uma palavra ou uma expressão sem espaços (por exemplo, X, Numero e Numero_fatorial, respectivamente). Demais nomes devem começar com letras minúsculas, como o caso de tom e jerry, que não são variáveis, mas átomos 8 (constantes), e podem ser declarados como uma palavra, uma expressão com underline ou expressão com aspas simples (por exemplo, tom, gato_tom e ’jerry, o rato’, respectivamente). O uso de aspas simples indica também a existência de uma string. Números em Prolog podem ser reais ou inteiros (usa-se um “.” para números reais, ex.: 5.2), negativos (ex.: -12) ou positivos, podendo ainda ter a letra “e” para representar uma notação científica. Estruturas de dados complexas são chamadas de Termos Compostos, e constituem-se em listas formadas por um átomo na cabeça e um conjunto de parâmetros entre parênteses, que podem ser de qualquer tipo. Listas são definidas por uma construção recursiva de parâmetros (cabeça e cauda) e são declarados na forma ‘.’(H, T), onde H é a cabeça e T a cauda. Um [ ] representa uma lista vazia. Desta forma uma lista [A, B, C] poderia ser escrita da forma ‘.’(A, ’.’(B, ’.’(C, [ ]))), ou ainda [A | L2 ], onde L2 é a lista [B, C]. 6. FATOS A lógica do Prolog é baseada nos fatos declarados pelo usuário, os quais são constituídos de uma cabeça e um determinado número de parâmetros (ex.: gato(tom).). Esses fatos indicam uma verdade lógica, a qual formará as respostas a partir da combinação de parâmetros da pergunta. O fato gato(tom) exprime a idéia de que tom é um gato, e se esta pergunta for feita (tom é um gato?) a resposta será afirmativa. Um fato pode conter mais de um elemento, expressando a relação entre dois termos. Exemplificando, a declaração rato(jerry,warner). indica que há uma relação entre jerry e warner, relação esta que depende da lógica usada pelo programador (neste caso, tom é o gato da warner). Desta forma, seria possível declarar também rato(mickey,disney). indicando que mickey é o rato da disney. Contudo, para que seja possível fazer uma pergunta é necessário que se saiba pelo menos um dos parâmetros, a fim de que se possa fazer a comparação (ex.: quem é o rato da disney? mickey). A pergunta também segue um padrão, que é a precessão de um ‘?- “ à expressão a ser testada. Portanto, para perguntar se jerry é o rato da warner, o usuário tem que entrar com o código ?- rato(jerry,warner). (como este fato foi declarado, a resposta seria um sim, ou yes). O SWI-Prolog inicia cada linha com um 9 “?-“, pois por padrão as consultas são feitas ao arquivo PL e o programa limita-se a responder as perguntas. Uma outra forma de obter respostas é usando variáveis, ou seja, perguntando se X é o rato da disney, quem é X? Essa questão é escrita na forma ?- rato(X,disney). (perceba que X está em maiúsculo, ou seja, é uma variável), e a resposta seria dada como um X = mickey. É possível também estabelecer uma relação múltipla entre os termos, como dizer que rato(mickey,disney,desenho).. A partir desta afirmação (mickey é o rato da disney e é um desenho) é possível fazer uma comparação com rato(jerry,warner,desenho). dizendo que, além de serem ratos, mickey e jerry são desenhos animados. Contudo, geralmente adota-se apenas a relação bivalente, e, caso seja necessário mais de uma relação entre dois objetos (mickey e jerry), cria-se outro(s) fato(s): desenho(jerry). e desenho(mickey)., com a pergunta ?desenho(X)., a qual teria as respostas X = jerry e X = mickey. Há ainda outras formas de fazer essa pergunta, as quais serão mostradas adiante. 7. CONJUNÇÃO, DISJUNÇÃO E NEGAÇÃO Toda linguagem que se baseie na lógica para a realização de cálculos de qualquer espécie necessita de operadores lógicos (AND, OR e NOT). O uso do AND é muito freqüente em Prolog para se fazer perguntas múltiplas, pois, a resposta só será verdadeira se todas as afirmações também forem. Por exemplo, a pergunta “qual o nome do rato da warner que é um desenho?” pode ser feita a partir da lógica de que se as respostas das perguntas ?- rato(X,warner). e ?- desenho(X). forem iguais, então aquela resposta (indicada por X) é a reposta para a pergunta anterior. Em Prolog um AND é representado por uma vírgula (,) entre as sentenças a serem testadas. Assim, para o exemplo acima, a pergunta mais adequada seria ?rato(X,warner),desenho(X)., onde X retornará o valor que torna os dois fatos verdadeiros ao mesmo tempo (neste caso, jerry). Caso não exista um valor em comum, a resposta retornada é um No. A mesma lógica segue para o OR, porém com a diferença de que basta uma das sentenças serem verdadeiras para que a resposta da pergunta “mickey é o rato da disney ou um desenho?” (este “ou” é lógico) seja um Yes. O uso do “ou” é feito a partir de um ponto-e-vírgula (;) entre as sentenças. Assim, a pergunta ?rato(mickey,disney);desenho(mickey). retorna um Yes, bem como a perguna ?- 10 rato(jerry,disney);desenho(jerry)., uma vez que a primeira sentença é falsa e a segunda verdadeira (F ou V = V). A negação é aplicada somente ao resultado de uma sentença, ou seja, negar desenho(jerry). e repetir a pergunta acima teria como reposta um No (F ou Não (V) = F). A negação é representada por um not (P), onde P é a sentença a ser negada. Logo, a resposta para a pergunta ?- not (rato(tom)). seria Yes, enquanto para ?- not (desenho(jerry)). seria No. 8. REGRAS Uma regra é, basicamente, uma estrutura de controle condicional (se) para uma sentença, sendo que, caso satisfeita a condição, admite-se a sentença de conseqüência como sendo verdadeira. Por exemplo, a expressão “se tom é um gato, então jerry é um rato” implica que jerry só será um rato (conseqüência) se tom for um gato (condição). Em Prolog, o “se” é representado por um “:-“ entre as sentenças conseqüência/condição, nesta ordem (jerry é um rato se tom for um gato). As regras são implementadas juntamente com os fatos (no banco de dados para consulta), seguindo o mesmo padrão de terminação com ponto e limitação a apenas uma linha. Logo, ao dizer que gato(tom). está se declarando que tom é um gato, e ao dizer que rato(jerry):-gato(tom). está se informando que jerry é um rato, pois tom é um gato. Consequentemente, dizer que rato(mickey):-gato(donald). resultará que mickey não será um rato, pois não existe um gato chamado donald. Geralmente as regras são usadas para responder questões mais elaboradas, como “tom e jerry são amigos?”. Para tal é necessário criar uma lógica simples, informando se tom é amigo de jerry e se jerry é amigo de tom; caso isso aconteça então eles são amigos. Neste caso um fato novo teria de ser criado com a relação de amizade: amigo(tom,jerry). e amigo(jerry,tom).. A regra para este caso seria sao_amigos(X,Y):-amigo(X,Y),amigo(Y,X)., ou seja, X e Y são amigos se X for amigo de Y e vice-versa. Feito isso, pode-se então perguntar pelo programa se ?são_amigos(tom,jerry)., o que resultará na resposta Yes. Supondo que amigo(tom,mickey)., a pergunta ?- são_amigos(tom,mickey). teria No como resultado, pois tom seria amigo de mickey, mas mickey não seria amigo de tom. Isso ocorre porque o operador lógico entre as sentenças é um AND, o que requer que ambas as sentenças sejam verdadeiras. Se a mesma pergunta fosse feita com um 11 OR (;), a resposta seria Yes. Se a mesma pergunta fosse feita com o OR e os parâmetros dela fossem mickey e jerry, a resposta seria No, pois nenhuma das sentenças seria verdadeira. 9. OPERADORES Além dos operadores lógicos (“not”, “;” e “,”), o Prolog dispõe, como a maioria das linguagem, de operadores relacionais e aritméticos, que permitem o cálculo de operações matemáticas. Os operadores relacionais são usados para realizar testes quantitativos entre dois números e são dispostos entre os mesmos e representam igualdade (X = Y), diferença (X /= Y), maior que (X > Y), menor que (X < Y), maior ou igual (X >= Y) e menor ou igual (X =< Y), onde X e Y são números ou variáveis que contenham valores numéricos. A representação dos operadores pode variar de acordo com a implementação do software de suporte, como o sinal de “diferente” e de “menor ou igual”, que podem ser encontrados nos formatos <> e >=, respectivamente (no caso do SWI-Prolog, o formato é o mesmo do apresentado acima). Exemplificando, ?- 7 > 5. retornará Yes; ?- 5 =< 5. retornará Yes; ?- 5=6. retornará No; Há ainda uma forma de comparar números (igualdade aritmética) ou átomos (igualdade de átomo), utilizando =:= ou ==, respectivamente. Ou seja: ?- 1+2=:=2+1. retornará Yes; ?- 1+2==2+1. retornará No; Uma das principais características do Prolog é capacidade de calcular por unificação. Este conceito representa um mecanismo de ligar os conteúdos das variáveis e pode ser visto como um tipo de atribuição. Pode ser usado tanto para números quanto para outros tipos de valores. Eis um exemplo de unificação: ?- 1+A=B+2. retornará A=2 e B=1. 12 Os operadores aritméticos, por sua vez, são utilizados para contas aritméticas como em qualquer linguagem de programação que os contenham, e também são infixos (dispostos entre os operandos). A soma é representada por “X + Y”, a subtração por “X - Y”, a multiplicação por “X * Y”, a potência por “X ^ Y” e a divisão por “X / Y” (retornando um valor real). Para a divisão retornar um valor inteiro (truncado) usa-se “X // Y”. O resto da divisão pode ser encontrado através de “X mod Y”. Contudo, para utilizar essas operações é necessário atribuir uma variável para receber o resultado. Essa atribuição é feita através do “is”, que equivale ao := do pascal, por exemplo. O “is”, no entanto, é usado apenas para cálculos com números ou variáveis que contenham valores numéricos, sendo inválido seu uso com qualquer outro tipo de dado. Exemplificando, ?- Y is 5. retornará Y = 5; ?- Y is 11/2. retornará Y = 5.5; ?- Y is 11//2. retornará Y = 5; ?- Y is 11 mod 2. retornará Y = 1; ?- Y is 5^2. retornará Y = 25; ?- X is 10,Y is X*X. retornará X = 10 e Y = 100. Se, ao invés de is, o programador usar um =, o resultado de ?- X = 1+1. retornará X = 1+1 (uma string). Aplicando algumas regras e fatos podemos estabelecer funções matemáticas como elevar um número ao quadrado, por exemplo. A implementação na base de dados poderia ser quadrado(X,Y):-Y is X*X., tendo em vista que, assim como numa função em linguagem imperativa, é necessário conhecer o significado de cada parâmetros, que neste caso implicaria que o primeiro valor (X) deverá ser informado pelo usuário, e Y perguntado. Assim, ?- quadrado(10,A). retornará A = 100 (observe que não é necessário que as variáveis tenham o mesmo nome das que foram implementadas na regra). 10. RECURSÃO Programar em Prolog exige certa experiência em recursividade, uma vez que esta é a única estrutura de repetição que a linguagem dispõe. Um exemplo 13 simples de como a recursividade é usada em uma linguagem lógica é o cálculo do fatorial de um número. Este é um cálculo relativamente simples, pois o fatorial de um número é a multiplicação dele com todos os números que o antecedem. O fatorial de 5, por exemplo, equivale a 5*X, onde X é o fatorial de 5-1 (ou seja, 4). Seguindo esta lógica, pode-se elaborar uma regra para o cálculo fatorial: A primeira regra seria fatorial(0,1)., que especifica o fim da recursividade quando o valor chegar a 0 (como 1 é o elemento neutro da multiplicação, o fatorial de 0 recebe 1, não modificando o resultado final). A outra linha de código seria definida por fatorial(X,Y):-A is X-1, fatorial (A,B), Y is X*B., onde o fatorial de X será Y se o fatorial de X-1 for B, sendo que Y é X*B. Fazendo passo a passo o fatorial de 4 (que resulta em 24): X=4 4! = Y1, A1 = 3 3! = Y2, A2 = 2 2! = Y3, A3 = 1 1! = Y4, A4 = 0 B1 = 1 1! =1 * B1 1! = 1 B2 = 1 2! = 2 * B2 2! = 2 B3 = 2 3! = 3 * B3 3! = 6 B4 = 6 4! = 4 * B4 4! = 24 Y = 24 11. APLICAÇÃO O uso de linguagens Lógicas engloba diversas áreas de aplicabilidade, as quais podem também utilizar de linguagens de outro tipo, como as imperativas e as 14 funcionais. Contudo, existem certos campos da ciência onde uma linguagem baseada na lógica computacional é mais adequada para exercer determinadas funções. Como dito anteriormente, o Prolog e o Lisp são as linguagens mais indicadas para implementação de Inteligência Artificial, por serem declarativas e, consequentemente, permitirem um estudo mais detalhado do objetivo a ser alcançado, ao invés manter seus focos para o algoritmo e para a interface gráfica, como fazem as linguagens imperativas. A busca pela criação de sistemas de inteligência artificial avançada com lógica não-trivial tem aumentado de forma gradativa nos últimos anos, e somente linguagens que tratam diretamente com esse tipo de raciocínio podem oferecer recursos capazes de possibilitar o surgimento de novas tecnologias e conceitos na área. O desenvolvimento do Lisp em 1958 por John McCarthy e do Prolog em 1972 por Alain Colmerauer foram dois fatos importantes na história da Inteligência Artificial. O Prolog também pode ser usado para implementar compiladores de forma mais segura, simples e rápida, conforme estudo feito por Maria Carolina Monard e João Luiz Franco, da Universidade de São Paulo, e publicado no artigo “Uso da de Programação Lógica no Desenvolvimento de Compiladores”. Em outros estudos, também foi possível verificar o desempenho vantajoso do Prolog perante outras linguagens mais convencionais para resolução de tratamento de árvores e processamento de listas. Outra aplicação para o Prolog é no Tratamento da Linguagem Natural, processo no qual permite a aproximação das linguagens humana e computacional, de forma a prover uma comunicação entre máquina e homem. Um exemplo deste tipo de processamento pode ser observado nos exemplos que Robert Pasero e Philippe Roussel apresentaram ao desenvolver a lógica e a implementação do Prolog, onde foi possível estabelecer uma conversa com o computador. Comunicações desse tipo são importantes, pois facilitam a leitura das informações obtidas pela máquina, como em um sistema de Consulta de Banco de Dados, onde as informações são complexas e requerem uma certa dedicação do profissional para explorar os dados da forma desejada. 12. AVALIAÇÃO 15 Linguagens imperativas são, em geral, mais fáceis de serem implementadas e mais poderosas no âmbito da elaboração de interfaces gráficas, o que explica seu grande domínio no mundo atual. Contudo, linguagens lógicas possuem seus pontos fortes e, em muitos deles, são mais indicados para uso do que os demais paradigmas. Algumas dessas vantagens são a simplicidade da programação, a pouca quantidade de códigos (evitando que ocorra ortogonalidade), o estimulo do raciocínio lógico e a menor ocorrência de erros no programa. Por ser do paradigma declarativo, ela é mais direcionada à solução, tornando-se desnecessário o uso de algoritmos. Outro fator importante a ser analisado é o tempo gasto para sua programação, que pode ser inferior a de linguagens de outros paradigmas se o programador tiver conhecimento avançado do uso da linguagem e de suas características, como a necessidade de trabalhar com recursividade. Por isso, podese afirmar que o Prolog requer um estudo mais avançado de funções diretamente ligadas a listas e a recursão. Em termos de visualização do código, há certa falta de legibilidade quando o programa em questão utiliza-se de recursos avançados e possui grande extensão (em quantidade de linhas de código). Contudo, a identificação individual de fatos e regras é bastante simples e permite ao programador uma percepção mais natural dos mesmos, uma vez que a linguagem permite a criação de nomes que possibilitam a comunicação homem-máquina. Isto ocorre porque o Prolog possui poucos e simples comandos, o que acaba por contribuir com a organização das informações e, consequentemente, evitar erros de implementação ou de sintaxe. O Prolog é capaz de fazer, em termos de processamento de funções, tudo que uma linguagem imperativa pode fazer, mas de forma diferente. A ausência de estruturas de repetição e de controle pode ajudar na legibilidade sem prejudicar o funcionamento do programa. Contudo, para que isso seja possível, como dito anteriormente, é necessário que o programador tenha experiência em seu uso; caso contrário, a não-poluição visual que os códigos em Prolog possuem pode se transformar em dor de cabeça, pois pensar recursivamente, por exemplo, não é tão simples como se parece. O fato de não precisar solicitar alocação de memória e até mesmo de declarar o tipo de uma variável é favorável ao Prolog, pois o torna mais legível e confiável, pois há a certeza de que o dado será processado de acordo com seu 16 conteúdo. Por outro lado, o Prolog não permite o armazenamento de um dado em uma variável após o término da função onde ela se encontra, o que prejudica o domínio do programador sobre seu código. O processamento dos dados no Prolog é feito de forma paralela, tornando seus interpretadores especialmente capazes de tirar proveito de máquinas com processadores múltiplos. Programas lógicos também são rápidos e diretos, graças a sua capacidade de Busca e Casamento de Padrões, o que leva o Prolog a ser uma poderosa ferramenta de comparação e obtenção de dados. A criação do Prolog foi um marco importante na história da computação, uma vez que contribuiu para o surgimento de novos paradigmas e, principalmente, formas de pensar. Seu uso é restrito a determinadas áreas do conhecimento, bem como o raciocínio lógico. Uma comparação análoga com nossas vidas é a de que, na maioria das vezes que precisamos realizar alguma tarefa, pensamos de forma imperativa, estabelecendo um conjunto ordenado de passos a seguir (o algoritmo) para alcançar aquela meta. Não é comum, por exemplo, pensarmos de forma recursiva. Todos esses fatores levam as linguagens imperativas a serem mais familiares aos humanos no seu modo de encontrar soluções e obter respostas, tornando, assim, linguagens lógicas mais “complicadas”. Portanto, podemos concluir que o uso de uma linguagem como o Prolog deve ser feito em casos onde linguagens convencionais não suprem as necessidades de resolução do problema, tendo em mente que é necessário ter conhecimento avançado de programação lógica e recursividade, de modo a não subutilizar a mesma. 17 13. REFERÊNCIAS COLMERAUER, Alain; ROUSSEL Philippe. The birth of Prolog. Disponível em: <http://www.lim.univ- mrs.fr/~colmer/ArchivesPublications/HistoireProlog/19november92.pdf>, Novembro de 1992. APT, Krzysztof R. The Logic Programming Paradigm and Prolog. Disponível em: <http://homepages.cwi.nl/~apt/ps/lp00.ps>, Julho de 2001. ALVES, Robinson Luís de Souza. PROLOG. Disponível em: <http://www.cefetrn.br/~robinson/prolog2.ppt>. MONARD, Maria Carolina; FRANCO, João Luiz. Uso de Programação Lógica no Desenvolvimento de Compiladores. Disponível em: <http://labic.icmc.usp.br/didactic-material/prolog>. OLIVEIRA, Fabio Abreu Dias de. Processamento de linguagem natural: primcípios básicos e a implementação de um analisador sintático de sentenças da língua portuguesa. Disponível em: <http://www.inf.ufrgs.br/procpar/disc/cmp135/trabs/992/Parser/parser.html>. Wikipedia, a enciclopédia <http://pt.wikipedia.org/wiki/Prolog>. livre. Prolog. Disponível em: