Linguagens Lógicas - PUC-Rioinf1621/logica.pdf · Em LPs lógicas variáveis geralmente são...

Post on 12-Feb-2019

221 views 0 download

Transcript of Linguagens Lógicas - PUC-Rioinf1621/logica.pdf · Em LPs lógicas variáveis geralmente são...

1

Linguagens de Programacão Imleal@inf.puc-rio.br 1

Linguagens LógicasLinguagens Lógicas

Linguagens de Programacão Imleal@inf.puc-rio.br 2

IntroduçãoIntroduçãoEm LPs imperativas um programa é composto por Em LPs imperativas um programa é composto por uma sequência de comandos que representam as uma sequência de comandos que representam as atividades computacionais que serão executadas. atividades computacionais que serão executadas. O programador deve portanto especificar claramente O programador deve portanto especificar claramente como realizar o processamento desejado, ou seja, como realizar o processamento desejado, ou seja, como é o algoritmo.como é o algoritmo.Em LPs lógicas um programa consiste na definição Em LPs lógicas um programa consiste na definição de relações lógicas que devem ser satisfeitas pela de relações lógicas que devem ser satisfeitas pela solução procurada.solução procurada.A busca por uma solução acontece automaticamente A busca por uma solução acontece automaticamente através de regras de inferência.através de regras de inferência.

2

Linguagens de Programacão Imleal@inf.puc-rio.br 3

IntroduçãoIntrodução

ProgramarProgramar emem umauma LP LP lógicalógica consisteconsiste emem::

DeclararDeclarar fatosfatos primitivosprimitivos sobresobre um um domíniodomínio;;

DefinirDefinir regrasregras queque expressamexpressam relaçõesrelações entreentre ososfatosfatos de um de um domíniodomínio;;

FazerFazer perguntasperguntas sobresobre um um domíniodomínio..

O O processoprocesso de de deduçãodedução atravésatravés do do qualqualencontramencontram--se se respostasrespostas àsàs perguntasperguntas é é executadoexecutado automaticamente peloautomaticamente pelo sistemasistema..

Linguagens de Programacão Imleal@inf.puc-rio.br 4

ExemploExemplo

1.1. Aves botam ovos.Aves botam ovos.

2.2. Mamíferos não botam ovos.Mamíferos não botam ovos.

3.3. Baleias são mamíferos.Baleias são mamíferos.

4.4. Baleias botam ovos?Baleias botam ovos?

Não.Não.

5. Quem bota ovos?5. Quem bota ovos?

Aves.Aves.

3

Linguagens de Programacão Imleal@inf.puc-rio.br 5

FatosFatosUmaUma forma de forma de declarardeclarar um um fatofato comocomo ““umauma baleiabaleia é um é um mamíferomamífero” é:” é:mamiferomamifero ((baleiabaleia).).

Para Para representarrepresentar o o fatofato ““Bruno Bruno gostagosta de Anade Ana” ” podemospodemosescreverescrever::gostar(bruno, ana)gostar(bruno, ana)

RepareRepare queque esteeste fatofato é é diferentediferente de “de “Ana Ana gostagosta de Brunode Bruno”:”:gostar(ana, bruno)gostar(ana, bruno)

Nas expressões acima Nas expressões acima gostargostar éé o predicado do fato, o predicado do fato, representando uma relarepresentando uma relaçção entre os argumentos.ão entre os argumentos.

Linguagens de Programacão Imleal@inf.puc-rio.br 6

FatosFatos

Outros exemplos de fatosOutros exemplos de fatos

campeao(flamengo).campeao(flamengo).

vender(marcelo,carro,carlos).vender(marcelo,carro,carlos).

chuva.chuva.

Esta sintaxe não corresponde a invocação de Esta sintaxe não corresponde a invocação de uma função!!!uma função!!!

4

Linguagens de Programacão Imleal@inf.puc-rio.br 7

RegrasRegras

A declaração de regras (axiomas) em LPs lógicas A declaração de regras (axiomas) em LPs lógicas segue um padrão conhecido como cláusulas de segue um padrão conhecido como cláusulas de Horn:Horn:

HH AA11,A,A22,..., A,..., Ann

se todos os se todos os AAii são verdadeiros, então são verdadeiros, então HH é verdadeiro.é verdadeiro.

Na expressão acima, Na expressão acima, HH é denominado a cabeça da é denominado a cabeça da cláusula e cláusula e AA11,A,A22,..., A,..., An n é o seu corpo.é o seu corpo.

Através de regras podeAtravés de regras pode--se estabelecer relações se estabelecer relações entre fatos.entre fatos.

Linguagens de Programacão Imleal@inf.puc-rio.br 8

