linguagens lógicas - puc-rioinf1621/logica.pdf · em lps lógicas variáveis geralmente são...

25
Linguagens de Programacão I [email protected] 1 Linguagens Lógicas Linguagens Lógicas Linguagens de Programacão I [email protected] 2 Introdução Introdução Em 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.

Upload: ngodung

Post on 12-Feb-2019

221 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Linguagens Lógicas - PUC-Rioinf1621/logica.pdf · Em LPs lógicas variáveis geralmente são instanciadas implicitamente pelo sistema durante o processo de resolução. São usadas

1

Linguagens de Programacão [email protected] 1

Linguagens LógicasLinguagens Lógicas

Linguagens de Programacão [email protected] 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.

Page 2: Linguagens Lógicas - PUC-Rioinf1621/logica.pdf · Em LPs lógicas variáveis geralmente são instanciadas implicitamente pelo sistema durante o processo de resolução. São usadas

2

Linguagens de Programacão [email protected] 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 [email protected] 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.

Page 3: Linguagens Lógicas - PUC-Rioinf1621/logica.pdf · Em LPs lógicas variáveis geralmente são instanciadas implicitamente pelo sistema durante o processo de resolução. São usadas

3

Linguagens de Programacão [email protected] 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 [email protected] 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!!!

Page 4: Linguagens Lógicas - PUC-Rioinf1621/logica.pdf · Em LPs lógicas variáveis geralmente são instanciadas implicitamente pelo sistema durante o processo de resolução. São usadas

4

Linguagens de Programacão [email protected] 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 [email protected] 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.

Page 5: Linguagens Lógicas - PUC-Rioinf1621/logica.pdf · Em LPs lógicas variáveis geralmente são instanciadas implicitamente pelo sistema durante o processo de resolução. São usadas

5

Linguagens de Programacão [email protected] 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 [email protected] 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.

Page 6: Linguagens Lógicas - PUC-Rioinf1621/logica.pdf · Em LPs lógicas variáveis geralmente são instanciadas implicitamente pelo sistema durante o processo de resolução. São usadas

6

Linguagens de Programacão [email protected] 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 [email protected] 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

Page 7: Linguagens Lógicas - PUC-Rioinf1621/logica.pdf · Em LPs lógicas variáveis geralmente são instanciadas implicitamente pelo sistema durante o processo de resolução. São usadas

7

Linguagens de Programacão [email protected] 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 [email protected] 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.

Page 8: Linguagens Lógicas - PUC-Rioinf1621/logica.pdf · Em LPs lógicas variáveis geralmente são instanciadas implicitamente pelo sistema durante o processo de resolução. São usadas

8

Linguagens de Programacão [email protected] 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 [email protected] 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??

Page 9: Linguagens Lógicas - PUC-Rioinf1621/logica.pdf · Em LPs lógicas variáveis geralmente são instanciadas implicitamente pelo sistema durante o processo de resolução. São usadas

9

Linguagens de Programacão [email protected] 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 [email protected] 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 .

Page 10: Linguagens Lógicas - PUC-Rioinf1621/logica.pdf · Em LPs lógicas variáveis geralmente são instanciadas implicitamente pelo sistema durante o processo de resolução. São usadas

10

Linguagens de Programacão [email protected] 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 [email protected] 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””

Page 11: Linguagens Lógicas - PUC-Rioinf1621/logica.pdf · Em LPs lógicas variáveis geralmente são instanciadas implicitamente pelo sistema durante o processo de resolução. São usadas

11

Linguagens de Programacão [email protected] 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 [email protected] 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.

Page 12: Linguagens Lógicas - PUC-Rioinf1621/logica.pdf · Em LPs lógicas variáveis geralmente são instanciadas implicitamente pelo sistema durante o processo de resolução. São usadas

12

Linguagens de Programacão [email protected] 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 [email protected] 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.

Page 13: Linguagens Lógicas - PUC-Rioinf1621/logica.pdf · Em LPs lógicas variáveis geralmente são instanciadas implicitamente pelo sistema durante o processo de resolução. São usadas

13

Linguagens de Programacão [email protected] 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 [email protected] 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

Page 14: Linguagens Lógicas - PUC-Rioinf1621/logica.pdf · Em LPs lógicas variáveis geralmente são instanciadas implicitamente pelo sistema durante o processo de resolução. São usadas

14

Linguagens de Programacão [email protected] 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 [email protected] 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.

Page 15: Linguagens Lógicas - PUC-Rioinf1621/logica.pdf · Em LPs lógicas variáveis geralmente são instanciadas implicitamente pelo sistema durante o processo de resolução. São usadas

15

Linguagens de Programacão [email protected] 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 [email protected] 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

Page 16: Linguagens Lógicas - PUC-Rioinf1621/logica.pdf · Em LPs lógicas variáveis geralmente são instanciadas implicitamente pelo sistema durante o processo de resolução. São usadas

16

Linguagens de Programacão [email protected] 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 [email protected] 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.

Page 17: Linguagens Lógicas - PUC-Rioinf1621/logica.pdf · Em LPs lógicas variáveis geralmente são instanciadas implicitamente pelo sistema durante o processo de resolução. São usadas

17

Linguagens de Programacão [email protected] 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 [email protected] 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.

Page 18: Linguagens Lógicas - PUC-Rioinf1621/logica.pdf · Em LPs lógicas variáveis geralmente são instanciadas implicitamente pelo sistema durante o processo de resolução. São usadas

18

Linguagens de Programacão [email protected] 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 [email protected] 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.

Page 19: Linguagens Lógicas - PUC-Rioinf1621/logica.pdf · Em LPs lógicas variáveis geralmente são instanciadas implicitamente pelo sistema durante o processo de resolução. São usadas

19

Linguagens de Programacão [email protected] 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 [email protected] 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.

Page 20: Linguagens Lógicas - PUC-Rioinf1621/logica.pdf · Em LPs lógicas variáveis geralmente são instanciadas implicitamente pelo sistema durante o processo de resolução. São usadas

20

Linguagens de Programacão [email protected] 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 [email protected] 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

Page 21: Linguagens Lógicas - PUC-Rioinf1621/logica.pdf · Em LPs lógicas variáveis geralmente são instanciadas implicitamente pelo sistema durante o processo de resolução. São usadas

21

Linguagens de Programacão [email protected] 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 [email protected] 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).

Page 22: Linguagens Lógicas - PUC-Rioinf1621/logica.pdf · Em LPs lógicas variáveis geralmente são instanciadas implicitamente pelo sistema durante o processo de resolução. São usadas

22

Linguagens de Programacão [email protected] 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 [email protected] 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 ({ }).

Page 23: Linguagens Lógicas - PUC-Rioinf1621/logica.pdf · Em LPs lógicas variáveis geralmente são instanciadas implicitamente pelo sistema durante o processo de resolução. São usadas

23

Linguagens de Programacão [email protected] 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 [email protected] 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].

Page 24: Linguagens Lógicas - PUC-Rioinf1621/logica.pdf · Em LPs lógicas variáveis geralmente são instanciadas implicitamente pelo sistema durante o processo de resolução. São usadas

24

Linguagens de Programacão [email protected] 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 [email protected] 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,[]).

Page 25: Linguagens Lógicas - PUC-Rioinf1621/logica.pdf · Em LPs lógicas variáveis geralmente são instanciadas implicitamente pelo sistema durante o processo de resolução. São usadas

25

Linguagens de Programacão [email protected] 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 [email protected] 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,[]).