1. Programação em LógicaProgramação em Lógica
MatemáticaMatemática
PrologProlog
– 04 –– 04 –
Inteligência ArtificialInteligência Artificial
Fábio M. PereiraFábio M. Pereira
Baseado emBaseado em
Amzi! inc. – www.amzi.comAmzi! inc. – www.amzi.com
3. RegrasRegras
►Um predicado é definido por cláusulas, queUm predicado é definido por cláusulas, que
podem ser fatos ou regraspodem ser fatos ou regras
►Uma regra não é nada mais que umaUma regra não é nada mais que uma
consulta armazenadaconsulta armazenada
►A sua sintaxe éA sua sintaxe é
cabeça :- corpo.cabeça :- corpo.
cabeçacabeça – uma definição do predicado (da mesma– uma definição do predicado (da mesma
forma como um fatoforma como um fato
:-:- – o símbolo de– o símbolo de pescoçopescoço, as vezes lido como, as vezes lido como
“se”“se”
corpocorpo – um ou mais objetivos (uma consulta)– um ou mais objetivos (uma consulta)
4. Exemplo (1)Exemplo (1)
► Uma consulta que encontra onde as coisasUma consulta que encontra onde as coisas
comestíveis estão pode ser armazenada como umacomestíveis estão pode ser armazenada como uma
regra com o predicado de nomeregra com o predicado de nome local_comida/2local_comida/2
local_comida(X,Y) :- local(X,Y), comestivel(X).local_comida(X,Y) :- local(X,Y), comestivel(X).
Existe algum X para comer na sala Y se X está localizadoExiste algum X para comer na sala Y se X está localizado
em Y e X é comestívelem Y e X é comestível
► Utilizando ...Utilizando ...
?-?- local_comida(X, cozinha).local_comida(X, cozinha).
X = maçã ;X = maçã ;
X = biscoito ;X = biscoito ;
NoNo
?-?- local_comida(Comida, ‘sala de jantar’).local_comida(Comida, ‘sala de jantar’).
NoNo
6. Múltiplas CláusulasMúltiplas Cláusulas
► Da mesma forma que podemos ter múltiplos fatosDa mesma forma que podemos ter múltiplos fatos
definindo um predicado, também podemos terdefinindo um predicado, também podemos ter
múltiplas regrasmúltiplas regras
► Se quisermos oSe quisermos o brócolisbrócolis incluído emincluído em local_comida/2local_comida/2
local_comida(X,Y) :- local(X,Y), comestivel(X).local_comida(X,Y) :- local(X,Y), comestivel(X).
local_comida(X,Y) :- local(X,Y), gosto_ruim(X).local_comida(X,Y) :- local(X,Y), gosto_ruim(X).
► Agora ...Agora ...
?-?- local_comida(X, cozinha).local_comida(X, cozinha).
X = maçã ;X = maçã ;
X = biscoito ;X = biscoito ;
X = brócolis ;X = brócolis ;
NoNo
7. Como Regras FuncionamComo Regras Funcionam
► Com regras, Prolog unifica o objetivo padrão com aCom regras, Prolog unifica o objetivo padrão com a
cabeça da cláusulacabeça da cláusula
► Se a unificação é bem sucedida, então Prolog iniciaSe a unificação é bem sucedida, então Prolog inicia
uma nova consulta usando os objetivos do corpo dauma nova consulta usando os objetivos do corpo da
cláusulacláusula
► Regras, em seu efeito, levam a múltiplos níveis deRegras, em seu efeito, levam a múltiplos níveis de
consultasconsultas
O primeiro nível é composto do objetivo originalO primeiro nível é composto do objetivo original
O próximo nível é uma nova consulta composta deO próximo nível é uma nova consulta composta de
objetivos encontrados no corpo da cláusula do primeiroobjetivos encontrados no corpo da cláusula do primeiro
nívelnível
Cada nível pode criar níveis mais profundosCada nível pode criar níveis mais profundos
Teoricamente, isto pode continuar indefinidamente, naTeoricamente, isto pode continuar indefinidamente, na
prática, continua até o limite de memória disponívelprática, continua até o limite de memória disponível
8. Controle de Fluxo com RegrasControle de Fluxo com Regras
► Note como o backtracking a partir do segundoNote como o backtracking a partir do segundo
objetivo do primeiro nível agora leva ao segundoobjetivo do primeiro nível agora leva ao segundo
nívelnível
► Neste exemplo, o objetivo central do primeiro nívelNeste exemplo, o objetivo central do primeiro nível
é bem sucedido ou falha se o seu corpo é bemé bem sucedido ou falha se o seu corpo é bem
sucedido ou falhasucedido ou falha
10. Usando Regras (1)Usando Regras (1)
► Através do uso de regras, podemos solucionar oAtravés do uso de regras, podemos solucionar o
problema das portas com um único caminhoproblema das portas com um único caminho
► Podemos definir um novo predicado dePodemos definir um novo predicado de doisdois
caminhoscaminhos, com duas cláusulas, chamado, com duas cláusulas, chamado conexao/2conexao/2
conexao(X,Y):- porta(X,Y).conexao(X,Y):- porta(X,Y).
conexao(X,Y):- porta(Y,X).conexao(X,Y):- porta(Y,X).
A sala X está conectada à sala Y se existe uma porta deA sala X está conectada à sala Y se existe uma porta de
X a Y,X a Y, ouou se existe uma porta de Y a Xse existe uma porta de Y a X
?-?- conexao(cozinha, escritório).conexao(cozinha, escritório).
YesYes
?-?- conexao(escritório, cozinha).conexao(escritório, cozinha).
YesYes
11. Usando Regras (2)Usando Regras (2)
► Podemos agora listar todas as conexões (o dobro doPodemos agora listar todas as conexões (o dobro do
número de portas) com uma consulta geralnúmero de portas) com uma consulta geral
?-?- conexao(X,Y).conexao(X,Y).
X = escritórioX = escritório
Y = saguão ;Y = saguão ;
X = cozinhaX = cozinha
Y = escritório ;Y = escritório ;
......
X = saguãoX = saguão
Y = escritório ;Y = escritório ;
X = escritórioX = escritório
Y = cozinha ;Y = cozinha ;
......
12. Nani Search (1)Nani Search (1)
► Podemos agora acrescentar novas regras a NaniPodemos agora acrescentar novas regras a Nani
SearchSearch
► olhar/0olhar/0 – irá informar ao jogador onde ele/ela está,– irá informar ao jogador onde ele/ela está,
quais objetos existem na sala, e quais as salasquais objetos existem na sala, e quais as salas
adjacentesadjacentes
► Iniciaremos comIniciaremos com lista_objetos/1lista_objetos/1, que lista todos os, que lista todos os
objetos em uma salaobjetos em uma sala
lista_objetos(Lugar):- local(X, Lugar), tab(2), write(X), nl,lista_objetos(Lugar):- local(X, Lugar), tab(2), write(X), nl,
fail.fail.
Agora podemos usarAgora podemos usar
?-?- lista_objetos(cozinha).lista_objetos(cozinha).
maçãmaçã
brócolisbrócolis
biscoitobiscoito
NoNo
13. Nani Search (2)Nani Search (2)
► Existe um pequeno problema comExiste um pequeno problema com lista_objetos/1lista_objetos/1
Ela nos dá a lista, mas sempre falhaEla nos dá a lista, mas sempre falha
Tudo bem, se a chamamos diretamente, mas não permiteTudo bem, se a chamamos diretamente, mas não permite
o uso em conjunção com outras regras que a seguem (ao uso em conjunção com outras regras que a seguem (a
direita do diagrama)direita do diagrama)
► Solucionaremos este problema adicionando umaSolucionaremos este problema adicionando uma
segunda cláusulasegunda cláusula lista_objetos/1lista_objetos/1 que sempre é bemque sempre é bem
sucedidasucedida
lista_objetos(Lugar):- local(X, Lugar), tab(2), write(X), nl,lista_objetos(Lugar):- local(X, Lugar), tab(2), write(X), nl,
fail.fail.
lista_objetos(QualquerLugar).lista_objetos(QualquerLugar).
14. Nani Search (3)Nani Search (3)
► Agora, quando a primeira cláusula falha, a segundaAgora, quando a primeira cláusula falha, a segunda
cláusula será tentadacláusula será tentada
Uma vez que o seu argumento é uma variável, ela casaráUma vez que o seu argumento é uma variável, ela casará
com sucesso com qualquer coisa, causandocom sucesso com qualquer coisa, causando
lista_objetos/1lista_objetos/1 ser sempre bem sucedida e sair pela portaser sempre bem sucedida e sair pela porta
‘‘ExitExit’’
► Como na segunda cláusula deComo na segunda cláusula de lista_objetos/1lista_objetos/1 nósnós
não nos preocupamos com o valor da variável, ela énão nos preocupamos com o valor da variável, ela é
simplesmente um “simplesmente um “marcador de lugarmarcador de lugar””
Para estas situações existe uma variável especialPara estas situações existe uma variável especial
chamada dechamada de variável anônimavariável anônima, representada por um, representada por um
underscore (_)underscore (_)
lista_objetos(_).lista_objetos(_).
15. Nani Search (4)Nani Search (4)
► Agora escreveremos o predicadoAgora escreveremos o predicado lista_conexoes/1lista_conexoes/1,,
que mostra todas as conexões de uma salaque mostra todas as conexões de uma sala
► Uma vez que regras podem referenciar outrasUma vez que regras podem referenciar outras
regras, bem como fatos, podemos escreverregras, bem como fatos, podemos escrever
lista_conexoes/1lista_conexoes/1 da mesma forma queda mesma forma que
lista_objetos/1lista_objetos/1 usando a regrausando a regra conexao/2conexao/2
lista_conexoes(Lugar):- conexao(Lugar, X), tab(2), write(X),lista_conexoes(Lugar):- conexao(Lugar, X), tab(2), write(X),
nl, fail.nl, fail.
lista_conexoes(_).lista_conexoes(_).
► Testando ...Testando ...
?-?- lista_conexoes(saguão).lista_conexoes(saguão).
sala de jantarsala de jantar
escritórioescritório
YesYes
16. Nani Search (5)Nani Search (5)
► Agora estamos prontos para escreverAgora estamos prontos para escrever olhar/0olhar/0
► O fato únicoO fato único aqui(cozinha)aqui(cozinha) nos informa ondenos informa onde
estamos no jogoestamos no jogo
Veremos mais a frente como dinamicamente mudarVeremos mais a frente como dinamicamente mudar
aqui/1aqui/1
► Podemos usá-lo junto com os dois predicados dePodemos usá-lo junto com os dois predicados de
listagem para escreverlistagem para escrever olhar/0olhar/0
olhar :-olhar :-
aqui(Lugar),aqui(Lugar),
write(‘Você está no(a) ’), write(Lugar), nl,write(‘Você está no(a) ’), write(Lugar), nl,
write(‘Você pode ver:’), nl, lista_objetos(Lugar),write(‘Você pode ver:’), nl, lista_objetos(Lugar),
write(‘Você pode ir para:’), nl, lista_conexoes(Lugar).write(‘Você pode ir para:’), nl, lista_conexoes(Lugar).
17. Nani Search (6)Nani Search (6)
► Veremos como funcionaVeremos como funciona olhar/0olhar/0
?-?- olhar.olhar.
Você está no(a) cozinhaVocê está no(a) cozinha
Você pode ver:Você pode ver:
maçãmaçã
brócolisbrócolis
biscoitobiscoito
Você pode ir para:Você pode ir para:
escritórioescritório
porãoporão
sala de jantarsala de jantar
YesYes
18. –– Sumário –Sumário –
►Regras PrologRegras Prolog
Um programa Prolog é um banco de dados deUm programa Prolog é um banco de dados de
fatosfatos ee regrasregras inter-relacionadasinter-relacionadas
As regras se comunicam através deAs regras se comunicam através de unificaçãounificação ––
casamento de padrões interno de Prologcasamento de padrões interno de Prolog
As regras se comunicam com o usuário atravésAs regras se comunicam com o usuário através
dede predicados internospredicados internos comocomo write/1write/1
Regras podem serRegras podem ser consultadasconsultadas individualmenteindividualmente
através do promptatravés do prompt
19. –– Sumário –Sumário –
►Controle de Fluxo em PrologControle de Fluxo em Prolog
O comportamento de execução das regras éO comportamento de execução das regras é
controlado pelo mecanismo de busca interno decontrolado pelo mecanismo de busca interno de
Prolog chamadoProlog chamado backtrackingbacktracking
Podemos forçar o backtracking com o predicadoPodemos forçar o backtracking com o predicado
internointerno fail/0fail/0
Podemos forçar o sucesso de um predicadoPodemos forçar o sucesso de um predicado
adicionando uma cláusula final com umaadicionando uma cláusula final com uma variávelvariável
anônimaanônima como argumento e sem corpocomo argumento e sem corpo
20. –– Sumário –Sumário –
► Aspectos de Programação em PrologAspectos de Programação em Prolog
FatosFatos no banco de dados (localizações, portas, ...)no banco de dados (localizações, portas, ...)
substituem a definição convencional desubstituem a definição convencional de dadosdados
A busca porA busca por backtrackingbacktracking (lista_objetos/1) substitui a(lista_objetos/1) substitui a
codificação de muitos construtores decodificação de muitos construtores de laçoslaços
A troca de controle através doA troca de controle através do casamento decasamento de
padrõespadrões (conexao/2) substitui(conexao/2) substitui testes condicionaistestes condicionais ee
estruturas deestruturas de ramificaçãoramificação
As regras podem ser testadas individualmente,As regras podem ser testadas individualmente,
encorajando oencorajando o desenvolvimento modulardesenvolvimento modular
Regras podem chamar regras encorajando práticasRegras podem chamar regras encorajando práticas
de programação dede programação de abstração proceduralabstração procedural ee
abstração de dadosabstração de dados
► olhar/0 não sabe como lista_objetos/1 funciona e como os dadosolhar/0 não sabe como lista_objetos/1 funciona e como os dados
de local estão armazenadosde local estão armazenados
21. Exercícios (1)Exercícios (1)
►Considerando o seguinte banco de dadosConsiderando o seguinte banco de dados
a(a1, 1).a(a1, 1). b(1, b1).b(1, b1).
a(A, 2).a(A, 2). b(2, B).b(2, B).
a(a3, N).a(a3, N). b(N, b3).b(N, b3).
c(X,Y):- a(X,N), b(N,Y).c(X,Y):- a(X,N), b(N,Y).
d(X,Y):- a(X,N), b(Y,N).d(X,Y):- a(X,N), b(Y,N).
d(X,Y):- a(N,X), b(N,Y).d(X,Y):- a(N,X), b(N,Y).
►Qual o resultado das consultasQual o resultado das consultas
?-?- a(X, 2).a(X, 2). ?-?- b(X, kalamazoo).b(X, kalamazoo).
?-?- c(X, b3).c(X, b3). ?-?- c(X, Y).c(X, Y). ?-?- d(X, Y).d(X, Y).
22. Exercícios (2)Exercícios (2)
► Banco de Dados GenealógicoBanco de Dados Genealógico
Crie regras para vários relacionamentos familiares queCrie regras para vários relacionamentos familiares que
foram desenvolvidos como consultas na aula anteriorforam desenvolvidos como consultas na aula anterior
mae(M, F):- pais(M, F), mulher(M).mae(M, F):- pais(M, F), mulher(M).
Crie uma regra para irmãosCrie uma regra para irmãos
► Rastreie o predicado para visualizar o seu funcionamentoRastreie o predicado para visualizar o seu funcionamento
Podemos resolver o problema de indivíduos seremPodemos resolver o problema de indivíduos serem
irmãos deles mesmos através do predicado interno que éirmãos deles mesmos através do predicado interno que é
bem sucedido caso dois valores sejam diferentes e falhabem sucedido caso dois valores sejam diferentes e falha
caso sejam iguaiscaso sejam iguais
► O predicado é = (X,Y).O predicado é = (X,Y).
► Também podemos escrevê-lo na forma X = YTambém podemos escrevê-lo na forma X = Y
Use o predicado irmãos para definir regras adicionaisUse o predicado irmãos para definir regras adicionais
para irmãos, irmãs, tios, tias e primospara irmãos, irmãs, tios, tias e primos
23. Exercícios (3)Exercícios (3)
► Banco de Dados GenealógicoBanco de Dados Genealógico
O predicado para representar casamento leva aoO predicado para representar casamento leva ao
problema da porta com dois caminhos (porta/2)problema da porta com dois caminhos (porta/2)
► Utilize uma solução idêntica para implementá-loUtilize uma solução idêntica para implementá-lo
Adicione regras para tios e tias que consiga acrescentarAdicione regras para tios e tias que consiga acrescentar
tios e tias por casamento e não apenas por sanguetios e tias por casamento e não apenas por sangue
Escreva um predicado para avôEscreva um predicado para avô
► Rastreie o uso de avo(alguem, X). e avo(X, alguem). queRastreie o uso de avo(alguem, X). e avo(X, alguem). que
encontra avôs e netosencontra avôs e netos
► Dependendo de como você escrevê-lo, ele poderá precisar deDependendo de como você escrevê-lo, ele poderá precisar de
muito mais passos em uma consulta que em outramuito mais passos em uma consulta que em outra
► Escreva dois predicados, um chamado avo/2 e outro chamadoEscreva dois predicados, um chamado avo/2 e outro chamado
neto/2neto/2
► Certifique-se de que ambos são eficientesCertifique-se de que ambos são eficientes
24. O que vem a seguir?O que vem a seguir?
►AritméticaAritmética
►Gerenciando DadosGerenciando Dados
►......