ResoluçãoResoluçãoPara descobrir novas relações uma LP lógica utiliza Para descobrir novas relações uma LP lógica utiliza um processo conhecido como resolução. um processo conhecido como resolução. O corpo de uma cláusula é equivalente a sua O corpo de uma cláusula é equivalente a sua cabeça, e ambos podem ser substituídos livremente cabeça, e ambos podem ser substituídos livremente em outras cláusulas para formar novas regras.em outras cláusulas para formar novas regras.

CC A,BA,B

DD CC

DD A,BA,B

Através do processo de resolução uma LP lógica é Através do processo de resolução uma LP lógica é capaz de provar a validade de proposições.capaz de provar a validade de proposições.

5

Linguagens de Programacão Imleal@inf.puc-rio.br 9

Banco de DadosBanco de Dados

O conjunto de fatos e relações contidos O conjunto de fatos e relações contidos em um programa lógico é denominado em um programa lógico é denominado banco de dados, e representa o banco de dados, e representa o conhecimento sobre um ou mais conhecimento sobre um ou mais domínios.domínios.

O objetivo de um programa lógico é O objetivo de um programa lógico é inferir e validar novos fatos ou relações inferir e validar novos fatos ou relações a partir do banco de dados.a partir do banco de dados.

Linguagens de Programacão Imleal@inf.puc-rio.br 10

PrologProlog

Foi desenvolvida no início da década de 70 Foi desenvolvida no início da década de 70 para ser usada na prova de teoremas.para ser usada na prova de teoremas.

Ainda hoje é a mais popular e principal LP Ainda hoje é a mais popular e principal LP lógica.lógica.

É bastante utilizada em sistemas É bastante utilizada em sistemas especialistas.especialistas.

Em Prolog um programa é composto por Em Prolog um programa é composto por fatos e regras.fatos e regras.

6

Linguagens de Programacão Imleal@inf.puc-rio.br 11

Fatos em PrologFatos em Prolog

Fatos em Prolog são representados Fatos em Prolog são representados através de átomos ou estruturas.através de átomos ou estruturas.Átomos são strings que começam Átomos são strings que começam sempre com letra minúscula:sempre com letra minúscula:esta_chovendo.esta_chovendo.

dinheiro.dinheiro.

joao.joao.

Linguagens de Programacão Imleal@inf.puc-rio.br 12

Fatos em PrologFatos em Prolog

Estruturas são átomos seguidos de uma lista Estruturas são átomos seguidos de uma lista de argumentos entre parânteses:de argumentos entre parânteses:

pred (arg1, arg2, ..., argN).pred (arg1, arg2, ..., argN).

onde: onde: predpred -- nome de um predicadonome de um predicadoarg1, ... argNarg1, ... argN -- argumentosargumentosNN -- número de argumentos (aridade)número de argumentos (aridade).. -- final sintático de qualquer cláusula Prologfinal sintático de qualquer cláusula Prolog

7

Linguagens de Programacão Imleal@inf.puc-rio.br 13

Fatos em PrologFatos em Prolog

Os argumentos de uma estrutura podem ser Os argumentos de uma estrutura podem ser átomos, estruturas, variáveis e números.átomos, estruturas, variáveis e números.

Exemplos:Exemplos:caro(diamente).caro(diamente).amigo(joana, patricia).amigo(joana, patricia).arvore_bin(valor1, arvore_bin(valor2, valor3)).arvore_bin(valor1, arvore_bin(valor2, valor3)).quantidade(24).quantidade(24).

Estruturas representam relações entre os Estruturas representam relações entre os argumentos, ou seus predicados.argumentos, ou seus predicados.

Linguagens de Programacão Imleal@inf.puc-rio.br 14

VariáveisVariáveisEm LPs imperativas variáveis são instanciadas Em LPs imperativas variáveis são instanciadas através de operações explícitas de atribuição.através de operações explícitas de atribuição.

Em LPs lógicas variáveis geralmente são Em LPs lógicas variáveis geralmente são instanciadas implicitamente pelo sistema durante o instanciadas implicitamente pelo sistema durante o processo de resolução.processo de resolução.

São usadas basicamente para extrair informações do São usadas basicamente para extrair informações do banco de dados, e para expressar relações entre banco de dados, e para expressar relações entre fatos.fatos.

Variáveis em Prolog são representadas por strings Variáveis em Prolog são representadas por strings que começam com uma letra maiúscula.que começam com uma letra maiúscula.

8

Linguagens de Programacão Imleal@inf.puc-rio.br 15

ExemplosExemplos

offroad(X):offroad(X):-- carro(X),tracao4x4(X), carro(X),tracao4x4(X), suspensaoReforcada(X).suspensaoReforcada(X).

