SlideShare uma empresa Scribd logo
1 de 13
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
►......

Mais conteúdo relacionado

Mais procurados

Mais procurados (20)

IA Prolog
IA PrologIA Prolog
IA Prolog
 
Aula de Prolog 08 - Unificação
Aula de Prolog 08 - UnificaçãoAula de Prolog 08 - Unificação
Aula de Prolog 08 - Unificação
 
Introdução a python
Introdução a pythonIntrodução a python
Introdução a python
 
Listas em Prolog
Listas em PrologListas em Prolog
Listas em Prolog
 
01
0101
01
 
Regras de Produção: o Motor de Inferência JESS
Regras de Produção:o Motor de Inferência JESSRegras de Produção:o Motor de Inferência JESS
Regras de Produção: o Motor de Inferência JESS
 
Python 02
Python 02Python 02
Python 02
 
Aula Prolog 09 - Listas
Aula Prolog 09 - ListasAula Prolog 09 - Listas
Aula Prolog 09 - Listas
 
Aula 02 - Curso PHP e MySQL
Aula 02 - Curso PHP e MySQLAula 02 - Curso PHP e MySQL
Aula 02 - Curso PHP e MySQL
 
Python 01
Python 01Python 01
Python 01
 
Palestra python
Palestra pythonPalestra python
Palestra python
 
Estrutura de Dados - Aula 04
Estrutura de Dados - Aula 04Estrutura de Dados - Aula 04
Estrutura de Dados - Aula 04
 
Python 03
Python 03Python 03
Python 03
 
Aula prolog 02 ia
Aula prolog 02   iaAula prolog 02   ia
Aula prolog 02 ia
 
Python
PythonPython
Python
 
Estrutura de Dados - Aula 06
Estrutura de Dados - Aula 06Estrutura de Dados - Aula 06
Estrutura de Dados - Aula 06
 
Estrutura de Dados - Aula 08
Estrutura de Dados - Aula 08Estrutura de Dados - Aula 08
Estrutura de Dados - Aula 08
 
Perl Moderno, dia5
Perl Moderno, dia5Perl Moderno, dia5
Perl Moderno, dia5
 
Estrutura de Dados - Aula 03
Estrutura de Dados - Aula 03Estrutura de Dados - Aula 03
Estrutura de Dados - Aula 03
 
[Curso Java Basico] Aula 56: Enum: metodos abstratos
[Curso Java Basico] Aula 56: Enum: metodos abstratos[Curso Java Basico] Aula 56: Enum: metodos abstratos
[Curso Java Basico] Aula 56: Enum: metodos abstratos
 

Destaque

04 - Gerenciamento de Threads - II
04 -  Gerenciamento de Threads - II04 -  Gerenciamento de Threads - II
04 - Gerenciamento de Threads - IIFabio Moura Pereira
 
Desenvolvimento de Sistemas Web - HTML5 - Introdução
Desenvolvimento de Sistemas Web - HTML5 - IntroduçãoDesenvolvimento de Sistemas Web - HTML5 - Introdução
Desenvolvimento de Sistemas Web - HTML5 - IntroduçãoFabio Moura Pereira
 
05 - Sincronização de Threads - I
05 - Sincronização de Threads - I05 - Sincronização de Threads - I
05 - Sincronização de Threads - IFabio Moura Pereira
 
Programação Concorrente - Gerenciamento de Threads - Parte II
Programação Concorrente - Gerenciamento de Threads - Parte IIProgramação Concorrente - Gerenciamento de Threads - Parte II
Programação Concorrente - Gerenciamento de Threads - Parte IIFabio Moura Pereira
 
Aula de Desenvolvimento de Sistemas Web - CSS3
Aula de Desenvolvimento de Sistemas Web - CSS3Aula de Desenvolvimento de Sistemas Web - CSS3
Aula de Desenvolvimento de Sistemas Web - CSS3Fabio Moura Pereira
 
Aula Interface Gráfica do Usuário
Aula Interface Gráfica do UsuárioAula Interface Gráfica do Usuário
Aula Interface Gráfica do UsuárioFabio Moura Pereira
 
Curso de Desenvolvimento de Sistemas Web - (X)HTML
Curso de Desenvolvimento de Sistemas Web - (X)HTMLCurso de Desenvolvimento de Sistemas Web - (X)HTML
Curso de Desenvolvimento de Sistemas Web - (X)HTMLFabio Moura Pereira
 
Programação Concorrente - Gerenciamento de Threads - Parte I
Programação Concorrente - Gerenciamento de Threads - Parte IProgramação Concorrente - Gerenciamento de Threads - Parte I
Programação Concorrente - Gerenciamento de Threads - Parte IFabio Moura Pereira
 
