1. Programação em LógicaProgramação em Lógica
MatemáticaMatemática
PrologProlog
– 02 –– 02 –
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. FatosFatos
► São a forma mais simples de predicadosSão a forma mais simples de predicados
► São similares a registros em bancos de dadosSão similares a registros em bancos de dados
Podem ser consultados como em um banco de dadosPodem ser consultados como em um banco de dados
► A sintaxe para um fato éA sintaxe para um fato é
pred(arg1, arg2, ... argN).pred(arg1, arg2, ... argN).
predpred o nome do predicadoo nome do predicado
arg1, ...arg1, ... os argumentosos argumentos
NN a aridadea aridade
.. o final sintático das cláusulas Prologo final sintático das cláusulas Prolog
► Um predicado de aridade zero é simplesmenteUm predicado de aridade zero é simplesmente
pred.pred.
4. Termos PrologTermos Prolog
► Os argumentos podem ser qualquerOs argumentos podem ser qualquer termotermo legal emlegal em
PrologProlog
► Os termos básicos sãoOs termos básicos são
Integer – Um número positivo ou negativoInteger – Um número positivo ou negativo
Átomo – Um texto constante iniciando com um caractereÁtomo – Um texto constante iniciando com um caractere
minúsculominúsculo
Variável – Começa com um caractere maiúsculo ou comVariável – Começa com um caractere maiúsculo ou com
underscore (_)underscore (_)
Estrutura – Termos complexos, cobertos mais adiante noEstrutura – Termos complexos, cobertos mais adiante no
cursocurso
► Algumas implementações estendem esta lista comAlgumas implementações estendem esta lista com
outros tipos de dados, como ponto flutuante ououtros tipos de dados, como ponto flutuante ou
stringsstrings
6. Átomos (1)Átomos (1)
► São normalmente formados por letras e dígitos comSão normalmente formados por letras e dígitos com
o primeiro caractere minúsculoo primeiro caractere minúsculo
hellohello
twoWordsTogethertwoWordsTogether
x14x14
► O underscore (_) e não o hífen (-), pode ser usadoO underscore (_) e não o hífen (-), pode ser usado
como separador em nomes longoscomo separador em nomes longos
um_nome_de_atomo_longoum_nome_de_atomo_longo
z_23z_23
► Átomos não legaisÁtomos não legais
não-use-hifensnão-use-hifens
123naousedigitosnoinicio123naousedigitosnoinicio
_naoiniciecomunderscore_naoiniciecomunderscore
NaoinicecomcapsNaoinicecomcaps
7. Átomos (2)Átomos (2)
► Utilize aspas simples para tornar qualquerUtilize aspas simples para tornar qualquer
combinação de caracteres um átomo legalcombinação de caracteres um átomo legal
‘‘estes-hifens-estao-ok’estes-hifens-estao-ok’
‘‘UpperCase’UpperCase’
‘‘embedded blanks’embedded blanks’
► Não utilize aspas duplas (“ ”)para formar átomosNão utilize aspas duplas (“ ”)para formar átomos
Faz com que a lista de caracteres seja tratada como umaFaz com que a lista de caracteres seja tratada como uma
lista de códigos ASCIIlista de códigos ASCII
► Átomos também podem ser formados a partir deÁtomos também podem ser formados a partir de
símbolossímbolos
-->-->
++++
8. VariáveisVariáveis
►São similares a átomos, mas se diferenciamSão similares a átomos, mas se diferenciam
por iniciar com um caractere maiúsculo oupor iniciar com um caractere maiúsculo ou
underscore (_)underscore (_)
XX
Input_ListInput_List
_4th_argument_4th_argument
Z56Z56
9. Exemplos de FatosExemplos de Fatos
►cliente/3 – em uma aplicação de negócioscliente/3 – em uma aplicação de negócios
cliente(‘John Jones’, conquista, bom_credito).cliente(‘John Jones’, conquista, bom_credito).
cliente(‘Sally Smith’, salvador, bom_credito).cliente(‘Sally Smith’, salvador, bom_credito).
►window/5 – um sistema de janelas que usawindow/5 – um sistema de janelas que usa
fatos para armazenar dados sobre as váriasfatos para armazenar dados sobre as várias
janelas (nomes das janelas e coordenadas)janelas (nomes das janelas e coordenadas)
window(main, 2, 2, 20, 72).window(main, 2, 2, 20, 72).
window(errors, 15, 40, 20, 78).window(errors, 15, 40, 20, 78).
►doenca/2 – um sistema especialista dedoenca/2 – um sistema especialista de
diagnóstico médicodiagnóstico médico
doenca(peste, infecciosa).doenca(peste, infecciosa).
10. Exercício (1)Exercício (1)
►Banco de Dados GenealógicoBanco de Dados Genealógico
Crie um arquivo para a sua aplicaçãoCrie um arquivo para a sua aplicação
Adicione alguns membros de sua famíliaAdicione alguns membros de sua família
►É importante que as informações estejam corretas,É importante que as informações estejam corretas,
uma vez que iremos explorar os relacionamentos entreuma vez que iremos explorar os relacionamentos entre
familiaresfamiliares
►O seu próprio conhecimento servirá para verificar aO seu próprio conhecimento servirá para verificar a
correção de seu programa Prologcorreção de seu programa Prolog
Inicie por armazenar o sexo dos indivíduosInicie por armazenar o sexo dos indivíduos
11. Exercício (2)Exercício (2)
►Banco de Dados GenealógicoBanco de Dados Genealógico
Use dois predicados separados – homem/1 eUse dois predicados separados – homem/1 e
mulher/1mulher/1
homem(denis).homem(denis).
homem(miguel).homem(miguel).
mulher(diana).mulher(diana).
Lembre-se que se quiser incluir caracteresLembre-se que se quiser incluir caracteres
maiúsculos ou espaços em branco, use aspasmaiúsculos ou espaços em branco, use aspas
simplessimples
homem(‘Ghenghis Khan’).homem(‘Ghenghis Khan’).
12. Consultas SimplesConsultas Simples
►Consultas Prolog trabalham através deConsultas Prolog trabalham através de
casamento de padrõescasamento de padrões
►O padrão de uma consulta é chamadoO padrão de uma consulta é chamado
objetivoobjetivo
►Se existe um fato que casa com o objetivo,Se existe um fato que casa com o objetivo,
então a consulta é bem sucedida e Prologentão a consulta é bem sucedida e Prolog
responderesponde YesYes
►Caso não exista um fato, então a consultaCaso não exista um fato, então a consulta
falha e Prolog respondefalha e Prolog responde NoNo
►O casamento de padrões em Prolog éO casamento de padrões em Prolog é
chamado dechamado de unificaçãounificação
13. UnificaçãoUnificação
►Caso o banco de dados contenha apenasCaso o banco de dados contenha apenas
fatos, a unificação é bem sucedida casofatos, a unificação é bem sucedida caso
Os nomes dos predicados no objetivo e no bancoOs nomes dos predicados no objetivo e no banco
de dados são os mesmosde dados são os mesmos
Os predicados possuem a mesma aridadeOs predicados possuem a mesma aridade
Todos os argumentos são os mesmosTodos os argumentos são os mesmos
14. Programa ExemploPrograma Exemplo
% Salas
sala(cozinha).
sala('escritório').
sala('saguão').
sala('sala de jantar').
sala('porão').
% Localização dos objetos
local(escrivaninha, 'escritório').
local('maçã', cozinha).
local(lanterna, escrivaninha).
local('máquina de lavar', 'porão').
local(cobertor, 'máquina de lavar').
local('brócolis', cozinha).
local(biscoito, cozinha).
local(computador, 'escritório').
% Portas - Conexão entre salas
porta('escritório', 'saguão').
porta(cozinha, 'escritório').
porta('saguão', 'sala de jantar').
porta(cozinha, 'porão').
porta('sala de jantar', cozinha).
% Alimentos
comestivel('maçã').
comestivel(biscoito).
gosto_ruim('brócolis').
% Situação da Lanterna
desligado(lanterna).
% Localização do jogador
aqui(cozinha).
15. ConsultasConsultas
►Verificar se existe uma sala no jogoVerificar se existe uma sala no jogo
?-?- sala(‘escritório’).sala(‘escritório’).
YesYes
Prolog responderáProlog responderá YesYes caso um casamento sejacaso um casamento seja
encontradoencontrado
?-?- sala(quarto).sala(quarto).
NoNo
Prolog responderáProlog responderá NoNo caso nenhum casamentocaso nenhum casamento
seja encontradoseja encontrado
16. Uso de Variáveis (1)Uso de Variáveis (1)
► Objetivos podem ser generalizados pelo uso deObjetivos podem ser generalizados pelo uso de
variáveis Prologvariáveis Prolog
► Elas não se comportam como variáveis em outrasElas não se comportam como variáveis em outras
linguagens de programaçãolinguagens de programação
As variáveis em Prolog substituem um ou maisAs variáveis em Prolog substituem um ou mais
argumentos no objetivoargumentos no objetivo
► Adicionam uma nova dimensão na unificação – umaAdicionam uma nova dimensão na unificação – uma
variável irá casar com sucesso com qualquer termovariável irá casar com sucesso com qualquer termo
► Após uma unificação bem sucedida, a variável tomaApós uma unificação bem sucedida, a variável toma
o valor do termo com o qual ela casao valor do termo com o qual ela casa
Isto é chamado de ligação (Isto é chamado de ligação (bindingbinding) de uma variável) de uma variável
17. Uso de Variáveis (2)Uso de Variáveis (2)
► Uma vez que exista mais de um valor que umaUma vez que exista mais de um valor que uma
variável possa ser ligada que satisfaça o objetivo,variável possa ser ligada que satisfaça o objetivo,
Prolog fornece um meio de vermos valoresProlog fornece um meio de vermos valores
alternativosalternativos
Após uma resposta, devemos entrar com um ponto eApós uma resposta, devemos entrar com um ponto e
vírgula (;)vírgula (;)
► ExemploExemplo
?-?- sala(X).sala(X).
X = cozinha ;X = cozinha ;
X = escritório ;X = escritório ;
X = saguão ;X = saguão ;
X = ‘sala de jantar’ ;X = ‘sala de jantar’ ;
X = porão ;X = porão ;
NoNo
Não há mais respostas
18. Outros Exemplos (1)Outros Exemplos (1)
► Como encontrar todos os objetos na cozinhaComo encontrar todos os objetos na cozinha
?-?- local(Objeto, cozinha).local(Objeto, cozinha).
Objeto = maçã ;Objeto = maçã ;
Objeto = brócolis ;Objeto = brócolis ;
Objeto = biscoito ;Objeto = biscoito ;
NoNo
► Podemos usar duas variáveis para ver tudo em todos osPodemos usar duas variáveis para ver tudo em todos os
lugareslugares
?-?- local(Objeto, Lugar).local(Objeto, Lugar).
Objeto = escrivaninhaObjeto = escrivaninha
Lugar = escritório ;Lugar = escritório ;
Objeto = maçãObjeto = maçã
Lugar = cozinha ;Lugar = cozinha ;
......
19. Outros Exemplos (2)Outros Exemplos (2)
►Quais os clientes que vivem em Boston, eQuais os clientes que vivem em Boston, e
quais suas situações de crédito?quais suas situações de crédito?
?-?- cliente(X, boston, Y).cliente(X, boston, Y).
►Qual é o título do capítulo 2?Qual é o título do capítulo 2?
?-?- capitulo(2, Titulo).capitulo(2, Titulo).
►Quais as coordenadas da janela principalQuais as coordenadas da janela principal
(main)?(main)?
?-?- window(main, Row1, Col1, Row2, Col2).window(main, Row1, Col1, Row2, Col2).
20. Como as Consultas Funcionam?Como as Consultas Funcionam?
►Quando Prolog tenta satisfazer um objetivoQuando Prolog tenta satisfazer um objetivo
sobre um predicado, como em local/2, elesobre um predicado, como em local/2, ele
Busca através das cláusulas que definem local/2Busca através das cláusulas que definem local/2
Quando encontra um casamento para suasQuando encontra um casamento para suas
variáveis, ele marca a cláusula que foi utilizadavariáveis, ele marca a cláusula que foi utilizada
para satisfazer o objetivopara satisfazer o objetivo
Então, se o usuário pede por mais respostas, eleEntão, se o usuário pede por mais respostas, ele
retoma sua busca a partir da cláusula marcadaretoma sua busca a partir da cláusula marcada
21. ExemploExemplo
► ConsultaConsulta local(X, cozinha)local(X, cozinha)
PatternPattern Clause #1Clause #1
local(X, cozinha)local(X, cozinha) local(escrivaninha, ‘escritório’)local(escrivaninha, ‘escritório’)
Esta unificação falhaEsta unificação falha
► Os nomes dos predicados são os mesmos, o número deOs nomes dos predicados são os mesmos, o número de
argumentos é o mesmo, mas o segundo argumento no padrão,argumentos é o mesmo, mas o segundo argumento no padrão,
cozinhacozinha, é diferente do segundo argumento na cláusula,, é diferente do segundo argumento na cláusula, escritórioescritório
PatternPattern Clause #2Clause #2
local(X, cozinha)local(X, cozinha) local(‘maçã’, cozinha)local(‘maçã’, cozinha)
Esta unificação é bem sucedidaEsta unificação é bem sucedida
► Os nomes dos predicados, a aridade e os segundos argumentosOs nomes dos predicados, a aridade e os segundos argumentos
são os mesmossão os mesmos
► Os primeiros argumentos podem ser os mesmos se X no padrãoOs primeiros argumentos podem ser os mesmos se X no padrão
recebe o valor ‘recebe o valor ‘maçãmaçã’’
22. Objetivos PrologObjetivos Prolog
► Possui quatroPossui quatro portasportas representando o fluxo derepresentando o fluxo de
controle através do objetivocontrole através do objetivo
Call, Exit, Redo e FailCall, Exit, Redo e Fail
► Primeiro o objetivo é chamado (Primeiro o objetivo é chamado (CallCall))
► Se bem sucedido, ele é deixado (Se bem sucedido, ele é deixado (ExitExit))
► Se não, ele falha (Se não, ele falha (FailFail))
► Se o objetivo é retomado, através de um ponto eSe o objetivo é retomado, através de um ponto e
vírgula (;), a portavírgula (;), a porta RedoRedo é executadaé executada
call
inicia a busca por cláusulas que unificam com o objetivo
exit
indica que o objetivo é satisfeito, marca a cláusula e
liga as variáveis apropriadamente
redo
recupera o objetivo, libera as variáveis e retoma a
busca no local marcado
fail
indica que nenhuma outra cláusula casa com o objetivo
call exit
fail redo
Goal
23. Conferindo ...Conferindo ...
► Para acompanhar a execução de um programa emPara acompanhar a execução de um programa em
Prolog, utilize os seguintes comandosProlog, utilize os seguintes comandos
debug/0 – inicia o modo de debugdebug/0 – inicia o modo de debug
► O Prolog pára em pontos deO Prolog pára em pontos de tracetrace ee spyspy
nodebug/0 – sai do modo de debugnodebug/0 – sai do modo de debug
trace/0, trace/1, trace/2 – inclui um ponto de rastreamentotrace/0, trace/1, trace/2 – inclui um ponto de rastreamento
notrace/0 – pára onotrace/0 – pára o tracertracer (rastreador)(rastreador)
spy/1 – coloca um ponto de observação no predicadospy/1 – coloca um ponto de observação no predicado
nospy/1 – remove o ponto de observaçãonospy/1 – remove o ponto de observação
24. ExemploExemplo
►Carregue o programa exemplo e entre comCarregue o programa exemplo e entre com
os comandosos comandos
?-?- spy(local).spy(local).
YesYes
[debug] ?-[debug] ?-
Acompanha a execução do predicadoAcompanha a execução do predicado locallocal
[debug] ?-[debug] ?- local(X, cozinha).local(X, cozinha).
Call: (7) local(_G286, cozinha) ?Call: (7) local(_G286, cozinha) ? (Enter)(Enter)
Exit: (7) local(maçã, cozinha) ?Exit: (7) local(maçã, cozinha) ? (Enter)(Enter)
X = maçã ;X = maçã ;
......
25. Variáveis x Fatos (1)Variáveis x Fatos (1)
► Variáveis também podem ocorrer em fatos de umVariáveis também podem ocorrer em fatos de um
banco de dados Prolog.banco de dados Prolog.
sleeps(X).sleeps(X).
Indica que todos dormemIndica que todos dormem
► Podemos adicionar um fato diretamente no promptPodemos adicionar um fato diretamente no prompt
?-?- assert(sleeps(X)).assert(sleeps(X)).
X = _G160X = _G160
YesYes
► Consultas sobre este fato geram os seguintesConsultas sobre este fato geram os seguintes
resultadosresultados
?-?- sleeps(jane).sleeps(jane).
YesYes
?-?- sleeps(tom).sleeps(tom).
YesYes
26. Variáveis x Fatos (2)Variáveis x Fatos (2)
► Note que Prolog não retorna a ligação de variáveisNote que Prolog não retorna a ligação de variáveis
‘X = jane’ ou ‘X = tom’‘X = jane’ ou ‘X = tom’
Apesar delas com certeza serem ligadas dessa maneira,Apesar delas com certeza serem ligadas dessa maneira,
somente são listadas variáveis mencionadas na consulta,somente são listadas variáveis mencionadas na consulta,
não aquelas usadas no programanão aquelas usadas no programa
► Prolog também pode ligar variáveis a variáveisProlog também pode ligar variáveis a variáveis
?-?- sleeps(Z).sleeps(Z).
Z = _G160Z = _G160
Quando duas variáveis não ligadas casam, elas sãoQuando duas variáveis não ligadas casam, elas são
ligadas entre si, mas não a um valorligadas entre si, mas não a um valor
Uso de uma variável interna comum ‘_G160’Uso de uma variável interna comum ‘_G160’
Desta maneira Prolog se lembra de que elas possuem oDesta maneira Prolog se lembra de que elas possuem o
mesmo valormesmo valor
27. Exercício (1)Exercício (1)
► Considere o seguinte banco de dados PrologConsidere o seguinte banco de dados Prolog
easy(1).easy(1).
easy(2).easy(2).
easy(3).easy(3).
gizmo(a, 1).gizmo(a, 1).
gizmo(b, 3).gizmo(b, 3).
gizmo(a, 2).gizmo(a, 2).
gizmo(d, 5).gizmo(d, 5).
gizmo(c, 3).gizmo(c, 3).
gizmo(a, 3).gizmo(a, 3).
gizmo(c, 4).gizmo(c, 4).
► Qual o resultado das consultas?Qual o resultado das consultas?
?- easy(2).
?- easy(X).
?- gizmo(a, X).
?- gizmo(X, 3).
?- gizmo(d, Y).
?- gizmo(X, X).
28. Exercício (2)Exercício (2)
►Considere o banco de dadosConsidere o banco de dados
harder(a, 1).harder(a, 1).
harder(c, X).harder(c, X).
harder(b, 4).harder(b, 4).
harder(d, 2).harder(d, 2).
►Qual a resposta para as consultasQual a resposta para as consultas
?- harder(a, X).?- harder(a, X).
?- harder(c, X).?- harder(c, X).
?- harder(X, 1).?- harder(X, 1).
?- harder(X, 4).?- harder(X, 4).
29. Exercício (3)Exercício (3)
►Banco de Dados GenealógicoBanco de Dados Genealógico
Faça algumas consultas queFaça algumas consultas que
►Confirmem o relacionamento pai, como emConfirmem o relacionamento pai, como em
pais(dennis, diana)pais(dennis, diana)
►Encontre alguns pais como emEncontre alguns pais como em pais(X, diana)pais(X, diana)
►Encontre alguns filhos como emEncontre alguns filhos como em pais(dennis, X)pais(dennis, X)
►Liste todas os pares pai-filho como emListe todas os pares pai-filho como em pais(X, Y)pais(X, Y)
Se pais/2 parece estar funcionandoSe pais/2 parece estar funcionando
corretamente, adicione membros a sua família decorretamente, adicione membros a sua família de
modo a aumentar o banco de dadosmodo a aumentar o banco de dados
►Lembre-se de incluir os predicados correspondentesLembre-se de incluir os predicados correspondentes
homem/1 ou mulher/1 para cada indivíduo adicionadohomem/1 ou mulher/1 para cada indivíduo adicionado
30. O que vem a seguir?O que vem a seguir?
►Consultas CompostasConsultas Compostas
►RegrasRegras
►......