frio(groelandia).frio(groelandia).

??--frio(X).frio(X).

x=groelandia.x=groelandia.

Linguagens de Programacão Imleal@inf.puc-rio.br 16

QuestõesQuestões

QuestõesQuestões sãosão representadosrepresentados porpor fatosfatosprecedidosprecedidos porpor --?. ?.

??--gostar(bruno, ana).gostar(bruno, ana).

InformalmenteInformalmente: Bruno : Bruno gostagosta de Ana?de Ana?

FormalmenteFormalmente: É : É possívelpossível provarprovar a a partirpartir dos dos fatosfatosconhecidosconhecidos pelopelo programaprograma queque a a relaçãorelaçãogostar(bruno, ana)gostar(bruno, ana) é é verdadeiraverdadeira??

9

Linguagens de Programacão Imleal@inf.puc-rio.br 17

ExemplosExemplos

animal (cachorro)animal (cachorro)animal (gato)animal (gato)??--animal(cachorro).animal(cachorro).yesyes??--animal(X)animal(X)X = cachorro;X = cachorro;X = gato;X = gato;yesyes

Linguagens de Programacão Imleal@inf.puc-rio.br 18

UnificaçãoUnificação

Para tentar provar um fato Prolog precisa Para tentar provar um fato Prolog precisa estabelecer a equivalência entre fatos.estabelecer a equivalência entre fatos.

Dois fatos equivalentes são ditos unificáveis.Dois fatos equivalentes são ditos unificáveis.

Dois átomos são unificáveis apenas se são Dois átomos são unificáveis apenas se são idênticos.idênticos.

Duas estruturas são unificáveis se o seu Duas estruturas são unificáveis se o seu predicado é idêntico, e se seus argumentos predicado é idêntico, e se seus argumentos são unificáveis .são unificáveis .

10

Linguagens de Programacão Imleal@inf.puc-rio.br 19

UnificaçãoUnificação

Uma variável é unificável a qualquer coisa.Uma variável é unificável a qualquer coisa.

Durante o processo de resolução, uma Durante o processo de resolução, uma variável é instanciada com um valor que variável é instanciada com um valor que permite a sua unificação com um símbolo permite a sua unificação com um símbolo correspondente de um outro fato.correspondente de um outro fato.

O símbolo O símbolo == em prolog representa unificação.em prolog representa unificação.

Linguagens de Programacão Imleal@inf.puc-rio.br 20

ExemplosExemplosfruta(manga).fruta(manga).??--fruta(X).fruta(X).X = mangaX = manga X foi unificada com X foi unificada com ““mangamanga””

gostar(bruno,ana).gostar(bruno,ana).??--gostar(bruno,X).gostar(bruno,X).X = anaX = ana X foi unificada com X foi unificada com ““anaana””

??--X=sol.X=sol.X=sol X=sol X foi unificada com X foi unificada com ““solsol””

??--sol=sol.sol=sol.yesyes ““solsol”” foi unificado com foi unificado com ““solsol””

11

Linguagens de Programacão Imleal@inf.puc-rio.br 21

Regras em PrologRegras em Prolog

Regras são representadas como cláusulas Regras são representadas como cláusulas de Horn seguindo a sintaxe:de Horn seguindo a sintaxe:pred(X1,...,Xn):pred(X1,...,Xn):--

pred1(X1,...,Xn),...,predn(X1,...,Xn).pred1(X1,...,Xn),...,predn(X1,...,Xn).

se os predicados 1 a n são verdadeiros para se os predicados 1 a n são verdadeiros para as variáveis Xi, então o predicado as variáveis Xi, então o predicado predpred é é verdadeiro para as variáveis Xi.verdadeiro para as variáveis Xi.

A variável representa portanto o símbolo para A variável representa portanto o símbolo para o qual a regra é verdadeira.o qual a regra é verdadeira.

Linguagens de Programacão Imleal@inf.puc-rio.br 22

ExemplosExemplos

pai(joao,joaquim).pai(joao,joaquim).pai(joaquim,manuel).pai(joaquim,manuel).avo(X,Y):avo(X,Y):--pai(Z,Y),pai(X,Z).pai(Z,Y),pai(X,Z).??--avo(joao,Z).avo(joao,Z).Z=manuelZ=manuel??--avo(joao,manuel).avo(joao,manuel).yes.yes.

12

Linguagens de Programacão Imleal@inf.puc-rio.br 23

ConjunçõesConjunções

Conjunções permitem a especificação de questões Conjunções permitem a especificação de questões com múltiplas condições que devem ser satisfeitas com múltiplas condições que devem ser satisfeitas simultaneamente.simultaneamente.