Desenvolvimento de Jogos - Mercado Parte 2
Desenvolvimento de Jogos - Mercado Parte 2Desenvolvimento de Jogos - Mercado Parte 2
Desenvolvimento de Jogos - Mercado Parte 2Fabio Moura Pereira
 
Desenvolvimento de Jogos - Game Design
Desenvolvimento de Jogos - Game DesignDesenvolvimento de Jogos - Game Design
Desenvolvimento de Jogos - Game DesignFabio Moura Pereira
 
Programação Concorrente - Introdução
Programação Concorrente - IntroduçãoProgramação Concorrente - Introdução
Programação Concorrente - IntroduçãoFabio Moura Pereira
 
Desenvolvimento de Sistemas Web - Conceitos Básicos
Desenvolvimento de Sistemas Web - Conceitos BásicosDesenvolvimento de Sistemas Web - Conceitos Básicos
Desenvolvimento de Sistemas Web - Conceitos BásicosFabio Moura Pereira
 
Desenvolvimento de Jogos - Mercado Parte 1
Desenvolvimento de Jogos - Mercado Parte 1Desenvolvimento de Jogos - Mercado Parte 1
Desenvolvimento de Jogos - Mercado Parte 1Fabio Moura Pereira
 

Destaque (20)

Aula Persistência 01 (Java)
Aula Persistência 01 (Java)Aula Persistência 01 (Java)
Aula Persistência 01 (Java)
 
04 - Gerenciamento de Threads - II
04 -  Gerenciamento de Threads - II04 -  Gerenciamento de Threads - II
04 - Gerenciamento de Threads - II
 
Desenvolvimento de Sistemas Web - HTML5 - Introdução
Desenvolvimento de Sistemas Web - HTML5 - IntroduçãoDesenvolvimento de Sistemas Web - HTML5 - Introdução
Desenvolvimento de Sistemas Web - HTML5 - Introdução
 
Haskell - Introdução
Haskell - IntroduçãoHaskell - Introdução
Haskell - Introdução
 
05 - Sincronização de Threads - I
05 - Sincronização de Threads - I05 - Sincronização de Threads - I
05 - Sincronização de Threads - I
 
Programação Concorrente - Gerenciamento de Threads - Parte II
Programação Concorrente - Gerenciamento de Threads - Parte IIProgramação Concorrente - Gerenciamento de Threads - Parte II
Programação Concorrente - Gerenciamento de Threads - Parte II
 
Aula Tratamento de Exceções
Aula Tratamento de ExceçõesAula Tratamento de Exceções
Aula Tratamento de Exceções
 
Aula de Desenvolvimento de Sistemas Web - CSS3
Aula de Desenvolvimento de Sistemas Web - CSS3Aula de Desenvolvimento de Sistemas Web - CSS3
Aula de Desenvolvimento de Sistemas Web - CSS3
 
Aula Interface Gráfica do Usuário
Aula Interface Gráfica do UsuárioAula Interface Gráfica do Usuário
Aula Interface Gráfica do Usuário
 
Aula Java Swing
Aula Java SwingAula Java Swing
Aula Java Swing
 
Aula 05 - Java Script Básico
Aula 05 -  Java Script BásicoAula 05 -  Java Script Básico
Aula 05 - Java Script Básico
 
Aula de Prolog 06 - Recursão
Aula de Prolog 06 - RecursãoAula de Prolog 06 - Recursão
Aula de Prolog 06 - Recursão
 
Curso de Desenvolvimento de Sistemas Web - (X)HTML
Curso de Desenvolvimento de Sistemas Web - (X)HTMLCurso de Desenvolvimento de Sistemas Web - (X)HTML
Curso de Desenvolvimento de Sistemas Web - (X)HTML
 
Programação Concorrente - Gerenciamento de Threads - Parte I
Programação Concorrente - Gerenciamento de Threads - Parte IProgramação Concorrente - Gerenciamento de Threads - Parte I
Programação Concorrente - Gerenciamento de Threads - Parte I
 
Desenvolvimento de Jogos - Mercado Parte 2
Desenvolvimento de Jogos - Mercado Parte 2Desenvolvimento de Jogos - Mercado Parte 2
Desenvolvimento de Jogos - Mercado Parte 2
 
Desenvolvimento de Jogos - Game Design
Desenvolvimento de Jogos - Game DesignDesenvolvimento de Jogos - Game Design
Desenvolvimento de Jogos - Game Design
 
Programação Concorrente - Introdução
Programação Concorrente - IntroduçãoProgramação Concorrente - Introdução
Programação Concorrente - Introdução
 
