Escolar Documentos
Profissional Documentos
Cultura Documentos
Apostila Prolog PDF
Apostila Prolog PDF
Prolog
Joo Meidanis
c Copyright 2011 J. Meidanis
Contedo
1 Introduo 4
1.3 Fatos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.4 Perguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.5 Variveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.6 Conjunes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.7 Regras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2 Sintaxe e unicao 15
2.1 Constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.2 Variveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.3 Estruturas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3 Aritmtica 20
1
4 Estruturas de dados e recurso 24
4.2 Listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
4.3 Recurso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
4.5 Acumuladores . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
5 Backtracking e o corte 36
5.2 O corte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
6.5 Operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
2
7 Predicados pr-denidos 53
7.1 Verdadeiros . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
7.2 Tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
7.4 Listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
7.6 Outros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
8 Estilo e depurao 56
8.1 Depurao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
9 Gramticas 60
Bibliograa 70
3
Captulo 1
Introduo
Prolog lida com objetos e relaes entre eles. A palavra objeto no tem o
mesmo sentido que em orientao a objetos, pois os objetos Prolog no tm
mtodos e no h herana. Em Prolog, objetos so apenas coisas sobre as
quais queremos raciocinar.
Prolog tem um tipo chamado termo que engloba todos os dados e tambm
os programas nesta linguagem.
4
1.2 Programao em Prolog
regras de inferncia
Prolog na verdade faz muito mais do que responder sim ou no: a linguagem
permite usar o computador como um aracbouo de fatos e regras, e proporci-
ona meios de fazer inferncias, indo de um fato a outro, e achando os valores
das variveis que podem levar a concluses lgicas.
1.3 Fatos
5
Observe que:
1.4 Perguntas
?- possui(maria, livro).
humano(socrates).
humano(aristoteles).
ateniense(socrates).
e a pergunta:
6
?- ateniense(aristoteles).
Embora seja verdade que Aristteles tenha sido ateniense, no se pode provar
isto a partir dos fatos dados.
1.5 Variveis
Variveis distingem-se dos objetos por terem nomes iniciados com letra
maiscula. Considere o seguinte banco de dados:
gosta(maria, flores).
gosta(maria, pedro).
gosta(paulo, maria).
Se zermos a pergunta:
?- gosta(maria, X).
X = flores
e ca esperando por mais instrues, das quais falaremos em breve. Nova-
mente, Prolog busca fatos que uniquem com o fato da pergunta. A diferena
que uma varivel est presente agora. Variveis no instanciadas, como
o caso de X inicialmente, unicam com qualquer termo. Prolog examina
os fatos na ordem em que aparecem no banco de dados, e portanto o fato
gosta(maria, flores) encontrado primeiro. A varivel X unica com
flores e a partir deste momento passa a estar instanciada com o termo
flores. Prolog tambm marca a posio no banco de dados onde a unica-
o foi feita.
7
Quando Prolog encontra um fato que unica com uma pergunta, Prolog
mostra os objetos que as variveis guardam. No caso em questo, s h uma
varivel, que foi unicada com o objeto flores, ento Prolog respondeu
X = flores. Neste ponto Prolog aguarda novas instrues. Se teclarmos
ENTER, isto ser interpretado como signicando que estamos satisfeitos com
a resposta dada e Prolog interrompe a busca. Se em lugar disto teclarmos um
ponto-e-vrgula (;) seguindo de ENTER, Prolog vai continuar sua busca do
ponto onde tinha parado, tentando encontrar uma outra resposta pergunta.
Quando Prolog comea a busca a partir de uma posio previamente mercada
ao invs de comear do incio do banco de dados, dizemos que est tentando
ressatisfazer a pergunta.
1.6 Conjunes
Questes mais complexas como Ser que Pedro gosta de Maria e Maria gosta
de Pedro? podem ser feitas com conjunes. Este problema consiste de duas
metas separadas que Prolog deve tentar satisfazer, e existe uma notao para
isto na linguagem. Considere o banco de dados:
gosta(maria, chocolate).
gosta(maria, vinho).
8
gosta(pedro, vinho).
gosta(pedro, maria).
A pergunta
Prolog tenta satisfazer a primeira meta; caso consiga, manter uma marca
no banco de dados no ponto onde houve unicao e tenta a segunda meta.
Se a segunda meta tambm satisfeita, Prolog coloca uma outra marca para
a segunda meta. Observe que cada meta tem sua prpria marca no banco de
dados.
9
falha. Prolog ento tentar ressatistazer a meta anterior do ponto onde
esta parou no banco de dados, desfazendo instanciaes associadas.
gosta(maria, vinho).
Prolog move a marca para a nova posio e instancia X a vinho.
4. Prolog tenta a prxima meta, que agora gosta(pedro, vinho). Esta
no uma ressatisfao, mas sim uma meta inteiramente nova, e por-
tanto a busca comea do incio do banco de dados. Esta nova meta
satisfeita e Prolog coloca a marca desta meta no fato unicador.
X = vinho
e aguarda instrues.
Resumindo, cada meta tem seu prprio marcador no banco de dados, que
usado caso a meta precise ser ressatisfeita. Junto com uma unicao -
cam guardadas instanciaes de variveis dela resultantes, que sero desfeitas
em caso de necessidade de ressatisfao. A este processo se d o nome de
backtracking.
1.7 Regras
Uma regra uma armao geral sobre objetos e seus relacionamentos. Por
exemplo, suponha que queremos representar a seguinte dependncia entre
fatos:
10
Pedro gosta de X se X gosta de vinho.
Note que a mesma varivel X ocorre trs vezes na regra. Dizemos que o
escopo de X a regra toda. Isto signica que quando X for instanciada, as
trs ocorrncias tero o mesmo valor.
Vamos ilustrar este procedimento com nosso prximo exemplo, que envolve a
famlia da rainha Vitria. Usaremos o predicado pais com trs argumentos
11
tal que pais(X, Y, Z) signica que os pais de X so Y e Z. O segundo
argumento a me e o terceiro o pai de X. Usaremos tambm os predicados
mulher e homem para indicar o sexo das pessoas.
homem(alberto).
homem(eduardo).
mulher(alice).
mulher(vitoria).
X mulher
X tem me M e pai P, e
irma_de(X, Y) :-
mulher(X),
pais(X, M, P),
pais(Y, M, P).
Se perguntarmos:
?- irma_de(alice, eduardo).
12
Tabela 1.1: Processamento da meta irma_de(alice, eduardo).
pois, embora a mesma letra signique a mesma varivel dentro de uma regra,
em metas diferentes a mesma letra signica variveis diferentes.
Note que, ao unicar com a cabea da regra, a meta 1 deu origem a trs outras
metas, denotadas pelos nmeros 2, 3, e 4, que vieram do corpo da regra. Ao
nal, Prolog consegue satisfazer a meta principal e responde: sim. Suponha
agora que queiramos saber de quem Alice irm. A pergunta adequada seria
?- irma_de(alice, X).
O que ocorre ento est na Tabela 1.2, onde X sem ndice indicar a varivel
da pergunta.
X = eduardo
13
Tabela 1.2: Processamento da meta irma_de(alice, X).
Exerccios
14
Captulo 2
Sintaxe e unicao
2.1 Constantes
15
decimal e opcionalmente expoente de dez. Alguns exemplos de nmeros
vlidos:
2.2 Variveis
2.3 Estruturas
livro(incidente_em_antares, verissimo)
16
Estruturas podem ser aninhadas. Se quisermos sosticar a indicao dos
livros, colocando nome e sobrenome do autor para poder diferenciar entre
vrios autores com o mesmo sobrenome, podemos usar:
Note que Prolog diferente das outras linguagens no aspecto aritmtico, pois
uma expresso como 2 + 3 simplesmente um fato como qualquer outro.
Para a realizao de clculos aritmticos sempre necessrio usar o predicado
is que ser visto no captulo sobre aritmtica.
17
2.4 Igualdade e unicao
X = X.
T2
constante varivel estrutura
constante s se for a sempre; causa nunca
mesma instanciao
varivel sempre; causa tornam-se liga- sempre; causa
instanciao das instanciao
T1
estrutura nunca sempre; causa mesmo funtor,
instanciao mesmo nmero
de componen-
tes e cada com-
ponente igual
Tabela 2.1: Condies para que dois termos se uniquem, segundo seus sub-
tipos. O subtipo varivel signica varivel no instanciada. O subtipo
estrutura signica estruturas com aridade maior ou igual a um.
18
Exerccios
irmaos(X, Y) :-
pai(X, PX),
pai(Y, PY),
PX = PY.
19
Captulo 3
Aritmtica
Prolog tem uma srie de predicados pr-denidos para artimtica, que podem
ser divididos entre comparao e clculo. Vamos comear pelos de compara-
o.
=:= igual
=\= diferente
< menor
> maior
=< menor ou igual
>= maior ou igual
20
reinou(rhodri, 844, 878).
reinou(anarawd, 878, 916).
reinou(hywel_dda, 916, 950).
reinou(iago_ap_idwal, 950, 979).
reinou(hywal_ap_ieuaf, 979, 985).
reinou(cadwallon, 985, 986).
reinou(maredudd, 986, 999).
principe(X, Y) :-
reinou(X, A, B),
Y >= A,
Y =< B.
Alguns usos:
?- principe(cadwallon, 986).
yes
?- principe(X, 900).
X = anarawd
yes
?- principe(X, 979).
X = iago_ap_idwal ;
X = hywel_ap_ieuaf ;
no
21
nmero, caso em que is testa se o lado esquerdo e direito so iguais, servindo
assim como operador de igualdade numrica.
pop(eua, 203).
pop(india, 548).
pop(china, 800).
pop(brasil, 108).
area(eua, 8).
area(india, 3).
area(china, 10).
area(brasil, 8).
dens(X, Y) :-
pop(X, P),
area(X, A),
Y is P/A.
Alguns usos:
?- dens(china, X).
X = 80
yes
?- dens(turquia, X).
no
22
Os operadores para clculos aritmticos em Prolog incluem pelo menos os
seguintes:
+ soma
- subtrao
* multiplicao
/ diviso
// diviso inteira
mod resto da diviso
Exerccios
soma(5).
soma(2).
soma(2 + X).
soma(X + Y).
e a meta
soma(2 + 3)
Com quais dos fatos esta meta unica? Quais so as instanciaes de
variveis em cada caso?
?- X is 2 + 3.
?- X is Y + Z.
?- 6 is 2 * 4.
?- X = 5, Y is X // 2.
?- Y is X // 2, X = 5.
23
Captulo 4
As estruturas podem ser desenhadas como rvores, onde o funtor ca na raiz
e os componentes so seus lhos, como na Figura 4.1.
pais
pais(carlos, bete, felipe)
Frases da lngua portuguesa podem ter suas sintaxes representadas por estru-
turas em Prolog. Um tipo de sentena muito simples, consisitindo de sujeito
e predicado (no confundir com predicado Prolog!), poderia ser:
24
sentenca(sujeito(X), predicado(verbo(Y), objeto(Z)))
sentenca sentenca
Y Z ama maria
4.2 Listas
25
f
X a
. . . []
a b c
A exemplo de LISP, Prolog tambm tem uma maneira alternativa, mais pr-
tica, de denotar listas, que no usa o funtor . explicitamente. Basta colocar
26
os elementos separados por vrgulas entre colchetes: [a, b, c]. Qualquer
termo pode ser componente de uma lista, por exemplo, variveis ou outras
listas:
Para combinar com a notao simplicada para listas, Prolog tambm tem
uma notao especial, mais intuitiva, para indicar .(X, Y) usando a barra
vertical |: [X|Y]. Esta notao muito usada para decompor uma lista
em cabea e cauda, como no exemplo abaixo, onde aparecem um banco de
dados e algumas perguntas:
p([1, 2, 3]).
p([o, gato, sentou, [no, capacho]]).
?- p([X|Y]).
X = 1 , Y = [2, 3] ;
X = o, Y = [gato, sentou, [no, capacho]] ;
no
?- p([_,_,_,[_|X]]).
X = [capacho]
27
Uma ltima observao: possvel criar estruturas que parecem listas mas
no so, por exemplo, [cavalo|branco], que no lista porque sua cauda
no uma lista nem a lista vazia.
Exerccios
4.3 Recurso
28
termo X um elemento da lista Y. H duas condies a vericar. Em pri-
meiro lugar, um fato que X membro de Y se X for igual cabea de Y, o
que pode ser escrito assim:
member(X, Y) :- Y = [X|_].
ou, simplicando,
member(X, [X|_]).
Note o uso da varivel annima. Neste fato, no nos interessa o que a cauda
de Y.
ou, simplicando,
29
Para denir um predicado resursivo, preciso atentar para as condies de
parada e para o caso recursivo. No caso de member, h na verdade duas
condies de parada: ou achamos o objeto na lista, ou chegamos ao m dela
sem ach-lo. A primeira condio tratada pela primeira clusula, que far
a busca parar se o primeiro argumento de member unicar com a cabea do
segundo argumento. A segunda condio de parada ocorre quando o segundo
argumento a lista vazia, que no unica com nenhuma das clusulas e faz
o predicado falhar.
Em relao ao caso recursivo, note que a regra escrita de tal forma que
a chamada recursiva ocorre sobre uma lista menor que a lista dada. Assim
temos certeza de acabaremos por encontrar a lista vazia, a menos claro que
encontremos o objeto antes.
?- homem(X).
30
homem(adao).
homem(X) :- homem(Y), filho(X, Y).
lista([A|B]) :- lista(B).
lista([ ]).
?- lista([a, b, c, d]).
yes
?- lista([ ]).
yes
?- lista(f(1, 2, 3)).
no
Mas, se perguntarmos
?- lista(X).
Prolog entrar em loop. Mais uma vez, inverter a ordem das clusulas resol-
ver o problema.
O predicado append usado para juntar duas listas formando uma terceira.
Por exemplo, verdade que
31
Este predicado pode ser usado para criar uma lista que a concatenao de
duas outras:
append([ ], L, L).
append([X|L1], L2, [X|L3]) :- append(L1, L2, L3).
32
4.5 Acumuladores
listlen([ ], 0).
listlen([H|T], N) :- listlen(T, N1), N is N1 + 1.
Observe que o primeiro argumento deve vir instanciado para que esta de-
nio funcione. A denio com acumulador baseia-se no mesmo princpio
recursivo, mas acumula a resposta a cada passo num argumento extra. Usa-
mos um predicado auxiliar lenacc que uma generalizao de listlen. A
meta lenacc(L, A, N) satisfeita quando o comprimento de L adicionado
ao nmero A resulta em N. Para obter o comprimento da lista, basta chamar
lenacc com o segundo argumento igual a zero. Eis as denies:
lenacc([ ], A, A).
lenacc([H|T], A, N) :- A1 is A + 1, lenacc(T, A1, N).
listlenacc([a, b, c, d, e], N)
lenacc([a, b, c, d, e], 0, N)
lenacc([b, c, d, e], 1, N)
33
lenacc([c, d, e], 2, N)
lenacc([d, e], 3, N)
lenacc([e], 4, N)
lenacc([ ], 5, N)
34
que signica o predicado revacc: a meta revacc(L1, L2, L3) satisfeita
quando a reversa da lista L1 concatenada com a lista L2 resulta em L3. De
posse desta denio em palavras mais fcil chegar denio em Prolog.
Exerccios
35
Captulo 5
Backtracking e o corte
Resumindo o que vimos sobre a operao de Prolog at agora:
36
5. a tentativa de ressatisfao de uma meta semelhante de satisfao,
com as seguintes ressalvas:
pai(maria, jorge).
pai(pedro, jorge).
pai(sueli, haroldo).
pai(jorge, eduardo).
pai(X) :- pai(_,X).
?- pai(X).
37
causar o seguinte resultado:
X = jorge ;
X = jorge ;
X = haroldo ;
X = eduardo ;
no
Note que Jorge apareceu duas vezes, pois h dois fatos onde ele aparece como
pai de algum. Talvez quisssemos que cada pai aparecesse uma vez s, mas
a operao padro de Prolog causar o resultado acima.
pode ser satisfeita vrias vezes antes de falhar (no caso ilustrado, cinco vezes).
H situaes onde gostaramos que ela fosse satisfeita uma vez s. Podemos
instruir Prolog a descartar escolhas desnecessrias com o uso do corte.
inteiro(0).
inteiro(N) :- inteiro(M), N is M + 1.
A pergunta
?- inteiro(N).
38
5.2 O corte
g :- a, b, c, !, d, e, f.
39
5.3.1 Conrmando a escolha certa
Os predicados em Prolog tm em geral vrias clusulas. Em alguns pre-
dicados, diferentes clusulas so dirigidas a diferentes padres de dados de
entrada. s vezes possvel selecionar qual regra apropriada para cada
entrada s pela sintaxe da entrada, por exemplo, uma regra com [X|Y] no
casar com a lista vazia. Outras vezes, como quando os predicados envolvem
nmeros, isto no possvel. Nestes casos, o corte pode ajudar a fazer com
que a meta s case com o caso destinado a ela.
fat(0, 1) :- !.
fat(N, F) :- N1 is N - 1, fat(N1, F1), F is F1 * N.
O corte aqui serve para impedir que uma meta da forma fat(O, F) case com
a segunda clusula em caso de ressatisfao. Veja o que ocorre com e sem o
corte.
Com o corte:
?- fat(5, F).
F = 120 ;
no
Sem o corte:
?- fat(5, F).
F = 120 ;
loop
( innito out of memory )
40
5.3.2 Combinao corte-falha
Existe em Prolog um predicado pr-denido sem argumentos chamado fail
que sempre falha. Pode-se usar em seu lugar qualquer meta incodicional-
mente falsa como por exemplo 0 > 1 mas mais claro e elegante usar fail.
Usado em combinao com o corte, ele pode implementar negao.
Este mesmo mtodo pode ser usado para implementar a negao de qual-
quer predicado. O uso deste artifcio to comum que existe uma notao
em Prolog para indicar esta forma de negao: \+ antecedendo uma meta
signica a negao dela. Por exemplo, podemos denir
41
5.3.3 Limitando buscas
Muitas vezes em Prolog usamos um predicado para gerar vrias alternati-
vas que sero testadas por um segundo predicado para escolher uma delas.
Em alguns casos, o predicado gerador tem a capacidade de gerar innitas
alternativas, e o corte pode ser til para limitar esta gerao.
Para exemplicar esta questo, suponha que queiramos usar member apenas
para testar se elementos dados pertencem a listas dadas, sem nos importar-
mos com o nmero de vezes que aparecem. Neste caso, a denio
42
member(X, [X|_]) :- !.
member(X, [_|Y]) :- member(X, Y).
O caso seguinte ilustrar como o corte pode impedir que o operador de igual-
dade = seja substitudo pelo uso de variveis com o mesmo nome. Considere
o predicado abaixo, que d o nmero de pais que uma pessoa tem:
pais(adao, 0).
pais(eva, 0).
pais(_, 2).
Isto , Ado e Eva tm zero pais e qualquer outra pessoa tem dois pais. Se
usarmos este predicado para descobrir quantos pais uma pessoa tem, tudo
vai bem:
?- pais(eva, N).
N = 0
?- pais(pedro, N).
N = 2
?- pais(eva, 2).
yes
43
pois a meta no casa com a clusula especca para Eva, mas no h nada
para impedir que a busca continue, e acabe casando com a clusula errada.
pais(adao, N) :- !, N = 0.
pais(eva, N) :- !, N = 0.
pais(_, 2).
Exerccios
44
(a) member1 sem corte e member2 sem corte?
member_com(X, [X|_]) :- !.
member_com(X, [_|Y]) :- member_com(X, Y).
member_sem(X, [X|_]).
member_sem(X, [_|Y]) :- member_sem(X, Y).
45
Captulo 6
Neste captulo veremos alguns dos mecanismos que Prolog oferece para a en-
trada e sada de dados. Dividiremos a apresentao em trs partes: leitura e
escrita de termos; leitura e escrita de caracteres; leitura e escrita de arquivos.
Alm disso, abordaremos a questo dos operadores, que inuenciam o modo
como a leitura e a escrita ocorrem.
46
especial end_of_file. um erro tentar ler aps encontrar o m do arquivo.
Em caso de ressatisfao, read falha.
Exemplo:
?- pequeno.
|: 40.
yes
Observe o prompt '|:' usado por Prolog para indicar que est esperando um
termo.
yes
Assim como ocorre com read, metas dos predicados write, e nl s so sa-
tisfeitas na primeira vez.
47
6.2 Leitura e escrita de caracteres
conta_aux(A, N) :- get_char('\n'), !, A = N.
conta_aux(A, N) :- A1 is A + 1, conta_aux(A1, N).
48
6.3 Ler e escrever arquivos
programa :-
49
open('arq.txt', read, X),
current_input(Stream),
set_input(X),
codigo_propriamente_dito,
set_input(Stream),
close(X).
Note que foi salvo o dispositivo anterior na varivel Stream, para ser rees-
tabelecido como dispositivo de entrada ao trmino do programa. Atitude
semelhante deve ser usada em relao sada.
6.5 Operadores
50
prexa. Para tanto, necessrio tambm informar a precedncia e a associ-
atividade destes operadores. Apenas funtores de aridade um ou dois podem
ser operadores.
51
?- op(700, xfx, 'is').
?- op(500, yfx, '+').
?- op(500, yfx, '-').
?- op(400, yfx, '*').
?- op(400, yfx, '//').
?- op(400, yfx, '/').
?- op(400, yfx, 'mod').
?- op(200, fy, '-').
Exerccios
52
Captulo 7
Predicados pr-denidos
7.1 Verdadeiros
7.2 Tipos
53
7.3 Banco de dados
7.4 Listas
54
7.6 Outros
; um operador binrio que signica ou. satisfeito quando uma das duas
metas satisfeita. Em geral, pode ser substitudo por duas clusulas.
Por exemplo,
atomic(X) :- atom(X).
atomic(X) :- number(X).
55
Captulo 8
Estilo e depurao
Se uma clusula cabe toda dentro de uma linha (at cerca de 70 carac-
teres), deixe-a em uma linha. Caso contrrio, coloque apenas a cabea
e o :- na primeira linha, e, nas linhas subseqentes, coloque as sub-
metas do corpo, indentadas com TAB e terminadas por vrgula, exceto
a ltima, que terminada com ponto nal.
Use variveis annimas para variveis que ocorrem apenas uma vez
numa clusula.
56
Ao lado destas recomendaes gerais, bom estar atento aos seguintes cui-
dados ao denir um predicado:
Fique atento tambm para certos erros comuns que costumam assolar os
programas feitos s pressas:
57
8.1 Depurao
Programas feitos com cuidado tendem a apresentar menos erros, mas difcil
garantir que no haver erros. Caso seu programa no esteja funcionando,
ou seja, provocando erros de execuo, dando a resposta errada ou simples-
mente respondendo no, voc pode usar os potentes recursos de depurao
de Prolog para localizar e corrigir os erros. H predicados pr-denidos para
ajud-lo nesta tarefa. Nesta seo descreveremos os predicados de depurao
existentes na implementao SWI Prolog. Outras implementaes podem ter
predicados ligeiramente diferentes para depurao.
58
Opo Verbo Descrio
w write imprime a meta
c creep segue para o prximo evento
s skip salta at o prximo evento desta meta
l leap salta at o prximo evento acompanhado
r retry volta primeira satisfao da meta
f fail causa a falha da meta
b break inicia uma sesso recursiva do interpretador
a abort interrompe a depurao
59
Captulo 9
Gramticas
Para enteder uma frase numa lngua qualquer, o primeiro passo geralmente
consiste em vericar se a frase segue as regras gramaticais da lngua. Com-
putacionalmente, uma das maneiras mais simples de fazer esta vericao
usando gramticas livres de contexto, como a que especicamos abaixo:
60
substantivo > [pera].
substantivo > [homem].
Desta forma, para vericar se uma sentena vlida, devemos tentar encaix-
la na denio acima. Tome como exemplo a frase o homem come a pera.
Ela pode ser encaixada na gramtica que demos da maneira indicada na
Figura 9.1
sentenca
sujeito predicado
come a pera
61
Ao denir os diversos itens da frase, h sempre um que o principal, do qual
emanam todos os demais. No nosso caso, este item sentenca, denido
na primeira regra. E, ao denir cada item em funo de outros, fatalmente
acabamos chegando aos itens chamados terminais, para os quais a denio
dada em termos de exemplos concretos. Os itens verbo, artigo e susbtantivo
so terminais na gramtica dada anteriormente. Observe que indicamos isto
usando uma notao de lista para os exemplos.
Pois bem, o problema da anlise lxica e dada uma frase qualquer, determinar
se ela se encaixa numa descrio de gramtica cmo a que demos nesta seo, e
construir uma rvore lxica para ela, nos moldes da Figura 9.1. Um programa
que faa isto chamado de analisador lxico.
Isto posto, natural implementar a anlise lxica como um predicado que ser
satisfeito quando a frase dada (em forma de lista) segue as regras gramaticais
indicadas, e falha caso contrrio. Assim, teremos um predicado sentenca(X)
que satisfeito quando X for uma lista de palavras que formam uma sentena
vlida.
Como testar isto? Bem, segundo as regras, uma sentena vlida deve ser
formada por um sujeito seguido de um predicado. Observe que a predicado
62
est agora sendo umada em dois sentidos diferentes. Um deles so os predi-
cados em Prolog. O outro o predicado que um item, ou seja, uma parte,
de uma frase vlida. Cuidado para no confundir estes dois usos!
sentenca(X) :-
append(Y, Z, X), sujeito(Y), predicado(Z).
Note o uso de append, que quebra a frase inicial de todas as formas possveis
e testa, para cama uma delas, se os pedaos resultantes podem ser vistos
como sujeitos e predicados. Para que o predicado sentenca possa funcionar,
preciso denir todos os outros dos quais depende. A denio nal caria
algo como:
sentenca(X) :-
append(Y, Z, X), sujeito(Y), predicado(Z).
sujeito(X) :-
append(Y, Z, X), artigo(Y), substantivo(Z).
predicado(X) :- verbo(X).
predicado(X) :-
append(Y, Z, X), verbo(Y), objeto(Z).
artigo([o]).
artigo([a]).
substantivo([pera]).
substantivo([homem]).
verbo([come]).
verbo([canta]).
63
objeto(X) :-
append(Y, Z, X), artigo(Y), substantivo(Z).
64
Para ajudar a entender o conceito, damos a seguir algumas perguntas que
seriam respondidas armativamente com esta nova interpretao:
sendo que, nas duas ltimas, a varivel X ca instanciada com o que sobrar
da lista aps um sujeito.
Figura 9.2: Valor dos parmetros X, Y e Z numa anlise lxica para sujeito.
Note, porm, que a nova denio de sujeito lembra muito a segunda clu-
sula da denio de append. como se a tivessemos incorporado em cada
item. Vejamos como ca o programa inteiro.
65
sentenca(S0, S) :- sujeito(S0, S1), predicado(S1, S).
artigo([o|S], S).
artigo([a|S], S).
substantivo([pera|S], S).
substantivo([homem|S], S).
verbo([come|S], S).
verbo([canta|S], S).
Observe como a nova denio se reete nos itens terminais. Eles tambm
tm dois parmetros, sendo o primeiro a entrada e o segundo, o resto aps o
terminal. No caso dos terminais, onde temos tomos concretos para o item,
o segundo parmetro simplesmente a cauda do primeiro, aps consumido
o tomo em questo.
66
explicada na Seo 9.2, gerando um predicado de dois parmteros para cada
item.
Alm dos dois argumentos que a notao para regras gramaticais automa-
ticamente cria, possvel acrescentar argumentos adicionais para propsitos
especcos. Vamos trabalhar um exemplo onde esta funcionalidade pode ser
til. Trata-se da concordncia em nmero entre sujeito e verbo. Sentenas
como os homens come a pera ou ento o homem comem a pera no so
corretas, mas seriam aceitas pela extenso natural de nossa gramtica inicial
ao incluir o artigo os, o substantivo homens e o verbo comem, ou seja,
as formas plurais de itens terminais j presentes na gramtica.
67
artigo(singular) > [o].
artigo(singular) > [a].
artigo(plural) > [os].
artigo(plural) > [as].
68
Bibliograa
69