Conjunções são representadas por uma vígula ( ,Conjunções são representadas por uma vígula ( , ).).

Exemplo:Exemplo:

??-- localizacao(X,cozinha), comida(X), gostoso(X).localizacao(X,cozinha), comida(X), gostoso(X).

Existe alguma comida gostosa na cozinha?Existe alguma comida gostosa na cozinha?

Linguagens de Programacão Imleal@inf.puc-rio.br 24

DisjunçõesDisjunções

Disjunções permitem a especificação de questões Disjunções permitem a especificação de questões com múltiplas condições na qual ao menos uma com múltiplas condições na qual ao menos uma delas deve ser satisfeita.delas deve ser satisfeita.

Disjunções são representadas por um pontoDisjunções são representadas por um ponto--ee--vírgula ( vírgula ( ; ; ).).

Exemplos:Exemplos:??--amigos(X,Y); parentes(X,Y).amigos(X,Y); parentes(X,Y).

inverno(X):inverno(X):-- nevando(X); gelado(X).nevando(X); gelado(X).

É inverno se está nevando ou está gelado.É inverno se está nevando ou está gelado.

13

Linguagens de Programacão Imleal@inf.puc-rio.br 25

Fluxo de ControleFluxo de ControleProlog Prolog possuipossui um um fluxofluxo de de controlecontrole implícitoimplícito atravésatravésdo do qualqual buscabusca responder responder umauma questãoquestão..

EsteEste fluxofluxo é é determinísticodeterminístico, , ouou sejaseja segue segue sempresempreumauma mesmamesma ordemordem::

O O bancobanco de dados é de dados é percorridopercorrido sequencialmentesequencialmente nana ordemordememem queque osos fatosfatos\\regrasregras foramforam declaradosdeclarados..

Para Para cadacada predicadopredicado corretocorreto encontradoencontrado, , osos argumentosargumentos sãosãotestadostestados emem ordemordem..

Para Para cadacada regraregra, as , as condiçõescondições sãosão testadastestadas sempresempre dadaesquerdaesquerda parapara a a direitadireita..

Linguagens de Programacão Imleal@inf.puc-rio.br 26

ExemploExemplotropical(caribe). tropical(caribe). (1)(1)tropical(havai).tropical(havai).praia(havai).praia(havai).praia(caribe). praia(caribe). (2)(2)bonito(havai).bonito(havai).bonito(caribe). bonito(caribe). (3)(3)paraiso_tropical(X):paraiso_tropical(X):--tropical(X),praia(X), tropical(X),praia(X), bonito(X).bonito(X).

??--paraiso_tropical(X).paraiso_tropical(X).X=caribe;X=caribe;

X is caribe

true

X is caribe

true

X is caribe

truetropical praia bonito

14

Linguagens de Programacão Imleal@inf.puc-rio.br 27

Fluxo de ControleFluxo de Controle

VariáveisVariáveis sãosão instanciadasinstanciadas implicitamenteimplicitamente com com valoresvalores queque permitempermitem a a unificaçãounificação dada estruturaestrutura..

AssimAssim queque umauma associaçãoassociação válidaválida for for encontradaencontrada, , ososvaloresvalores com com os quaisos quais as as variáveisvariáveis foramforam instanciadasinstanciadassão impressossão impressos..

ApenasApenas a a primeiraprimeira associaçãoassociação válidaválida é é impressaimpressa..

Para Para queque todastodas as as associaçõesassociações válidasválidas possampossam ser ser encontradasencontradas basta digitarbasta digitar um ; um ; apósapós cadacada resultadoresultadoapresentadoapresentado porpor Prolog.Prolog.

Linguagens de Programacão Imleal@inf.puc-rio.br 28

Fluxo de Controle ImplícitoFluxo de Controle Implícito

Para provar questões mais complexas Prolog pode Para provar questões mais complexas Prolog pode ser obrigado a testar várias vezes a mesma ser obrigado a testar várias vezes a mesma condicão, instanciando uma mesma variável com condicão, instanciando uma mesma variável com diferentes valores.diferentes valores.

A sequência com que os fatos e regras são testados A sequência com que os fatos e regras são testados portanto não é necessariamente linear, e segue um portanto não é necessariamente linear, e segue um caminho semelhante a uma árvore.caminho semelhante a uma árvore.

O processo de retornar para uma condicão e testáO processo de retornar para uma condicão e testá--la la novamente é denominado backtracking.novamente é denominado backtracking.

15

Linguagens de Programacão Imleal@inf.puc-rio.br 29

