12. Avaliação - Google Sites

Propaganda
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:
Download