Programação em LógicaProgramação em Lógica
MatemáticaMatemática
PrologProlog
– 03 –– 03 –
Inteligência ArtificialInteligência Artificial
Fábio M. PereiraFábio M. Pereira
Baseado emBaseado em
Amzi! inc. – www.amzi.comAmzi! inc. – www.amzi.com
PrologProlog
►Consultas CombinadasConsultas Combinadas
►Predicados InternosPredicados Internos
►ExercíciosExercícios
Consultas Combinadas (1)Consultas Combinadas (1)
► Consultas simples podem ser combinadas paraConsultas simples podem ser combinadas para
formar consultas complexasformar consultas complexas
► Exemplo:Exemplo:
 Quais objetos comestíveis estão na cozinha?Quais objetos comestíveis estão na cozinha?
?-?- local(X, cozinha), comestivel(X).local(X, cozinha), comestivel(X).
► Uma consulta combinada possui umaUma consulta combinada possui uma conjunçãoconjunção dede
objetivosobjetivos
 A vírgula separando os objetivos é lida como “e”A vírgula separando os objetivos é lida como “e”
 Existe um X, tal que X esteja localizado na cozinhaExiste um X, tal que X esteja localizado na cozinha ee X éX é
comestível?comestível?
► Se uma mesma variável aparece mais de uma vezSe uma mesma variável aparece mais de uma vez
em um consulta, ela deve ter o mesmo valor emem um consulta, ela deve ter o mesmo valor em
todos os locais em que aparecetodos os locais em que aparece
Consultas Combinadas (2)Consultas Combinadas (2)
► O nome de uma variável não possui nenhumO nome de uma variável não possui nenhum
significado em qualquer outra consulta, ou cláusulasignificado em qualquer outra consulta, ou cláusula
do banco de dadosdo banco de dados
 Se X aparece em outras consultas ou cláusulas, aSe X aparece em outras consultas ou cláusulas, a
consulta ou cláusula possui a sua própria cópia daconsulta ou cláusula possui a sua própria cópia da
variávelvariável
 Dizemos que oDizemos que o escopoescopo de uma variável lógica é umade uma variável lógica é uma
consultaconsulta
► Ordem de execuçãoOrdem de execução
 Uma consulta combinada inicia chamando o primeiroUma consulta combinada inicia chamando o primeiro
objetivo a esquerdaobjetivo a esquerda
 Se bem sucedido, o próximo objetivo é chamado com asSe bem sucedido, o próximo objetivo é chamado com as
variáveis ligadas como um conjunto do objetivo préviovariáveis ligadas como um conjunto do objetivo prévio
 Se a consulta termina via portaSe a consulta termina via porta exitexit do objetivo mais ado objetivo mais a
direita, ela é bem sucedida e Prolog imprime os valoresdireita, ela é bem sucedida e Prolog imprime os valores
da tabela de variáveisda tabela de variáveis
Consultas Combinadas (3)Consultas Combinadas (3)
► Ordem de execução (cont.)Ordem de execução (cont.)
 Se um usuário digita um ponto e vírgula (;) após umaSe um usuário digita um ponto e vírgula (;) após uma
resposta, a consulta é retomada na portaresposta, a consulta é retomada na porta redoredo dodo
objetivo mais a direitaobjetivo mais a direita
 Somente as variáveis ligadas deste conjunto sãoSomente as variáveis ligadas deste conjunto são
desfeitasdesfeitas
 Se a consulta termina via portaSe a consulta termina via porta failfail do objetivo mais ado objetivo mais a
esquerda, a consulta falhaesquerda, a consulta falha
 Utilize o debug para acompanhar o processoUtilize o debug para acompanhar o processo variables