ExemplosExemplossurf(vitor).surf(vitor).surf(renan).surf(renan).surf(teco).surf(teco).skate(vitor).skate(vitor).skate(teco).skate(teco).moto(renan).moto(renan).moto(teco).moto(teco).radical(X):radical(X):--surf(X),skate(X),moto(X).surf(X),skate(X),moto(X).??--radical(X).radical(X).teco.teco.

Linguagens de Programacão Imleal@inf.puc-rio.br 30

ExemploExemplo

radical(X)

surf(X) skate(X) moto(X)

X is vitor x is tecoX is tecoX is renan X is teco X is vitor

radical(X):radical(X):--surf(X),skate(X),moto(X).surf(X),skate(X),moto(X).

moto falsesurf true skate false

X is renan

skate true

X is vitor

moto true

16

Linguagens de Programacão Imleal@inf.puc-rio.br 31

Modificando o Fluxo de ExecuçãoModificando o Fluxo de Execução

Prolog oferece dois comandos que permitem alterar Prolog oferece dois comandos que permitem alterar o fluxo natural de execução.o fluxo natural de execução.

cut: !cut: !UsadoUsado parapara impedirimpedir o backtracking.o backtracking.

AoAo ser ser ultrapassadaultrapassada, , nãonão permitepermite retornoretorno..

fail fail Faz com que a busca sempre falhe, provocando Faz com que a busca sempre falhe, provocando backtracking.backtracking.

Usado em combinação com Usado em combinação com !! para gerar um para gerar um notnot..

Linguagens de Programacão Imleal@inf.puc-rio.br 32

ExemplosExemplosnot(P):not(P):-- call(P),!,fail;true.call(P),!,fail;true.

gosta(maria,X):gosta(maria,X):-- cobra(X),! , fail; animal(X).cobra(X),! , fail; animal(X).

statement:statement:-- condition, !, then_part; else_part.condition, !, then_part; else_part.

filosofo(X) :filosofo(X) :-- intelectual(X),grego(X).intelectual(X),grego(X).intelectual(platao).intelectual(platao).intelectual(socrates).intelectual(socrates).grego(platao).grego(platao).grego(socrates).grego(socrates).listar_filosofos:listar_filosofos:--

write(‘Filosofos: ‘), nl,write(‘Filosofos: ‘), nl,filosofo(X),write(X),nl,filosofo(X),write(X),nl,fail.fail.

17

Linguagens de Programacão Imleal@inf.puc-rio.br 33

IgualdadeIgualdade

Em Prolog existem quatro operadores que Em Prolog existem quatro operadores que representam igualdade:representam igualdade:

1.1. X == YX == Y –– Relação de identidade. É verdadeiro apenas se Relação de identidade. É verdadeiro apenas se X e Y são idênticos (representam a mesma variável ou o X e Y são idênticos (representam a mesma variável ou o mesmo símbolo).mesmo símbolo).

2.2. X = YX = Y -- Unificação. É verdadeiro se X é unificável com Y.Unificação. É verdadeiro se X é unificável com Y.

3.3. X =:= YX =:= Y –– Significa “calcule X, calcule Y e teste sua Significa “calcule X, calcule Y e teste sua igualdade”. X e Y devem ser expressões aritméticas. igualdade”. X e Y devem ser expressões aritméticas.

4.4. X is YX is Y -- Significa ``calcule Y e unifique X com Y''. Y deve Significa ``calcule Y e unifique X com Y''. Y deve ser uma expressão aritmética. ser uma expressão aritmética.

Linguagens de Programacão Imleal@inf.puc-rio.br 34

AritméticaAritméticaO operador O operador isis é o mais utilizado em operações é o mais utilizado em operações aritméticas, e força a instanciação de variáveis.aritméticas, e força a instanciação de variáveis.

ExemplosExemplos??-- X is 1+2X is 1+2X = 3X = 3

??--1+2 is 41+2 is 4--11nono

fib(0,1).fib(0,1).fib(1,1).fib(1,1).fib(X,R):fib(X,R):-- A is XA is X--1, B is X1, B is X--2, fib(A,R1), fib(B,R2), 2, fib(A,R1), fib(B,R2),

R is R1+R2.R is R1+R2.

18

Linguagens de Programacão Imleal@inf.puc-rio.br 35

ListasListasProlog suporta uma notação especial para representar listas. Prolog suporta uma notação especial para representar listas. Uma lista genérica tem a seguinte sintaxe:Uma lista genérica tem a seguinte sintaxe:

[elem1, elem2,..., elemN][elem1, elem2,..., elemN]

Para manipular uma lista podePara manipular uma lista pode--se utilizar a notação [H|T] onde se utilizar a notação [H|T] onde H representa o primeiro elemento da lista e T os demais H representa o primeiro elemento da lista e T os demais elementos.elementos.member(X, [X|T]).member(X, [X|T]).member(X, [H|T]):member(X, [H|T]):-- member (X, T).member (X, T).

