29.01.2014 Views

Linguagens Lógicas & Prolog - PUC-Rio

Linguagens Lógicas & Prolog - PUC-Rio

Linguagens Lógicas & Prolog - PUC-Rio

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!