query out
no ;
Goal 1 Goal 2
ExemploExemplo
►?-?- local(X, cozinha), comestivel(X).local(X, cozinha), comestivel(X).
[debug] ?- local(X, cozinha), comestivel(X).
Call: (7) local(_G283, cozinha) ? creep
Exit: (7) local(maçã, cozinha) ? creep
Call: (7) comestivel(maçã) ? creep
Exit: (7) comestivel(maçã) ? creep
X = maçã ;
Fail: (7) comestivel(maçã) ? creep
Redo: (7) local(_G283, cozinha) ? creep
Exit: (7) local(brócolis, cozinha) ? creep
Call: (7) comestivel(brócolis) ? creep
Fail: (7) comestivel(brócolis) ? creep
Redo: (7) local(_G283, cozinha) ? creep
Exit: (7) local(biscoito, cozinha) ? creep
Call: (7) comestivel(biscoito) ? creep
Exit: (7) comestivel(biscoito) ? creep
X = biscoito ;
Fail: (7) comestivel(biscoito) ? creep
Redo: (7) local(_G283, cozinha) ? creep
Fail: (7) local(_G283, cozinha) ? creep
No
Exemplo com Duas VariáveisExemplo com Duas Variáveis
►Liste todos os objetos localizados em salasListe todos os objetos localizados em salas
adjacentes à cozinhaadjacentes à cozinha
►Em termos lógicos:Em termos lógicos:
 Encontre T e R de modo que exista uma porta daEncontre T e R de modo que exista uma porta da
cozinha para R e T está localizado em Rcozinha para R e T está localizado em R
?- porta(cozinha, R), local(T,R).
R = escritório
T = escrivaninha;
R = escritório
T = computador;
R = porão
T = ‘máquina de lavar’;
No
Predicados Internos (1)Predicados Internos (1)
► Até este ponto vimos qual o formato utilizado porAté este ponto vimos qual o formato utilizado por
Prolog para nos responder às consultasProlog para nos responder às consultas
► A partir de agora veremos como gerar consultasA partir de agora veremos como gerar consultas
personalizadas de acordo com nossaspersonalizadas de acordo com nossas
necessidadesnecessidades
► Características de Predicados InternosCaracterísticas de Predicados Internos
 Não existem cláusulas no banco de dados paraNão existem cláusulas no banco de dados para
predicados internospredicados internos
 Um predicado interno é predefinido por PrologUm predicado interno é predefinido por Prolog
 São normalmente escritos na linguagem usada paraSão normalmente escritos na linguagem usada para
implementar o Prologimplementar o Prolog
 Podem realizar funções não relacionadas com o teoremaPodem realizar funções não relacionadas com o teorema
de prova lógicade prova lógica
 São chamados as vezes de predicados extra-lógicosSão chamados as vezes de predicados extra-lógicos
Predicados Internos (2)Predicados Internos (2)
►Veremos os predicados internos à medidaVeremos os predicados internos à medida
que precisemos delesque precisemos deles
►Predicados de entrada/saída usados paraPredicados de entrada/saída usados para
imprimir uma consultaimprimir uma consulta
 write/1write/1 – imprime o seu argumento na tela,– imprime o seu argumento na tela,
sempre falha em um backtrackingsempre falha em um backtracking
 nl/0nl/0 – inicia uma nova linha– inicia uma nova linha
 tab/1tab/1 – espera um inteiro como argumento e– espera um inteiro como argumento e
tabula o número de espaçostabula o número de espaços
 fail/0fail/0 – provoca uma falha, ou seja, passa o– provoca uma falha, ou seja, passa o
controle imediatamente para uma porta redocontrole imediatamente para uma porta redo
ExemplosExemplos
►Listar todos os objetos que estão na cozinhaListar todos os objetos que estão na cozinha
?-?- local(X, cozinha), write(X), nl, fail.local(X, cozinha), write(X), nl, fail.
maçãmaçã
brócolisbrócolis
biscoitobiscoito
NoNo
?-?- local(X, cozinha), write(X), tab(8), fail.local(X, cozinha), write(X), tab(8), fail.
maçã brócolis biscoitomaçã brócolis biscoito
Exercícios (1)Exercícios (1)
► Considere o banco de dados PrologConsidere o banco de dados Prolog
► Quais os resultados das seguintes consultas?Quais os resultados das seguintes consultas?
 ?-?- gizmo(a,X), easy(X).gizmo(a,X), easy(X).
 ?-?- gizmo(c,X), easy(X).gizmo(c,X), easy(X).
 ?-?- gizmo(d,Z), easy(Z).gizmo(d,Z), easy(Z).
 ?-?- easy(Y), gizmo(X,Y).easy(Y), gizmo(X,Y).
 ?-?- write(‘report’), nl, easy(T), write(T), gizmo(M, T), tab(2), write(M),write(‘report’), nl, easy(T), write(T), gizmo(M, T), tab(2), write(M),