last(X,[X]).last(X,[X]).last(X, [H|T]):last(X, [H|T]):-- last (X, T). last (X, T).

Linguagens de Programacão Imleal@inf.puc-rio.br 36

PredicadosPredicados dada LinguagemLinguagem

assertaasserta(X) (X) -- adicionaadiciona a a cláusulacláusula X no X no inícioinício do do bancobancode dados.de dados.

assertzassertz(X) (X) -- adicionaadiciona a a cláusulacláusula X no final do X no final do bancobancode dados.de dados.

retract(X) retract(X) -- remove a remove a cláusulacláusula X do X do bancobanco de dados. de dados.

call(X) call(X) –– tentatenta satisfazersatisfazer a a cláusulacláusula X.X.

19

Linguagens de Programacão Imleal@inf.puc-rio.br 37

I/OI/O

see(see(arqarq) ) –– redirecionaredireciona o input o input parapara o o arquivoarquivo arqarq..

seeing(seeing(arqarq) ) –– unificaunifica arqarq com o input com o input correntecorrente..

seen seen -- fechafecha o input o input correntecorrente..

tell(tell(arqarq) ) –– redirecionaredireciona o output o output parapara o o arquivoarquivo arqarq..

telling(telling(arqarq) ) –– unificaunifica arqarq com o output com o output correntecorrente..

told told -- fechafecha o output o output correntecorrente..

Linguagens de Programacão Imleal@inf.puc-rio.br 38

I/OI/Oread(Term) read(Term) –– lê o próximo termo (string) do arquivo corrente. lê o próximo termo (string) do arquivo corrente. Retorna ‘end_of_file’ se eof.Retorna ‘end_of_file’ se eof.

write(Term) write(Term) –– imprime Term no output corrente.imprime Term no output corrente.

get0(N) get0(N) –– lê o próximo caracter do input corrente e unifica o seu lê o próximo caracter do input corrente e unifica o seu código ASCII com N. Retorna código ASCII com N. Retorna ––1 se eof.1 se eof.

get(N) get(N) –– lê o próximo caracter não nulo do input corrente e lê o próximo caracter não nulo do input corrente e unifica o seu código ASCII com N. Retorna unifica o seu código ASCII com N. Retorna ––1 se eof.1 se eof.

put(N) put(N) –– imprime o caracter correspondente ao ASCII N no imprime o caracter correspondente ao ASCII N no output corrente.output corrente.

nl nl –– imprime um imprime um newlinenewline..

tab(N) tab(N) –– imprime N espaços.imprime N espaços.

20

Linguagens de Programacão Imleal@inf.puc-rio.br 39

Gramáticas de Cláusulas DefinidasGramáticas de Cláusulas Definidas

Gramáticas de Cláusulas Definidas (definite clause Gramáticas de Cláusulas Definidas (definite clause grammars grammars -- DCGs) estendem gramáticas livres de DCGs) estendem gramáticas livres de contexto permitindo o uso de argumentos ou contexto permitindo o uso de argumentos ou procedimentos embutidos nas produções (cláusulas).procedimentos embutidos nas produções (cláusulas).

Prolog suporta diretamente a definição de DCGs Prolog suporta diretamente a definição de DCGs através de uma sintaxe especial.através de uma sintaxe especial.

Através deste mecanismo é fácil construir parsers Através deste mecanismo é fácil construir parsers para qualquer gramática livre de contexto.para qualquer gramática livre de contexto.

Linguagens de Programacão Imleal@inf.puc-rio.br 40

ExemploExemplo

Considera a seguinte gramática: Considera a seguinte gramática: <frase> ::= <sintagma nominal > <predicado> <frase> ::= <sintagma nominal > <predicado> ..

<sintagma nominal > ::= <artigo> <substantivo><sintagma nominal > ::= <artigo> <substantivo>

<predicado> ::= <verbo> | <verbo> <sintagma nominal ><predicado> ::= <verbo> | <verbo> <sintagma nominal >

<artigo> ::= <artigo> ::= a a | | oo

<substantivo> ::= <substantivo> ::= menino menino | | menina menina | | gato gato | | cachorrocachorro

<verbo> ::= <verbo> ::= viu viu | | mordeu mordeu | | dormiu dormiu | | chamouchamou

21

Linguagens de Programacão Imleal@inf.puc-rio.br 41

ExemploExemploA partir da frase “o cachorro mordeu o gato.” A partir da frase “o cachorro mordeu o gato.” podemos criar o seguinte grafo:podemos criar o seguinte grafo:

Para respresentar um sintagma nominal podemos Para respresentar um sintagma nominal podemos usar a regra:usar a regra:sintagmaNominal(K,L) :sintagmaNominal(K,L) :-- artigo(K,M), artigo(K,M), substantivo(M,L).substantivo(M,L).

sintagmaNominal(1,3) :sintagmaNominal(1,3) :-- artigo(1,2), artigo(1,2), substantivo(2,3).substantivo(2,3).

onde os argumentos indicam os nós do grafo.onde os argumentos indicam os nós do grafo.

1 2 3 4 5 6 7o cachorro mordeu o gato .

Linguagens de Programacão Imleal@inf.puc-rio.br 42

ExemploExemplofrase(K,L) :frase(K,L) :-- sintagmaNominal(K,M), predicado(M,N), sintagmaNominal(K,M), predicado(M,N),

period(N,L).period(N,L).sintagmaNominal(K,L) :sintagmaNominal(K,L) :-- artigo(K,M), artigo(K,M),

substantivo(M,L).substantivo(M,L).predicado(K,L) :predicado(K,L) :-- verbo(K,M), sintagmaNominal(M,L).verbo(K,M), sintagmaNominal(M,L).predicado(K,L) :predicado(K,L) :-- verbo(K,L).verbo(K,L).artigo(K,L) :artigo(K,L) :-- o(K,L).o(K,L).artigo(K,L) :artigo(K,L) :-- a(K,L).a(K,L).substantivo(K,L) :substantivo(K,L) :-- menino(K,L).menino(K,L).substantivo(K,L) :substantivo(K,L) :-- menina(K,L).menina(K,L).substantivo(K,L) :substantivo(K,L) :-- gato(K,L).gato(K,L).substantivo(K,L) :substantivo(K,L) :-- cachorro(K,L).cachorro(K,L).verbo(K,L) :verbo(K,L) :-- viu(K,L).viu(K,L).verbo(K,L) :verbo(K,L) :-- mordeu(K,L).mordeu(K,L).verbo(K,L) :verbo(K,L) :-- dormiu(K,L).dormiu(K,L).verbo(K,L) :verbo(K,L) :-- chamou(K,L).chamou(K,L).

22

Linguagens de Programacão Imleal@inf.puc-rio.br 43

ExemploExemplo

1 2 3 4 5 6 7o cachorro mordeu o gato .

<frase>

<sintagma nominal > <sintagma nominal >

<predicado>

o(1,2). cachorro(2,3).o(1,2). cachorro(2,3).mordeu(3,4). o(4,5).mordeu(3,4). o(4,5).gato(5,6). ponto(6,7).gato(5,6). ponto(6,7).??-- frase(1,7).frase(1,7).yesyes??-- frase(X,Y).frase(X,Y).X = 1X = 1Y = 7Y = 7yesyes

Linguagens de Programacão Imleal@inf.puc-rio.br 44

DCGDCG

Para representar uma DCG devePara representar uma DCG deve--se definir as se definir as cláusulas usando o operador “cláusulas usando o operador “---->”.>”.

Os terminais são indicados entre colchetes ( [ ]).Os terminais são indicados entre colchetes ( [ ]).

Terminais podem conter argumentos.Terminais podem conter argumentos.

PodePode--se especificar rotinas a serem executadas se especificar rotinas a serem executadas durante a validação de uma cláusula através de durante a validação de uma cláusula através de chaves ({ }).chaves ({ }).

23

Linguagens de Programacão Imleal@inf.puc-rio.br 45

ExemploExemplofrase frase ----> sintagmaNominal, predicado, ['> sintagmaNominal, predicado, ['..'].'].sintagmaNominal sintagmaNominal ----> artigo, substantivo.> artigo, substantivo.predicado predicado ----> verbo, sintagmaNominal.> verbo, sintagmaNominal.predicado predicado ----> verbo.> verbo.artigo artigo ----> [o]; [a].> [o]; [a].substantivo substantivo ----> [menino] ; [menina] ; > [menino] ; [menina] ; [cachorro] ; [gato].[cachorro] ; [gato].

verbo verbo ----> [viu] ; [chamou] ; [dormiu] ; > [viu] ; [chamou] ; [dormiu] ; [mordeu].[mordeu].

Linguagens de Programacão Imleal@inf.puc-rio.br 46

ExemploExemplofrase(fr(N,P)) frase(fr(N,P)) ----> sintagmaNominal(N), predicado(P), > sintagmaNominal(N), predicado(P),

['.'].['.'].sintagmaNominal(sintagN(D,N)) sintagmaNominal(sintagN(D,N)) ----> artigo(D), > artigo(D),

substantivo(N).substantivo(N).predicado(pred(V,N)) predicado(pred(V,N)) ----> verbo(V), > verbo(V),

