Linguagens Lógicas & Prolog - PUC-Rio
Linguagens Lógicas & Prolog - PUC-Rio
Linguagens Lógicas & Prolog - PUC-Rio
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
<strong>Linguagens</strong> <strong>Lógicas</strong><br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 1<br />
Introdução<br />
Em LPs imperativas um programa é composto por<br />
uma sequência de comandos que representam as<br />
atividades computacionais que serão executadas.<br />
O programador deve portanto especificar claramente<br />
como realizar o processamento desejado, ou seja,<br />
como é o algoritmo.<br />
Em LPs lógicas um programa consiste na definição<br />
de relações lógicas que devem ser satisfeitas pela<br />
solução procurada.<br />
A busca por uma solução acontece automaticamente<br />
através de regras de inferência.<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 2
Introdução<br />
Programar em uma LP lógica consiste em:<br />
Declarar fatos primitivos sobre um domínio;<br />
Definir regras que expressam relações entre os<br />
fatos de um domínio;<br />
Fazer perguntas sobre um domínio.<br />
O processo de dedução através do qual<br />
encontram-se<br />
respostas às perguntas é<br />
executado automaticamente pelo sistema.<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 3<br />
1. Aves botam ovos.<br />
Exemplo<br />
2. Mamíferos não botam ovos.<br />
3. Baleias são mamíferos.<br />
4. Baleias botam ovos?<br />
Não.<br />
5. Quem bota ovos?<br />
Aves.<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 4
Fatos<br />
Uma forma de declarar um fato como “uma<br />
baleia é um<br />
mamífero” ” é:<br />
mamifero (baleia).<br />
Para representar o fato “Bruno<br />
gosta de Ana” podemos<br />
escrever:<br />
gostar(bruno, ana)<br />
Repare que este fato é diferente de “Ana“<br />
gosta de Bruno”:<br />
gostar(ana, bruno)<br />
Nas expressões acima gostar é o predicado do fato,<br />
representando uma relação entre os argumentos.<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 5<br />
Fatos<br />
Outros exemplos de fatos<br />
campeao(flamengo).<br />
vender(marcelo,carro,carlos).<br />
chuva.<br />
Esta sintaxe não corresponde a invocação de<br />
uma função!!!<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 6
Regras<br />
A declaração de regras (axiomas) em LPs lógicas<br />
segue um padrão conhecido como cláusulas de<br />
Horn:<br />
HA 1 ,A 2 ,..., A n<br />
se todos os A i são verdadeiros, então H é verdadeiro.<br />
Na expressão acima, H é denominado a cabeça da<br />
cláusula e A 1 ,A 2 ,..., A n é o seu corpo.<br />
Através de regras pode-se estabelecer relações<br />
entre fatos.<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 7<br />
Resolução<br />
Para descobrir novas relações uma LP lógica utiliza<br />
um processo conhecido como resolução.<br />
O corpo de uma cláusula é equivalente a sua<br />
cabeça, e ambos podem ser substituídos livremente<br />
em outras cláusulas para formar novas regras.<br />
CA,B<br />
DC<br />
<br />
DA,B<br />
Através do processo de resolução uma LP lógica é<br />
capaz de provar a validade de proposições.<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 8
Banco de Dados<br />
O conjunto de fatos e relações contidos<br />
em um programa lógico é denominado<br />
banco de dados, e representa o<br />
conhecimento sobre um ou mais<br />
domínios.<br />
O objetivo de um programa lógico é<br />
inferir e validar novos fatos ou relações<br />
a partir do banco de dados.<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 9<br />
<strong>Prolog</strong><br />
Foi desenvolvida no início da década de 70<br />
para ser usada na prova de teoremas.<br />
Ainda hoje é a mais popular e principal LP<br />
lógica.<br />
É bastante utilizada em sistemas<br />
especialistas.<br />
Em <strong>Prolog</strong> um programa é composto por<br />
fatos e regras.<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 10
Fatos em <strong>Prolog</strong><br />
Fatos em <strong>Prolog</strong> são representados<br />
através de átomos ou estruturas.<br />
Átomos são strings que começam<br />
sempre com letra minúscula:<br />
esta_chovendo.<br />
dinheiro.<br />
joao.<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 11<br />
Fatos em <strong>Prolog</strong><br />
Estruturas são átomos seguidos de uma lista<br />
de argumentos entre parânteses:<br />
pred (arg1, arg2, ..., argN).<br />
onde:<br />
pred - nome de um predicado<br />
arg1, ... argN - argumentos<br />
N - número de argumentos (aridade)<br />
. - final sintático de qualquer cláusula <strong>Prolog</strong><br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 12
Fatos em <strong>Prolog</strong><br />
Os argumentos de uma estrutura podem ser<br />
átomos, estruturas, variáveis e números.<br />
Exemplos:<br />
caro(diamente).<br />
amigo(joana, patricia).<br />
arvore_bin(valor1, arvore_bin(valor2, valor3)).<br />
quantidade(24).<br />
Estruturas representam relações entre os<br />
argumentos, ou seus predicados.<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 13<br />
Variáveis<br />
Em LPs imperativas variáveis são instanciadas<br />
através de operações explícitas de atribuição.<br />
Em LPs lógicas variáveis geralmente são<br />
instanciadas implicitamente pelo sistema durante o<br />
processo de resolução.<br />
São usadas basicamente para extrair informações do<br />
banco de dados, e para expressar relações entre<br />
fatos.<br />
Variáveis em <strong>Prolog</strong> são representadas por strings<br />
que começam com uma letra maiúscula.<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 14
Exemplos<br />
offroad(X):- carro(X),tracao4x4(X),<br />
suspensaoReforcada(X).<br />
frio(groelandia).<br />
?-frio(X).<br />
x=groelandia.<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 15<br />
Questões<br />
Questões são representados por fatos<br />
precedidos por -?.<br />
?-gostar(bruno, ana).<br />
Informalmente: : Bruno gosta de Ana?<br />
Formalmente: : É possível provar a partir dos fatos<br />
conhecidos pelo programa que a relação<br />
gostar(bruno, ana) é verdadeira?<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 16
Exemplos<br />
animal (cachorro)<br />
animal (gato)<br />
?-animal(cachorro).<br />
yes<br />
?-animal(X)<br />
X = cachorro;<br />
X = gato;<br />
yes<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 17<br />
Unificação<br />
Para tentar provar um fato <strong>Prolog</strong> precisa<br />
estabelecer a equivalência entre fatos.<br />
Dois fatos equivalentes são ditos unificáveis.<br />
Dois átomos são unificáveis apenas se são<br />
idênticos.<br />
Duas estruturas são unificáveis se o seu<br />
predicado é idêntico, e se seus argumentos<br />
são unificáveis .<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 18
Unificação<br />
Uma variável é unificável a qualquer coisa.<br />
Durante o processo de resolução, uma<br />
variável é instanciada com um valor que<br />
permite a sua unificação com um símbolo<br />
correspondente de um outro fato.<br />
O símbolo = em prolog representa unificação.<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 19<br />
Exemplos<br />
fruta(manga).<br />
?-fruta(X).<br />
X = manga<br />
X foi unificada com “manga”<br />
gostar(bruno,ana).<br />
?-gostar(bruno,X).<br />
X = ana<br />
X foi unificada com “ana”<br />
?-X=sol.<br />
X=sol X foi unificada com “sol”<br />
?-sol=sol.<br />
yes “sol” foi unificado com “sol”<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 20
Regras em <strong>Prolog</strong><br />
Regras são representadas como cláusulas<br />
de Horn seguindo a sintaxe:<br />
pred(X1,...,Xn):-<br />
pred1(X1,...,Xn),...,predn(X1,...,Xn).<br />
se os predicados 1 a n são verdadeiros para<br />
as variáveis Xi, então o predicado pred é<br />
verdadeiro para as variáveis Xi.<br />
A variável representa portanto o símbolo para<br />
o qual a regra é verdadeira.<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 21<br />
Exemplos<br />
pai(joao,joaquim).<br />
pai(joaquim,manuel).<br />
avo(X,Y):-pai(Z,Y),pai(X,Z).<br />
?-avo(joao,Z).<br />
Z=manuel<br />
?-avo(joao,manuel).<br />
yes.<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 22
Conjunções<br />
Conjunções permitem a especificação de questões<br />
com múltiplas condições que devem ser satisfeitas<br />
simultaneamente.<br />
Conjunções são representadas por uma vígula ( , ).<br />
Exemplo:<br />
?- localizacao(X,cozinha), comida(X), gostoso(X).<br />
Existe alguma comida gostosa na cozinha?<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 23<br />
Disjunções<br />
Disjunções permitem a especificação de questões<br />
com múltiplas condições na qual ao menos uma<br />
delas deve ser satisfeita.<br />
Disjunções são representadas por um ponto-e-<br />
vírgula ( ; ).<br />
Exemplos:<br />
?-amigos(X,Y); parentes(X,Y).<br />
inverno(X):- nevando(X); gelado(X).<br />
É inverno se está nevando ou está gelado.<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 24
Fluxo de Controle<br />
<strong>Prolog</strong> possui um fluxo de controle implícito através<br />
do qual busca responder uma questão.<br />
Este fluxo é determinístico, ou seja segue sempre<br />
uma mesma ordem:<br />
O banco de dados é percorrido sequencialmente na ordem<br />
em que os fatos\regras<br />
foram declarados.<br />
Para cada predicado correto encontrado, os argumentos são<br />
testados em ordem.<br />
Para cada regra, , as condições são testadas sempre da<br />
esquerda para a direita.<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 25<br />
Exemplo<br />
tropical(caribe). (1)<br />
tropical(havai).<br />
praia(havai).<br />
praia(caribe). (2)<br />
bonito(havai).<br />
bonito(caribe). (3)<br />
paraiso_tropical(X):-tropical(X),praia(X),<br />
tropical(X),praia(X),<br />
bonito(X).<br />
?-paraiso_tropical(X).<br />
X=caribe;<br />
X is caribe<br />
true<br />
X is caribe<br />
true<br />
X is caribe<br />
tropical praia bonito<br />
true<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 26
Fluxo de Controle<br />
Variáveis são instanciadas implicitamente com<br />
valores que permitem a unificação da estrutura.<br />
Assim que uma associação válida for encontrada, os<br />
valores com os quais as variáveis foram instanciadas<br />
são impressos.<br />
Apenas a primeira associação válida é impressa.<br />
Para que todas as associações válidas possam ser<br />
encontradas basta digitar um ; após cada resultado<br />
apresentado por <strong>Prolog</strong>.<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 27<br />
Fluxo de Controle Implícito<br />
Para provar questões mais complexas <strong>Prolog</strong> pode<br />
ser obrigado a testar várias vezes a mesma<br />
condicão, instanciando uma mesma variável com<br />
diferentes valores.<br />
A sequência com que os fatos e regras são testados<br />
portanto não é necessariamente linear, e segue um<br />
caminho semelhante a uma árvore.<br />
O processo de retornar para uma condicão e testá-la<br />
novamente é denominado backtracking.<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 28
Exemplos<br />
surf(vitor).<br />
surf(renan).<br />
surf(teco).<br />
skate(vitor).<br />
skate(teco).<br />
moto(renan).<br />
moto(teco).<br />
radical(X):-surf(X),skate(X),moto(X).<br />
?-radical(X).<br />
teco.<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 29<br />
Exemplo<br />
radical(X):-surf(X),skate(X),moto(X).<br />
radical(X)<br />
surf(X) skate(X) moto(X)<br />
X is vitor<br />
X is renan X is teco X is vitor<br />
X is renan<br />
X is teco<br />
X is vitor<br />
x is teco<br />
surftrue<br />
skatefalse skatetrue moto false moto true<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 30
Modificando o Fluxo de Execução<br />
<strong>Prolog</strong> oferece dois comandos que permitem alterar<br />
o fluxo natural de execução.<br />
cut: !<br />
fail<br />
Usado para impedir o backtracking.<br />
Ao ser ultrapassada, não permite retorno.<br />
Faz com que a busca sempre falhe, provocando<br />
backtracking.<br />
Usado em combinação com ! para gerar um not.<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 31<br />
Exemplos<br />
not(P):-<br />
call(P),!,fail;true.<br />
gosta(maria,X):- cobra(X),! , fail; animal(X).<br />
statement:- condition, !, then_part; else_part.<br />
filosofo(X) :-:<br />
intelectual(X),grego(X).<br />
intelectual(platao).<br />
intelectual(socrates).<br />
grego(platao).<br />
grego(socrates).<br />
listar_filosofos:-<br />
write(‘Filosofos: ‘), nl,<br />
filosofo(X),write(X),nl,<br />
fail.<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 32
Igualdade<br />
Em <strong>Prolog</strong> existem quatro operadores que<br />
representam igualdade:<br />
1. X == Y – Relação de identidade. É verdadeiro apenas se<br />
X e Y são idênticos (representam a mesma variável ou o<br />
mesmo símbolo).<br />
2. X = Y - Unificação. É verdadeiro se X é unificável com Y.<br />
3. X =:= Y – Significa “calcule X, calcule Y e teste sua<br />
igualdade”. X e Y devem ser expressões aritméticas.<br />
4. X is Y - Significa ``calcule Y e unifique X com Y''. Y deve<br />
ser uma expressão aritmética.<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 33<br />
Aritmética<br />
O operador is é o mais utilizado em operações<br />
aritméticas, e força a instanciação de variáveis.<br />
Exemplos<br />
?- X is 1+2<br />
X = 3<br />
?-1+2 is 4-14<br />
no<br />
fib(0,1).<br />
fib(1,1).<br />
fib(X,R):- A is X-1, X<br />
B is X-2, X<br />
fib(A,R1), fib(B,R2),<br />
R is R1+R2.<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 34
Listas<br />
<strong>Prolog</strong> suporta uma notação especial para representar listas.<br />
Uma lista genérica tem a seguinte sintaxe:<br />
[elem1, elem2,..., elemN]<br />
Para manipular uma lista pode-se utilizar a notação [H|T] onde<br />
H representa o primeiro elemento da lista e T os demais<br />
elementos.<br />
member(X, [X|T]).<br />
member(X, [H|T]):- member (X, T).<br />
last(X,[X]).<br />
last(X, [H|T]):- last (X, T).<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 35<br />
Predicados da Linguagem<br />
asserta(X)<br />
- adiciona a cláusula X no início do banco<br />
de dados.<br />
assertz(X)<br />
- adiciona a cláusula X no final do banco<br />
de dados.<br />
retract(X) - remove a cláusula X do banco de dados.<br />
call(X) – tenta satisfazer a cláusula X.<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 36
I/O<br />
see(arq<br />
arq) – redireciona o input para o arquivo arq.<br />
seeing(arq<br />
arq) – unifica arq com o input corrente.<br />
seen - fecha o input corrente.<br />
tell(arq<br />
arq) – redireciona o output para o arquivo arq.<br />
telling(arq<br />
arq) – unifica arq com o output corrente.<br />
told - fecha o output corrente.<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 37<br />
I/O<br />
read(Term) – lê o próximo termo (string) do arquivo corrente.<br />
Retorna ‘end_of_file’ se eof.<br />
write(Term) – imprime Term no output corrente.<br />
get0(N) – lê o próximo caracter do input corrente e unifica o seu<br />
código ASCII com N. Retorna –11 se eof.<br />
get(N) – lê o próximo caracter não nulo do input corrente e<br />
unifica o seu código ASCII com N. Retorna –11 se eof.<br />
put(N) – imprime o caracter correspondente ao ASCII N no<br />
output corrente.<br />
nl – imprime um newline.<br />
tab(N) – imprime N espaços.<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 38
Gramáticas de Cláusulas Definidas<br />
Gramáticas de Cláusulas Definidas (definite clause<br />
grammars - DCGs) estendem gramáticas livres de<br />
contexto permitindo o uso de argumentos ou<br />
procedimentos embutidos nas produções (cláusulas).<br />
<strong>Prolog</strong> suporta diretamente a definição de DCGs<br />
através de uma sintaxe especial.<br />
Através deste mecanismo é fácil construir parsers<br />
para qualquer gramática livre de contexto.<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 39<br />
Exemplo<br />
Considera a seguinte gramática:<br />
::= .<br />
::= <br />
::= | <br />
::= a | o<br />
::= menino | menina | gato | cachorro<br />
::= viu | mordeu | dormiu | chamou<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 40
Exemplo<br />
A partir da frase “o cachorro mordeu o gato.”<br />
podemos criar o seguinte grafo:<br />
o cachorro mordeu o gato .<br />
1 2 3 4 5 6 7<br />
Para respresentar um sintagma nominal podemos<br />
usar a regra:<br />
sintagmaNominal(K,L) :-:<br />
artigo(K,M),<br />
substantivo(M,L).<br />
<br />
sintagmaNominal(1,3) :-:<br />
artigo(1,2),<br />
substantivo(2,3).<br />
onde os argumentos indicam os nós do grafo.<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 41<br />
Exemplo<br />
frase(K,L) :-:<br />
sintagmaNominal(K,M), predicado(M,N),<br />
period(N,L).<br />
sintagmaNominal(K,L) :-:<br />
artigo(K,M),<br />
substantivo(M,L).<br />
predicado(K,L) :-:<br />
verbo(K,M), sintagmaNominal(M,L).<br />
predicado(K,L) :-:<br />
verbo(K,L).<br />
artigo(K,L) :-:<br />
o(K,L).<br />
artigo(K,L) :-:<br />
a(K,L).<br />
substantivo(K,L) :-:<br />
menino(K,L).<br />
substantivo(K,L) :-:<br />
menina(K,L).<br />
substantivo(K,L) :-:<br />
gato(K,L).<br />
substantivo(K,L) :-:<br />
cachorro(K,L).<br />
verbo(K,L) :-:<br />
viu(K,L).<br />
verbo(K,L) :-:<br />
mordeu(K,L).<br />
verbo(K,L) :-:<br />
dormiu(K,L).<br />
verbo(K,L) :-:<br />
chamou(K,L).<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 42
Exemplo<br />
o(1,2). cachorro(2,3).<br />
mordeu(3,4). o(4,5).<br />
gato(5,6). ponto(6,7).<br />
?- frase(1,7).<br />
yes<br />
?- frase(X,Y).<br />
X = 1<br />
Y = 7<br />
yes<br />
<br />
<br />
<br />
o cachorro mordeu o gato .<br />
1 2 3 4 5 6 7<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 43<br />
DCG<br />
Para representar uma DCG deve-se definir as<br />
cláusulas usando o operador “--“<br />
-->”.<br />
Os terminais são indicados entre colchetes ( [ ]).<br />
Terminais podem conter argumentos.<br />
Pode-se especificar rotinas a serem executadas<br />
durante a validação de uma cláusula através de<br />
chaves ({ }).<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 44
Exemplo<br />
frase --> > sintagmaNominal, predicado, ['.'].<br />
'].<br />
sintagmaNominal --> > artigo, substantivo.<br />
predicado --> > verbo, sintagmaNominal.<br />
predicado --> > verbo.<br />
artigo --> > [o]; [a].<br />
substantivo --> > [menino] ; [menina] ;<br />
[cachorro] ; [gato].<br />
verbo --> > [viu] ; [chamou] ; [dormiu] ;<br />
[mordeu].<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 45<br />
Exemplo<br />
frase(fr(N,P)) --> > sintagmaNominal(N), predicado(P),<br />
['.'].<br />
sintagmaNominal(sintagN(D,N)) --> > artigo(D),<br />
substantivo(N).<br />
predicado(pred(V,N)) --> > verbo(V),<br />
sintagmaNominal(N).<br />
predicado(pred(V)) --> > verbo(V).<br />
artigo(art(o)) --> > [o].<br />
artigo(art(a)) --> > [a].<br />
substantivo(sub (menino)) --> > [menino].<br />
substantivo(sub (menina)) --> > [menina].<br />
substantivo(sub (gato)) --> > [gato].<br />
substantivo(sub (cachorro)) --> > [cachorro].<br />
verbo(verb(viu)) --> > [viu].<br />
verbo(verb(mordeu)) --> > [mordeu].<br />
verbo(verb(dormiu)) --> > [dormiu].<br />
verbo(verb(chamou)) --> > [chamou].<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 46
Exemplo<br />
?- frase(F, [o,cachorro,mordeu,o,gato,'.'],<br />
[]).<br />
F = fr(sintagN(art(o), sub (cachorro)),<br />
pred(verb(mordeu), sintagN(art(o),<br />
sub(gato))))<br />
yes<br />
?- predicado(F, [mordeu,o,gato], []).<br />
F = pred(verbo(mordeu), sintagN(art(o),<br />
sub(gato)))<br />
yes<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 47<br />
Scanner<br />
::= | .<br />
<br />
::= .<br />
::= ε | .<br />
<br />
getnum(C,N) :-:<br />
digit(C), get0(D), restnum(D,Lc),<br />
name(N,[C|Lc]).<br />
restnum(C,[C|Lc]) :-:<br />
digit(C), get0(D), restnum(D,Lc).<br />
restnum(C,[]).<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 48
Scanner<br />
scan([T|Lt]) :-:<br />
getch(C), gettoken(C, T, D),<br />
restprog(T, D, Lt), !.<br />
getch(C) :-:<br />
get0(C), (endline(C),nl; endfile(C),<br />
nl ; put(C)).<br />
restprog(eop, C, []).<br />
restprog(T,<br />
C, [U|Lt]) :-:<br />
gettoken(C, U, D),<br />
restprog(U, D, Lt).<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 49<br />
Invocando Rotinas<br />
scanp :-:<br />
nl, write('Scan & Parse'), nl, nl,<br />
write('Enter name of source file: '), nl,<br />
getfilename(FileName), nl, see(FileName),<br />
scan(Tokens), seen, write('Scan ok'), nl, !,<br />
write(Tokens), nl, nl, parse(ParseTree,Tokens),<br />
write('Parse ok'), nl, !, write(ParseTree), nl, nl.<br />
getfilename(W) :-:<br />
get0(C), restfilename(C,Cs),<br />
name(W,Cs).<br />
restfilename(C,[C|Cs]) :-:<br />
filechar(C), get0(D),<br />
restfilename(D,Cs).<br />
restfilename(C,[]).<br />
<strong>Linguagens</strong> de Programacão I<br />
mleal@inf.puc-rio.br 50