Desenvolvimento de Sistemas Web - Conceitos Básicos
Desenvolvimento de Sistemas Web - Conceitos BásicosDesenvolvimento de Sistemas Web - Conceitos Básicos
Desenvolvimento de Sistemas Web - Conceitos Básicos
 
Desenvolvimento de Jogos - Mercado Parte 1
Desenvolvimento de Jogos - Mercado Parte 1Desenvolvimento de Jogos - Mercado Parte 1
Desenvolvimento de Jogos - Mercado Parte 1
 
PHP - Strings
PHP - StringsPHP - Strings
PHP - Strings
 

Semelhante a Programação Lógica em Prolog

Atividades de Teste e Cobertura de Código em Java
Atividades de Teste e Cobertura de Código em JavaAtividades de Teste e Cobertura de Código em Java
Atividades de Teste e Cobertura de Código em Javaaceiro
 
7-Prolog-Base (2).pdf
7-Prolog-Base (2).pdf7-Prolog-Base (2).pdf
7-Prolog-Base (2).pdfSofiaPiteira
 
TDC2018FLN | Trilha Python - Do nada, tudo se constrói. Test-Driven Developme...
TDC2018FLN | Trilha Python - Do nada, tudo se constrói. Test-Driven Developme...TDC2018FLN | Trilha Python - Do nada, tudo se constrói. Test-Driven Developme...
TDC2018FLN | Trilha Python - Do nada, tudo se constrói. Test-Driven Developme...tdc-globalcode
 
Conceito de funçao e modularizaçao
Conceito de funçao e modularizaçaoConceito de funçao e modularizaçao
Conceito de funçao e modularizaçaossuserc6132d
 
Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011Luís Cobucci
 
Não tem teste ? Já nasceu legado.
Não tem teste ? Já nasceu legado.Não tem teste ? Já nasceu legado.
Não tem teste ? Já nasceu legado.GTS-CE
 
Aprendizado de Máquina em Linguagem Natural
Aprendizado de Máquina em Linguagem NaturalAprendizado de Máquina em Linguagem Natural
Aprendizado de Máquina em Linguagem NaturalBeatriz Albiero
 
TDC2016SP - Trilha Programação Funcional
TDC2016SP - Trilha Programação FuncionalTDC2016SP - Trilha Programação Funcional
TDC2016SP - Trilha Programação Funcionaltdc-globalcode
 
Palestra Ministrada no 3 Encontro do GTS-CE
Palestra Ministrada no 3 Encontro do GTS-CEPalestra Ministrada no 3 Encontro do GTS-CE
Palestra Ministrada no 3 Encontro do GTS-CEHedley Luna
 
Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011Luís Cobucci
 
Automatizando seus testes com robot framework
Automatizando seus testes com robot frameworkAutomatizando seus testes com robot framework
Automatizando seus testes com robot frameworkClaudenir Freitas
 
Palestra Testes Unidade Com JUnit
Palestra Testes Unidade Com JUnitPalestra Testes Unidade Com JUnit
Palestra Testes Unidade Com JUnitRobinson Castilho
 
Testes de unidade e TDD SoLiSC 2011
Testes de unidade e TDD SoLiSC 2011Testes de unidade e TDD SoLiSC 2011
Testes de unidade e TDD SoLiSC 2011Luís Cobucci
 

Semelhante a Programação Lógica em Prolog (20)

Atividades de Teste e Cobertura de Código em Java
Atividades de Teste e Cobertura de Código em JavaAtividades de Teste e Cobertura de Código em Java
Atividades de Teste e Cobertura de Código em Java
 
7-Prolog-Base (2).pdf
7-Prolog-Base (2).pdf7-Prolog-Base (2).pdf
7-Prolog-Base (2).pdf
 
TDC2018FLN | Trilha Python - Do nada, tudo se constrói. Test-Driven Developme...
TDC2018FLN | Trilha Python - Do nada, tudo se constrói. Test-Driven Developme...TDC2018FLN | Trilha Python - Do nada, tudo se constrói. Test-Driven Developme...
TDC2018FLN | Trilha Python - Do nada, tudo se constrói. Test-Driven Developme...
 
Conceito de funçao e modularizaçao
Conceito de funçao e modularizaçaoConceito de funçao e modularizaçao
Conceito de funçao e modularizaçao
 
Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011
 
Não tem teste ? Já nasceu legado.
Não tem teste ? Já nasceu legado.Não tem teste ? Já nasceu legado.
Não tem teste ? Já nasceu legado.
 