fail.fail.
 ?-?- write(‘buggy’), nl, easy(Z), write(X), gizmo(Z,X), tab(2), write(Z),write(‘buggy’), nl, easy(Z), write(X), gizmo(Z,X), tab(2), write(Z),
fail.fail.
 ?-?- easy(X), harder(Y, X).easy(X), harder(Y, X).
easy(1).
easy(2).
easy(3).
gizmo(a,1).
gizmo(b,3).
gizmo(a,2).
gizmo(d,5).
gizmo(c,3).
gizmo(a,3).
gizmo(c,4).
harder(a,1).
harder(c,X).
harder(b,4).
harder(d,2).
Exercícios (2)Exercícios (2)
► Qual o resultado da consulta?Qual o resultado da consulta?
?-?- porta(cozinha, R), write(R), nl, local(T, R), tab(3),porta(cozinha, R), write(R), nl, local(T, R), tab(3),
write(T), nl, fail.write(T), nl, fail.
► Banco de Dados GenealógicoBanco de Dados Genealógico
 Encontre alguém que seja mãeEncontre alguém que seja mãe
?-?- pais(X, Alguem), mulher(X).pais(X, Alguem), mulher(X).
 Escreva consultas similares para pai, filho e filhaEscreva consultas similares para pai, filho e filha
 Rastreie a execução e compare:Rastreie a execução e compare:
?-?- pais(X, Alguem), mulher(X).pais(X, Alguem), mulher(X).
?-?- mulher(X), pais(X, Alguem).mulher(X), pais(X, Alguem).
 Elas possuem as mesmas respostas?Elas possuem as mesmas respostas?
 Escreva consultas para encontrar avós, avôs e bisavôsEscreva consultas para encontrar avós, avôs e bisavôs
O que vem a seguir?O que vem a seguir?
►RegrasRegras
►AritméticaAritmética
►......