sintagmaNominal(N).sintagmaNominal(N).predicado(pred(V)) predicado(pred(V)) ----> verbo(V).> verbo(V).artigo(art(o)) artigo(art(o)) ----> [o].> [o].artigo(art(a)) artigo(art(a)) ----> [a].> [a].substantivo(sub (menino)) substantivo(sub (menino)) ----> [menino].> [menino].substantivo(sub (menina)) substantivo(sub (menina)) ----> [menina].> [menina].substantivo(sub (gato)) substantivo(sub (gato)) ----> [gato].> [gato].substantivo(sub (cachorro)) substantivo(sub (cachorro)) ----> [cachorro].> [cachorro].verbo(verb(viu)) verbo(verb(viu)) ----> [viu].> [viu].verbo(verb(mordeu)) verbo(verb(mordeu)) ----> [mordeu].> [mordeu].verbo(verb(dormiu)) verbo(verb(dormiu)) ----> [dormiu].> [dormiu].verbo(verb(chamou)) verbo(verb(chamou)) ----> [chamou].> [chamou].

24

Linguagens de Programacão Imleal@inf.puc-rio.br 47

ExemploExemplo

??-- frase(F, [o,cachorro,mordeu,o,gato,'.'], frase(F, [o,cachorro,mordeu,o,gato,'.'], []).[]).

F = fr(sintagN(art(o), sub (cachorro)),F = fr(sintagN(art(o), sub (cachorro)),pred(verb(mordeu), sintagN(art(o), pred(verb(mordeu), sintagN(art(o), sub(gato))))sub(gato))))

yesyes

??-- predicado(F, [mordeu,o,gato], []).predicado(F, [mordeu,o,gato], []).F = pred(verbo(mordeu), sintagN(art(o), F = pred(verbo(mordeu), sintagN(art(o), sub(gato)))sub(gato)))

yesyes

Linguagens de Programacão Imleal@inf.puc-rio.br 48

ScannerScanner

<num> ::= <digito> | <digito><num><num> ::= <digito> | <digito><num>..

<num> ::= <digito> <restnum><num> ::= <digito> <restnum>..<restnum> ::= <restnum> ::= εε | <digito><num>| <digito><num>..

getnum(C,N) :getnum(C,N) :-- digit(C), get0(D), restnum(D,Lc),digit(C), get0(D), restnum(D,Lc),name(N,[C|Lc]).name(N,[C|Lc]).

restnum(C,[C|Lc]) :restnum(C,[C|Lc]) :-- digit(C), get0(D), restnum(D,Lc).digit(C), get0(D), restnum(D,Lc).restnum(C,[]).restnum(C,[]).

25

Linguagens de Programacão Imleal@inf.puc-rio.br 49

ScannerScanner

scan([T|Lt]) :scan([T|Lt]) :-- getch(C), gettoken(C, T, D), getch(C), gettoken(C, T, D), restprog(T, D, Lt), !.restprog(T, D, Lt), !.

getch(C) :getch(C) :-- get0(C), (endline(C),nl; endfile(C), get0(C), (endline(C),nl; endfile(C), nl ; put(C)).nl ; put(C)).

restprog(eop, C, []). restprog(eop, C, []). restprog(T, C, [U|Lt]) :restprog(T, C, [U|Lt]) :-- gettoken(C, U, D), gettoken(C, U, D),

restprog(U, D, Lt).restprog(U, D, Lt).

Linguagens de Programacão Imleal@inf.puc-rio.br 50

Invocando RotinasInvocando Rotinas

scanp :scanp :-- nl, write('Scan & Parse'), nl, nl, nl, write('Scan & Parse'), nl, nl, write('Enter name of source file: '), nl, write('Enter name of source file: '), nl, getfilename(FileName), nl, see(FileName), getfilename(FileName), nl, see(FileName), scan(Tokens), seen, write('Scan ok'), nl, !, scan(Tokens), seen, write('Scan ok'), nl, !, write(Tokens), nl, nl, parse(ParseTree,Tokens), write(Tokens), nl, nl, parse(ParseTree,Tokens), write('Parse ok'), nl, !, write(ParseTree), nl, nl.write('Parse ok'), nl, !, write(ParseTree), nl, nl.

getfilename(W) :getfilename(W) :-- get0(C), restfilename(C,Cs), get0(C), restfilename(C,Cs), name(W,Cs).name(W,Cs).

restfilename(C,[C|Cs]) :restfilename(C,[C|Cs]) :-- filechar(C), get0(D), filechar(C), get0(D), restfilename(D,Cs).restfilename(D,Cs).

restfilename(C,[]).restfilename(C,[]).