Mini curso GOLANG
Mini curso GOLANGMini curso GOLANG
Mini curso GOLANG
 
Aprendizado de Máquina em Linguagem Natural
Aprendizado de Máquina em Linguagem NaturalAprendizado de Máquina em Linguagem Natural
Aprendizado de Máquina em Linguagem Natural
 
Recursividade
RecursividadeRecursividade
Recursividade
 
TDC2016SP - Trilha Programação Funcional
TDC2016SP - Trilha Programação FuncionalTDC2016SP - Trilha Programação Funcional
TDC2016SP - Trilha Programação Funcional
 
Palestra Ministrada no 3 Encontro do GTS-CE
Palestra Ministrada no 3 Encontro do GTS-CEPalestra Ministrada no 3 Encontro do GTS-CE
Palestra Ministrada no 3 Encontro do GTS-CE
 
Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011
 
Backtracking
BacktrackingBacktracking
Backtracking
 
01-Paradigmas.pdf
01-Paradigmas.pdf01-Paradigmas.pdf
01-Paradigmas.pdf
 
Automatizando seus testes com robot framework
Automatizando seus testes com robot frameworkAutomatizando seus testes com robot framework
Automatizando seus testes com robot framework
 
Algoritmos
AlgoritmosAlgoritmos
Algoritmos
 
Programação Lógica com Restrições
Programação Lógica com RestriçõesProgramação Lógica com Restrições
Programação Lógica com Restrições
 
Palestra Testes Unidade Com JUnit
Palestra Testes Unidade Com JUnitPalestra Testes Unidade Com JUnit
Palestra Testes Unidade Com JUnit
 
Resumo computação I
Resumo computação IResumo computação I
Resumo computação I
 
Testes de unidade e TDD SoLiSC 2011
Testes de unidade e TDD SoLiSC 2011Testes de unidade e TDD SoLiSC 2011
Testes de unidade e TDD SoLiSC 2011
 

Mais de Fabio Moura Pereira

Programação Concorrente - Objetos e Concorrência
Programação Concorrente - Objetos e ConcorrênciaProgramação Concorrente - Objetos e Concorrência
Programação Concorrente - Objetos e ConcorrênciaFabio Moura Pereira
 
Aula - Interfaces e Estilos de Interação
Aula - Interfaces e Estilos de InteraçãoAula - Interfaces e Estilos de Interação
Aula - Interfaces e Estilos de InteraçãoFabio Moura Pereira
 
Aula Desenvolvimento de Jogos - Game Engine (Motor de Jogos)
Aula Desenvolvimento de Jogos - Game Engine (Motor de Jogos)Aula Desenvolvimento de Jogos - Game Engine (Motor de Jogos)
Aula Desenvolvimento de Jogos - Game Engine (Motor de Jogos)Fabio Moura Pereira
 

Mais de Fabio Moura Pereira (8)

Programação Concorrente - Objetos e Concorrência
Programação Concorrente - Objetos e ConcorrênciaProgramação Concorrente - Objetos e Concorrência
Programação Concorrente - Objetos e Concorrência
 
Aula - Interfaces e Estilos de Interação
Aula - Interfaces e Estilos de InteraçãoAula - Interfaces e Estilos de Interação
Aula - Interfaces e Estilos de Interação
 
Aula Desenvolvimento de Jogos - Game Engine (Motor de Jogos)
Aula Desenvolvimento de Jogos - Game Engine (Motor de Jogos)Aula Desenvolvimento de Jogos - Game Engine (Motor de Jogos)
Aula Desenvolvimento de Jogos - Game Engine (Motor de Jogos)
 
Padrões de Projeto de Software
Padrões de Projeto de SoftwarePadrões de Projeto de Software
Padrões de Projeto de Software
 
Curso de PHP - Objetos
Curso de PHP - ObjetosCurso de PHP - Objetos
Curso de PHP - Objetos
 
Curso de PHP - Arrays
Curso de PHP - ArraysCurso de PHP - Arrays
Curso de PHP - Arrays
 
PHP - Funções
PHP - FunçõesPHP - Funções
PHP - Funções
 
PHP - Introdução
PHP - IntroduçãoPHP - Introdução
PHP - Introdução
 

Programação Lógica em Prolog

  • 1. 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
  • 2. PrologProlog ►Consultas CombinadasConsultas Combinadas ►Predicados InternosPredicados Internos ►ExercíciosExercícios
  • 3. 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
  • 4. 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
  • 5. 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
  • 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 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
  • 8. 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
  • 9. 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
  • 10. 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
  • 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 vem a seguir?O que vem a seguir? ►RegrasRegras ►AritméticaAritmética ►......