Aula Prolog 03

  • 1.
    Programação em LógicaProgramaçãoem Lógica MatemáticaMatemática PrologProlog – 03 –– 03 – Inteligência ArtificialInteligência Artificial Fábio M. PereiraFábio M. Pereira Baseado emBaseado em Amzi! inc. – www.amzi.comAmzi! inc. – www.amzi.com
  • 2.
    PrologProlog ►Consultas CombinadasConsultas Combinadas ►PredicadosInternosPredicados Internos ►ExercíciosExercícios
  • 3.
    Consultas Combinadas (1)ConsultasCombinadas (1) ► Consultas simples podem ser combinadas paraConsultas simples podem ser combinadas para formar consultas complexasformar consultas complexas ► Exemplo:Exemplo:  Quais objetos comestíveis estão na cozinha?Quais objetos comestíveis estão na cozinha? ?-?- local(X, cozinha), comestivel(X).local(X, cozinha), comestivel(X). ► Uma consulta combinada possui umaUma consulta combinada possui uma conjunçãoconjunção dede objetivosobjetivos  A vírgula separando os objetivos é lida como “e”A vírgula separando os objetivos é lida como “e”  Existe um X, tal que X esteja localizado na cozinhaExiste um X, tal que X esteja localizado na cozinha ee X éX é comestível?comestível? ► Se uma mesma variável aparece mais de uma vezSe uma mesma variável aparece mais de uma vez em um consulta, ela deve ter o mesmo valor emem um consulta, ela deve ter o mesmo valor em todos os locais em que aparecetodos os locais em que aparece
  • 4.
    Consultas Combinadas (2)ConsultasCombinadas (2) ► O nome de uma variável não possui nenhumO nome de uma variável não possui nenhum significado em qualquer outra consulta, ou cláusulasignificado em qualquer outra consulta, ou cláusula do banco de dadosdo banco de dados  Se X aparece em outras consultas ou cláusulas, aSe X aparece em outras consultas ou cláusulas, a consulta ou cláusula possui a sua própria cópia daconsulta ou cláusula possui a sua própria cópia da variávelvariável  Dizemos que oDizemos que o escopoescopo de uma variável lógica é umade uma variável lógica é uma consultaconsulta ► Ordem de execuçãoOrdem de execução  Uma consulta combinada inicia chamando o primeiroUma consulta combinada inicia chamando o primeiro objetivo a esquerdaobjetivo a esquerda  Se bem sucedido, o próximo objetivo é chamado com asSe bem sucedido, o próximo objetivo é chamado com as variáveis ligadas como um conjunto do objetivo préviovariáveis ligadas como um conjunto do objetivo prévio  Se a consulta termina via portaSe a consulta termina via porta exitexit do objetivo mais ado objetivo mais a direita, ela é bem sucedida e Prolog imprime os valoresdireita, ela é bem sucedida e Prolog imprime os valores da tabela de variáveisda tabela de variáveis
  • 5.
    Consultas Combinadas (3)ConsultasCombinadas (3) ► Ordem de execução (cont.)Ordem de execução (cont.)  Se um usuário digita um ponto e vírgula (;) após umaSe um usuário digita um ponto e vírgula (;) após uma resposta, a consulta é retomada na portaresposta, a consulta é retomada na porta redoredo dodo objetivo mais a direitaobjetivo mais a direita  Somente as variáveis ligadas deste conjunto sãoSomente as variáveis ligadas deste conjunto são desfeitasdesfeitas  Se a consulta termina via portaSe a consulta termina via porta failfail do objetivo mais ado objetivo mais a esquerda, a consulta falhaesquerda, a consulta falha  Utilize o debug para acompanhar o processoUtilize o debug para acompanhar o processo variables query out no ; Goal 1 Goal 2
  • 6.
    ExemploExemplo ►?-?- local(X, cozinha),comestivel(X).local(X, cozinha), comestivel(X). [debug] ?- local(X, cozinha), comestivel(X). Call: (7) local(_G283, cozinha) ? creep Exit: (7) local(maçã, cozinha) ? creep Call: (7) comestivel(maçã) ? creep Exit: (7) comestivel(maçã) ? creep X = maçã ; Fail: (7) comestivel(maçã) ? creep Redo: (7) local(_G283, cozinha) ? creep Exit: (7) local(brócolis, cozinha) ? creep Call: (7) comestivel(brócolis) ? creep Fail: (7) comestivel(brócolis) ? creep Redo: (7) local(_G283, cozinha) ? creep Exit: (7) local(biscoito, cozinha) ? creep Call: (7) comestivel(biscoito) ? creep Exit: (7) comestivel(biscoito) ? creep X = biscoito ; Fail: (7) comestivel(biscoito) ? creep Redo: (7) local(_G283, cozinha) ? creep Fail: (7) local(_G283, cozinha) ? creep No
  • 7.
    Exemplo com DuasVariáveisExemplo com Duas Variáveis ►Liste todos os objetos localizados em salasListe todos os objetos localizados em salas adjacentes à cozinhaadjacentes à cozinha ►Em termos lógicos:Em termos lógicos:  Encontre T e R de modo que exista uma porta daEncontre T e R de modo que exista uma porta da cozinha para R e T está localizado em Rcozinha para R e T está localizado em R ?- porta(cozinha, R), local(T,R). R = escritório T = escrivaninha; R = escritório T = computador; R = porão T = ‘máquina de lavar’; No
  • 8.
    Predicados Internos (1)PredicadosInternos (1) ► Até este ponto vimos qual o formato utilizado porAté este ponto vimos qual o formato utilizado por Prolog para nos responder às consultasProlog para nos responder às consultas ► A partir de agora veremos como gerar consultasA partir de agora veremos como gerar consultas personalizadas de acordo com nossaspersonalizadas de acordo com nossas necessidadesnecessidades ► Características de Predicados InternosCaracterísticas de Predicados Internos  Não existem cláusulas no banco de dados paraNão existem cláusulas no banco de dados para predicados internospredicados internos  Um predicado interno é predefinido por PrologUm predicado interno é predefinido por Prolog  São normalmente escritos na linguagem usada paraSão normalmente escritos na linguagem usada para implementar o Prologimplementar o Prolog  Podem realizar funções não relacionadas com o teoremaPodem realizar funções não relacionadas com o teorema de prova lógicade prova lógica  São chamados as vezes de predicados extra-lógicosSão chamados as vezes de predicados extra-lógicos
  • 9.
    Predicados Internos (2)PredicadosInternos (2) ►Veremos os predicados internos à medidaVeremos os predicados internos à medida que precisemos delesque precisemos deles ►Predicados de entrada/saída usados paraPredicados de entrada/saída usados para imprimir uma consultaimprimir uma consulta  write/1write/1 – imprime o seu argumento na tela,– imprime o seu argumento na tela, sempre falha em um backtrackingsempre falha em um backtracking  nl/0nl/0 – inicia uma nova linha– inicia uma nova linha  tab/1tab/1 – espera um inteiro como argumento e– espera um inteiro como argumento e tabula o número de espaçostabula o número de espaços  fail/0fail/0 – provoca uma falha, ou seja, passa o– provoca uma falha, ou seja, passa o controle imediatamente para uma porta redocontrole imediatamente para uma porta redo
  • 10.
    ExemplosExemplos ►Listar todos osobjetos que estão na cozinhaListar todos os objetos que estão na cozinha ?-?- local(X, cozinha), write(X), nl, fail.local(X, cozinha), write(X), nl, fail. maçãmaçã brócolisbrócolis biscoitobiscoito NoNo ?-?- local(X, cozinha), write(X), tab(8), fail.local(X, cozinha), write(X), tab(8), fail. maçã brócolis biscoitomaçã brócolis biscoito
  • 11.
    Exercícios (1)Exercícios (1) ►Considere o banco de dados PrologConsidere o banco de dados Prolog ► Quais os resultados das seguintes consultas?Quais os resultados das seguintes consultas?  ?-?- gizmo(a,X), easy(X).gizmo(a,X), easy(X).  ?-?- gizmo(c,X), easy(X).gizmo(c,X), easy(X).  ?-?- gizmo(d,Z), easy(Z).gizmo(d,Z), easy(Z).  ?-?- easy(Y), gizmo(X,Y).easy(Y), gizmo(X,Y).  ?-?- write(‘report’), nl, easy(T), write(T), gizmo(M, T), tab(2), write(M),write(‘report’), nl, easy(T), write(T), gizmo(M, T), tab(2), write(M), fail.fail.  ?-?- write(‘buggy’), nl, easy(Z), write(X), gizmo(Z,X), tab(2), write(Z),write(‘buggy’), nl, easy(Z), write(X), gizmo(Z,X), tab(2), write(Z), fail.fail.  ?-?- easy(X), harder(Y, X).easy(X), harder(Y, X). easy(1). easy(2). easy(3). gizmo(a,1). gizmo(b,3). gizmo(a,2). gizmo(d,5). gizmo(c,3). gizmo(a,3). gizmo(c,4). harder(a,1). harder(c,X). harder(b,4). harder(d,2).
  • 12.
    Exercícios (2)Exercícios (2) ►Qual o resultado da consulta?Qual o resultado da consulta? ?-?- porta(cozinha, R), write(R), nl, local(T, R), tab(3),porta(cozinha, R), write(R), nl, local(T, R), tab(3), write(T), nl, fail.write(T), nl, fail. ► Banco de Dados GenealógicoBanco de Dados Genealógico  Encontre alguém que seja mãeEncontre alguém que seja mãe ?-?- pais(X, Alguem), mulher(X).pais(X, Alguem), mulher(X).  Escreva consultas similares para pai, filho e filhaEscreva consultas similares para pai, filho e filha  Rastreie a execução e compare:Rastreie a execução e compare: ?-?- pais(X, Alguem), mulher(X).pais(X, Alguem), mulher(X). ?-?- mulher(X), pais(X, Alguem).mulher(X), pais(X, Alguem).  Elas possuem as mesmas respostas?Elas possuem as mesmas respostas?  Escreva consultas para encontrar avós, avôs e bisavôsEscreva consultas para encontrar avós, avôs e bisavôs
  • 13.
    O que vema seguir?O que vem a seguir? ►RegrasRegras ►AritméticaAritmética ►......