SlideShare uma empresa Scribd logo
Programação em LógicaProgramação em Lógica
MatemáticaMatemática
PrologProlog
– 05 –– 05 –
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
►AritméticaAritmética
►Gerenciamento de DadosGerenciamento de Dados
►ExercíciosExercícios
Aritmética (1)Aritmética (1)
► Prolog deve possuir a habilidade de lidar comProlog deve possuir a habilidade de lidar com
aritmética para se tornar uma linguagem dearitmética para se tornar uma linguagem de
programação de uso geralprogramação de uso geral
 No entanto, aritmética não se encaixa naturalmente aoNo entanto, aritmética não se encaixa naturalmente ao
esquema lógicoesquema lógico
 O conceito de avaliação de uma expressão aritméticaO conceito de avaliação de uma expressão aritmética
contrasta com o de casamento de padrõescontrasta com o de casamento de padrões
► Por este motivo, Prolog fornece o predicado internoPor este motivo, Prolog fornece o predicado interno
‘‘isis’ que avalia uma expressão aritmética’ que avalia uma expressão aritmética
 Sintaxe:Sintaxe:
X is <expressão aritmética>X is <expressão aritmética>
Aritmética (2)Aritmética (2)
► Exemplos:Exemplos:
?-?- X is 2 + 2.X is 2 + 2.
X = 4X = 4
?-?- X is 3 * 4 + 2.X is 3 * 4 + 2.
X = 14X = 14
► Operadores para comparação:Operadores para comparação:
XX >> YY XX << YY XX >=>= YY XX =<=< YY
 Exemplos:Exemplos:
?-?- 4 > 3.4 > 3. ?-?- 4 < 3.4 < 3. ?-?- X is 2 + 2, X > 3.X is 2 + 2, X > 3.
YesYes NoNo X = 4X = 4
?-?- X is 2 + 2, 3 >= X.X is 2 + 2, 3 >= X. ?-?- 3 + 4 > 3 * 2.3 + 4 > 3 * 2.
NoNo YesYes
Aritmética e PredicadosAritmética e Predicados
► Operadores também podem ser usados em regrasOperadores também podem ser usados em regras
► Conversão de Celsius para Fahrenheit:Conversão de Celsius para Fahrenheit:
c_to_f(C, F):- F is C * 9 / 5 + 32.c_to_f(C, F):- F is C * 9 / 5 + 32.
► Temperatura abaixo do ponto de congelamento:Temperatura abaixo do ponto de congelamento:
freezing(F):- F =< 32.freezing(F):- F =< 32.
► Exemplos:Exemplos:
?-?- c_to_f(100,X).c_to_f(100,X).
X = 212X = 212
?-?- freezing(15).freezing(15).
YesYes
?-?- freezing(45).freezing(45).
NoNo
Gerenciando Dados (1)Gerenciando Dados (1)
►Vimos que um programa Prolog é um bancoVimos que um programa Prolog é um banco
de dados de predicadosde dados de predicados
►Prolog nos permite manipular o banco deProlog nos permite manipular o banco de
dados diretamente e fornece predicadosdados diretamente e fornece predicados
internos para realizar esta funçãointernos para realizar esta função
 asserta(X)asserta(X)
►Adiciona a cláusula X comoAdiciona a cláusula X como primeira cláusulaprimeira cláusula para opara o
seu predicado. Como os outros predicados I/O,seu predicado. Como os outros predicados I/O,
sempre falha em backtracking e não desfaz o seusempre falha em backtracking e não desfaz o seu
trabalhotrabalho
Gerenciando Dados (2)Gerenciando Dados (2)
►Predicados internos para manipular o BDPredicados internos para manipular o BD
 assertz(X)assertz(X)
►O mesmo que asserta/1, mas adiciona a cláusula XO mesmo que asserta/1, mas adiciona a cláusula X
comocomo última cláusulaúltima cláusula do predicadodo predicado
 assert(X)assert(X)
►Sinônimo de assertz/1Sinônimo de assertz/1
 retract(X)retract(X)
►Remove a cláusula X do banco de dadosRemove a cláusula X do banco de dados
 dynamicdynamic
►Informa ao Prolog que as definições do(s) predicado(s)Informa ao Prolog que as definições do(s) predicado(s)
podem mudar durante a execuçãopodem mudar durante a execução
:- dynamic:- dynamic
foo/0, baz/2.foo/0, baz/2.
Nani Search (1)Nani Search (1)
► Precisamos manipular o banco de dados em NaniPrecisamos manipular o banco de dados em Nani
SearchSearch
 Para mudar dinamicamente a localização do jogadorPara mudar dinamicamente a localização do jogador
 Para mudar as coisas que tenham sidoPara mudar as coisas que tenham sido seguradasseguradas ee
movidasmovidas
► vaipara/1 move o jogador de uma sala para outravaipara/1 move o jogador de uma sala para outra
 Desenvolvimento top/downDesenvolvimento top/down
► Primeiro deveremos checar se o jogador pode ir para o lugarPrimeiro deveremos checar se o jogador pode ir para o lugar
► Se puder, devemos movê-lo e olhar em volta no novo lugarSe puder, devemos movê-lo e olhar em volta no novo lugar
vaipara(Lugar):- pode_ir(Lugar), move(Lugar), olhar.vaipara(Lugar):- pode_ir(Lugar), move(Lugar), olhar.
► Podemos ir para uma sala se ela está conectada com a sala ondePodemos ir para uma sala se ela está conectada com a sala onde
estamosestamos
pode_ir(Lugar):- aqui(X), conexao(X, Lugar).pode_ir(Lugar):- aqui(X), conexao(X, Lugar).
Nani Search (2)Nani Search (2)
► Podemos testar pode_ir/1 imediatamente (assumindo quePodemos testar pode_ir/1 imediatamente (assumindo que
estamos na cozinha):estamos na cozinha):
?-?- pode_ir(escritório).pode_ir(escritório).
YesYes
?-?- pode_ir(saguão).pode_ir(saguão).
NoNo
► Seria melhor se pode_ir/1 nos desse uma mensagem emSeria melhor se pode_ir/1 nos desse uma mensagem em
caso de falhacaso de falha
pode_ir(Lugar):- aqui(X), conexao(X, Lugar).pode_ir(Lugar):- aqui(X), conexao(X, Lugar).
pode_ir(_):-pode_ir(_):-
write(‘Você não pode ir para lá a partir daqui.’), nl, fail.write(‘Você não pode ir para lá a partir daqui.’), nl, fail.
► Testando ...Testando ...
?-?- pode_ir(saguão).pode_ir(saguão).
Você não pode ir para lá a partir daqui.Você não pode ir para lá a partir daqui.
NoNo
Nani Search (3)Nani Search (3)
► Agora podemos desenvolverAgora podemos desenvolver move/1move/1
 Atualiza o banco de dados dinamicamente para refletir aAtualiza o banco de dados dinamicamente para refletir a
nova localização do jogadornova localização do jogador
 Remove a cláusula aqui/1 e a substitui por uma novaRemove a cláusula aqui/1 e a substitui por uma nova
cláusula de maneira que sempre exista apenas umacláusula de maneira que sempre exista apenas uma
cláusula aqui/1, representando a posição atual do jogadorcláusula aqui/1, representando a posição atual do jogador
 Uma vez que vaipara/1 chama pode_ir/1 antes de aqui/1,Uma vez que vaipara/1 chama pode_ir/1 antes de aqui/1,
o novo aqui/1 será sempre um lugar legal no jogoo novo aqui/1 será sempre um lugar legal no jogo
move(Lugar):- retract(aqui(_)), asserta(aqui(Lugar)).move(Lugar):- retract(aqui(_)), asserta(aqui(Lugar)).
► Mas antes devemos informar a Prolog que iremosMas antes devemos informar a Prolog que iremos
manipular aqui/1 em tempo de execuçãomanipular aqui/1 em tempo de execução
:- dynamic:- dynamic
aqui/1.aqui/1.
Nani Search (4)Nani Search (4)
► Testando ...Testando ...
?-?- vaipara(escritório).vaipara(escritório).
Você está no(a) escritórioVocê está no(a) escritório
Você pode ver:Você pode ver:
escrivaninhaescrivaninha
computadorcomputador
Você pode ir para:Você pode ir para:
saguãosaguão
cozinhacozinha
?-?- vaipara(saguão).vaipara(saguão).
Você está no(a) saguãoVocê está no(a) saguão
Você pode ver:Você pode ver:
Você pode ir para:Você pode ir para:
sala de jantarsala de jantar
escritórioescritório
YesYes
Nani Search (5)Nani Search (5)
► A seguir implementaremos os comandos ‘A seguir implementaremos os comandos ‘pegarpegar’ e’ e
‘‘deixardeixar’’
 pegar/1 define um novo predicadopegar/1 define um novo predicado carrega/1carrega/1 com umacom uma
cláusula para cada objeto que o jogador possuicláusula para cada objeto que o jogador possui
 Inicialmente carrega/1 não está definido porque o jogadorInicialmente carrega/1 não está definido porque o jogador
não carrega nadanão carrega nada
pegar(X):- pode_pegar(X), pegar_objeto(X).pegar(X):- pode_pegar(X), pegar_objeto(X).
 pode_pegar/1 é análoga a pode_ir/1pode_pegar/1 é análoga a pode_ir/1
pode_pegar(Objeto):- aqui(Lugar), local(Objeto, Lugar).pode_pegar(Objeto):- aqui(Lugar), local(Objeto, Lugar).
pode_pegar(Objeto):-pode_pegar(Objeto):-
write(‘Não há nenhum(a) ’), write(Objeto), write(‘ aqui.’),write(‘Não há nenhum(a) ’), write(Objeto), write(‘ aqui.’),
nl, fail.nl, fail.
Nani Search (6)Nani Search (6)
►Implementando os comandos ‘Implementando os comandos ‘pegarpegar’ e’ e
‘‘deixardeixar’’
 pegar_objeto/1 é análoga a move/1pegar_objeto/1 é análoga a move/1
►Remove uma cláusula de localização do objetoRemove uma cláusula de localização do objeto
(local/2) e inclui uma cláusula carrega/1, refletindo a(local/2) e inclui uma cláusula carrega/1, refletindo a
movimentação do objeto do lugar para o jogadormovimentação do objeto do lugar para o jogador
pegar_objeto(X):-pegar_objeto(X):-
retract(local(X,_)),retract(local(X,_)),
asserta(carrega(X)),asserta(carrega(X)),
write(‘ok’), nl.write(‘ok’), nl.
Exercícios (1)Exercícios (1)
►Nani SearchNani Search
 Escreva a cláusulaEscreva a cláusula deixar/1deixar/1 que remove aque remove a
cláusula carrega/1 e adiciona a cláusula local/2cláusula carrega/1 e adiciona a cláusula local/2
na sala atualna sala atual
 EscrevaEscreva inventario/0inventario/0, que lista os objetos que o, que lista os objetos que o
jogador carregajogador carrega
 Utilize vaipara/1, pegar/1, deixar/1, olhar/0 eUtilize vaipara/1, pegar/1, deixar/1, olhar/0 e
inventario/0 para se mover ao redor e examinar oinventario/0 para se mover ao redor e examinar o
ambiente do jogoambiente do jogo
 Escreva os predicadosEscreva os predicados liga/1liga/1 ee desliga/1desliga/1 queque
devem ser usados para ligar e desligar a lanternadevem ser usados para ligar e desligar a lanterna
O que vem a seguir?O que vem a seguir?
►RecursãoRecursão
►Estruturas de DadosEstruturas de Dados
►......

Mais conteúdo relacionado

Mais procurados

Seminário Prolog
Seminário PrologSeminário Prolog
Seminário Prolog
rafaelbozzetti
 
Linguagem Prolog - Antonio Rufino
Linguagem Prolog - Antonio RufinoLinguagem Prolog - Antonio Rufino
Linguagem Prolog - Antonio Rufino
Antonio Rufino
 
Programação Estruturada em Python - Aula 02 Controlde de Decisão
Programação Estruturada em Python - Aula 02 Controlde de DecisãoProgramação Estruturada em Python - Aula 02 Controlde de Decisão
Programação Estruturada em Python - Aula 02 Controlde de Decisão
Eduardo S. Pereira
 
Introdução a python
Introdução a pythonIntrodução a python
Introdução a python
Gemilson George
 
01
0101
Listas em Prolog
Listas em PrologListas em Prolog
Listas em Prolog
Natã Melo
 
Aula Prolog 09 - Listas
Aula Prolog 09 - ListasAula Prolog 09 - Listas
Aula Prolog 09 - Listas
Fabio Moura Pereira
 
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
elliando dias
 
Aula prolog 02 ia
Aula prolog 02   iaAula prolog 02   ia
Aula prolog 02 ia
Janaide Nogueira
 
Aula 02 - Curso PHP e MySQL
Aula 02 - Curso PHP e MySQLAula 02 - Curso PHP e MySQL
Aula 02 - Curso PHP e MySQL
B&R Consultoria Empresarial
 
Python 02
Python 02Python 02
Python 02
Bruno Catão
 
Python 01
Python 01Python 01
Python 01
Bruno Catão
 
Python
PythonPython
Perl Moderno, dia5
Perl Moderno, dia5Perl Moderno, dia5
Perl Moderno, dia5
garux
 
Estrutura de Dados - Aula 04
Estrutura de Dados - Aula 04Estrutura de Dados - Aula 04
Estrutura de Dados - Aula 04
thomasdacosta
 
Python 03
Python 03Python 03
Python 03
Bruno Catão
 
Palestra python
Palestra pythonPalestra python
Palestra python
Rony Cruch
 
Apostila aed
Apostila aedApostila aed
Apostila aed
Ivre Marjorie
 
Estrutura de Dados - Aula 06
Estrutura de Dados - Aula 06Estrutura de Dados - Aula 06
Estrutura de Dados - Aula 06
thomasdacosta
 
Perl Moderno, dia4
Perl Moderno, dia4Perl Moderno, dia4
Perl Moderno, dia4
garux
 

Mais procurados (20)

Seminário Prolog
Seminário PrologSeminário Prolog
Seminário Prolog
 
Linguagem Prolog - Antonio Rufino
Linguagem Prolog - Antonio RufinoLinguagem Prolog - Antonio Rufino
Linguagem Prolog - Antonio Rufino
 
Programação Estruturada em Python - Aula 02 Controlde de Decisão
Programação Estruturada em Python - Aula 02 Controlde de DecisãoProgramação Estruturada em Python - Aula 02 Controlde de Decisão
Programação Estruturada em Python - Aula 02 Controlde de Decisão
 
Introdução a python
Introdução a pythonIntrodução a python
Introdução a python
 
01
0101
01
 
Listas em Prolog
Listas em PrologListas em Prolog
Listas em Prolog
 
Aula Prolog 09 - Listas
Aula Prolog 09 - ListasAula Prolog 09 - Listas
Aula Prolog 09 - Listas
 
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
 
Aula prolog 02 ia
Aula prolog 02   iaAula prolog 02   ia
Aula prolog 02 ia
 
Aula 02 - Curso PHP e MySQL
Aula 02 - Curso PHP e MySQLAula 02 - Curso PHP e MySQL
Aula 02 - Curso PHP e MySQL
 
Python 02
Python 02Python 02
Python 02
 
Python 01
Python 01Python 01
Python 01
 
Python
PythonPython
Python
 
Perl Moderno, dia5
Perl Moderno, dia5Perl Moderno, dia5
Perl Moderno, dia5
 
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
 
Palestra python
Palestra pythonPalestra python
Palestra python
 
Apostila aed
Apostila aedApostila aed
Apostila aed
 
Estrutura de Dados - Aula 06
Estrutura de Dados - Aula 06Estrutura de Dados - Aula 06
Estrutura de Dados - Aula 06
 
Perl Moderno, dia4
Perl Moderno, dia4Perl Moderno, dia4
Perl Moderno, dia4
 

Destaque

04 - Gerenciamento de Threads - II
04 -  Gerenciamento de Threads - II04 -  Gerenciamento de Threads - II
04 - Gerenciamento de Threads - II
Fabio 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ção
Fabio Moura Pereira
 
Haskell - Introdução
Haskell - IntroduçãoHaskell - Introdução
Haskell - Introdução
Fabio Moura Pereira
 
05 - Sincronização de Threads - I
05 - Sincronização de Threads - I05 - Sincronização de Threads - I
05 - Sincronização de Threads - I
Fabio 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 II
Fabio 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 - CSS3
Fabio Moura Pereira
 
Aula 05 - Java Script Básico
Aula 05 -  Java Script BásicoAula 05 -  Java Script Básico
Aula 05 - Java Script Básico
Fabio 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)HTML
Fabio Moura Pereira
 
Aula Persistência 01 (Java)
Aula Persistência 01 (Java)Aula Persistência 01 (Java)
Aula Persistência 01 (Java)
Fabio Moura Pereira
 
Aula Tratamento de Exceções
Aula Tratamento de ExceçõesAula Tratamento de Exceções
Aula Tratamento de Exceções
Fabio 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ário
Fabio 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ásicos
Fabio Moura Pereira
 
Aula Java Swing
Aula Java SwingAula Java Swing
Aula Java Swing
Fabio Moura Pereira
 
Curso de PHP - Objetos
Curso de PHP - ObjetosCurso de PHP - Objetos
Curso de PHP - Objetos
Fabio Moura Pereira
 
Aula de Prolog 06 - Recursão
Aula de Prolog 06 - RecursãoAula de Prolog 06 - Recursão
Aula de Prolog 06 - Recursão
Fabio 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 I
Fabio Moura Pereira
 
Desenvolvimento de Jogos - Mercado Parte 2
Desenvolvimento de Jogos - Mercado Parte 2Desenvolvimento de Jogos - Mercado Parte 2
Desenvolvimento de Jogos - Mercado Parte 2
Fabio Moura Pereira
 
Desenvolvimento de Jogos - Game Design
Desenvolvimento de Jogos - Game DesignDesenvolvimento de Jogos - Game Design
Desenvolvimento de Jogos - Game Design
Fabio Moura Pereira
 
Programação Concorrente - Introdução
Programação Concorrente - IntroduçãoProgramação Concorrente - Introdução
Programação Concorrente - Introdução
Fabio Moura Pereira
 
Web analitica orientada a usabilidade
Web analitica orientada a usabilidadeWeb analitica orientada a usabilidade
Web analitica orientada a usabilidade
wacybis
 

Destaque (20)

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 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 05 - Java Script Básico
Aula 05 -  Java Script BásicoAula 05 -  Java Script Básico
Aula 05 - Java Script Básico
 
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
 
Aula Persistência 01 (Java)
Aula Persistência 01 (Java)Aula Persistência 01 (Java)
Aula Persistência 01 (Java)
 
Aula Tratamento de Exceções
Aula Tratamento de ExceçõesAula Tratamento de Exceções
Aula Tratamento de Exceções
 
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
 
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
 
Aula Java Swing
Aula Java SwingAula Java Swing
Aula Java Swing
 
Curso de PHP - Objetos
Curso de PHP - ObjetosCurso de PHP - Objetos
Curso de PHP - Objetos
 
Aula de Prolog 06 - Recursão
Aula de Prolog 06 - RecursãoAula de Prolog 06 - Recursão
Aula de Prolog 06 - Recursão
 
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
 
Web analitica orientada a usabilidade
Web analitica orientada a usabilidadeWeb analitica orientada a usabilidade
Web analitica orientada a usabilidade
 

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ência
Fabio 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ção
Fabio 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
 
Padrões de Projeto de Software
Padrões de Projeto de SoftwarePadrões de Projeto de Software
Padrões de Projeto de Software
Fabio Moura Pereira
 
Curso de PHP - Arrays
Curso de PHP - ArraysCurso de PHP - Arrays
Curso de PHP - Arrays
Fabio Moura Pereira
 
Desenvolvimento de Jogos - Mercado Parte 1
Desenvolvimento de Jogos - Mercado Parte 1Desenvolvimento de Jogos - Mercado Parte 1
Desenvolvimento de Jogos - Mercado Parte 1
Fabio Moura Pereira
 
PHP - Funções
PHP - FunçõesPHP - Funções
PHP - Funções
Fabio Moura Pereira
 
PHP - Introdução
PHP - IntroduçãoPHP - Introdução
PHP - Introdução
Fabio Moura Pereira
 
PHP - Strings
PHP - StringsPHP - Strings
PHP - Strings
Fabio Moura Pereira
 

Mais de Fabio Moura Pereira (9)

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 - Arrays
Curso de PHP - ArraysCurso de PHP - Arrays
Curso de PHP - Arrays
 
Desenvolvimento de Jogos - Mercado Parte 1
Desenvolvimento de Jogos - Mercado Parte 1Desenvolvimento de Jogos - Mercado Parte 1
Desenvolvimento de Jogos - Mercado Parte 1
 
PHP - Funções
PHP - FunçõesPHP - Funções
PHP - Funções
 
PHP - Introdução
PHP - IntroduçãoPHP - Introdução
PHP - Introdução
 
PHP - Strings
PHP - StringsPHP - Strings
PHP - Strings
 

Último

DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdfDESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
Momento da Informática
 
Certificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdfCertificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdf
joaovmp3
 
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdfTOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
Momento da Informática
 
Logica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptxLogica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptx
Momento da Informática
 
História da Rádio- 1936-1970 século XIX .2.pptx
História da Rádio- 1936-1970 século XIX   .2.pptxHistória da Rádio- 1936-1970 século XIX   .2.pptx
História da Rádio- 1936-1970 século XIX .2.pptx
TomasSousa7
 
Manual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdfManual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdf
WELITONNOGUEIRA3
 

Último (6)

DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdfDESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
 
Certificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdfCertificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdf
 
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdfTOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
 
Logica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptxLogica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptx
 
História da Rádio- 1936-1970 século XIX .2.pptx
História da Rádio- 1936-1970 século XIX   .2.pptxHistória da Rádio- 1936-1970 século XIX   .2.pptx
História da Rádio- 1936-1970 século XIX .2.pptx
 
Manual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdfManual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdf
 

Aula Prolog - 05

  • 1. Programação em LógicaProgramação em Lógica MatemáticaMatemática PrologProlog – 05 –– 05 – 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. Aritmética (1)Aritmética (1) ► Prolog deve possuir a habilidade de lidar comProlog deve possuir a habilidade de lidar com aritmética para se tornar uma linguagem dearitmética para se tornar uma linguagem de programação de uso geralprogramação de uso geral  No entanto, aritmética não se encaixa naturalmente aoNo entanto, aritmética não se encaixa naturalmente ao esquema lógicoesquema lógico  O conceito de avaliação de uma expressão aritméticaO conceito de avaliação de uma expressão aritmética contrasta com o de casamento de padrõescontrasta com o de casamento de padrões ► Por este motivo, Prolog fornece o predicado internoPor este motivo, Prolog fornece o predicado interno ‘‘isis’ que avalia uma expressão aritmética’ que avalia uma expressão aritmética  Sintaxe:Sintaxe: X is <expressão aritmética>X is <expressão aritmética>
  • 4. Aritmética (2)Aritmética (2) ► Exemplos:Exemplos: ?-?- X is 2 + 2.X is 2 + 2. X = 4X = 4 ?-?- X is 3 * 4 + 2.X is 3 * 4 + 2. X = 14X = 14 ► Operadores para comparação:Operadores para comparação: XX >> YY XX << YY XX >=>= YY XX =<=< YY  Exemplos:Exemplos: ?-?- 4 > 3.4 > 3. ?-?- 4 < 3.4 < 3. ?-?- X is 2 + 2, X > 3.X is 2 + 2, X > 3. YesYes NoNo X = 4X = 4 ?-?- X is 2 + 2, 3 >= X.X is 2 + 2, 3 >= X. ?-?- 3 + 4 > 3 * 2.3 + 4 > 3 * 2. NoNo YesYes
  • 5. Aritmética e PredicadosAritmética e Predicados ► Operadores também podem ser usados em regrasOperadores também podem ser usados em regras ► Conversão de Celsius para Fahrenheit:Conversão de Celsius para Fahrenheit: c_to_f(C, F):- F is C * 9 / 5 + 32.c_to_f(C, F):- F is C * 9 / 5 + 32. ► Temperatura abaixo do ponto de congelamento:Temperatura abaixo do ponto de congelamento: freezing(F):- F =< 32.freezing(F):- F =< 32. ► Exemplos:Exemplos: ?-?- c_to_f(100,X).c_to_f(100,X). X = 212X = 212 ?-?- freezing(15).freezing(15). YesYes ?-?- freezing(45).freezing(45). NoNo
  • 6. Gerenciando Dados (1)Gerenciando Dados (1) ►Vimos que um programa Prolog é um bancoVimos que um programa Prolog é um banco de dados de predicadosde dados de predicados ►Prolog nos permite manipular o banco deProlog nos permite manipular o banco de dados diretamente e fornece predicadosdados diretamente e fornece predicados internos para realizar esta funçãointernos para realizar esta função  asserta(X)asserta(X) ►Adiciona a cláusula X comoAdiciona a cláusula X como primeira cláusulaprimeira cláusula para opara o seu predicado. Como os outros predicados I/O,seu predicado. Como os outros predicados I/O, sempre falha em backtracking e não desfaz o seusempre falha em backtracking e não desfaz o seu trabalhotrabalho
  • 7. Gerenciando Dados (2)Gerenciando Dados (2) ►Predicados internos para manipular o BDPredicados internos para manipular o BD  assertz(X)assertz(X) ►O mesmo que asserta/1, mas adiciona a cláusula XO mesmo que asserta/1, mas adiciona a cláusula X comocomo última cláusulaúltima cláusula do predicadodo predicado  assert(X)assert(X) ►Sinônimo de assertz/1Sinônimo de assertz/1  retract(X)retract(X) ►Remove a cláusula X do banco de dadosRemove a cláusula X do banco de dados  dynamicdynamic ►Informa ao Prolog que as definições do(s) predicado(s)Informa ao Prolog que as definições do(s) predicado(s) podem mudar durante a execuçãopodem mudar durante a execução :- dynamic:- dynamic foo/0, baz/2.foo/0, baz/2.
  • 8. Nani Search (1)Nani Search (1) ► Precisamos manipular o banco de dados em NaniPrecisamos manipular o banco de dados em Nani SearchSearch  Para mudar dinamicamente a localização do jogadorPara mudar dinamicamente a localização do jogador  Para mudar as coisas que tenham sidoPara mudar as coisas que tenham sido seguradasseguradas ee movidasmovidas ► vaipara/1 move o jogador de uma sala para outravaipara/1 move o jogador de uma sala para outra  Desenvolvimento top/downDesenvolvimento top/down ► Primeiro deveremos checar se o jogador pode ir para o lugarPrimeiro deveremos checar se o jogador pode ir para o lugar ► Se puder, devemos movê-lo e olhar em volta no novo lugarSe puder, devemos movê-lo e olhar em volta no novo lugar vaipara(Lugar):- pode_ir(Lugar), move(Lugar), olhar.vaipara(Lugar):- pode_ir(Lugar), move(Lugar), olhar. ► Podemos ir para uma sala se ela está conectada com a sala ondePodemos ir para uma sala se ela está conectada com a sala onde estamosestamos pode_ir(Lugar):- aqui(X), conexao(X, Lugar).pode_ir(Lugar):- aqui(X), conexao(X, Lugar).
  • 9. Nani Search (2)Nani Search (2) ► Podemos testar pode_ir/1 imediatamente (assumindo quePodemos testar pode_ir/1 imediatamente (assumindo que estamos na cozinha):estamos na cozinha): ?-?- pode_ir(escritório).pode_ir(escritório). YesYes ?-?- pode_ir(saguão).pode_ir(saguão). NoNo ► Seria melhor se pode_ir/1 nos desse uma mensagem emSeria melhor se pode_ir/1 nos desse uma mensagem em caso de falhacaso de falha pode_ir(Lugar):- aqui(X), conexao(X, Lugar).pode_ir(Lugar):- aqui(X), conexao(X, Lugar). pode_ir(_):-pode_ir(_):- write(‘Você não pode ir para lá a partir daqui.’), nl, fail.write(‘Você não pode ir para lá a partir daqui.’), nl, fail. ► Testando ...Testando ... ?-?- pode_ir(saguão).pode_ir(saguão). Você não pode ir para lá a partir daqui.Você não pode ir para lá a partir daqui. NoNo
  • 10. Nani Search (3)Nani Search (3) ► Agora podemos desenvolverAgora podemos desenvolver move/1move/1  Atualiza o banco de dados dinamicamente para refletir aAtualiza o banco de dados dinamicamente para refletir a nova localização do jogadornova localização do jogador  Remove a cláusula aqui/1 e a substitui por uma novaRemove a cláusula aqui/1 e a substitui por uma nova cláusula de maneira que sempre exista apenas umacláusula de maneira que sempre exista apenas uma cláusula aqui/1, representando a posição atual do jogadorcláusula aqui/1, representando a posição atual do jogador  Uma vez que vaipara/1 chama pode_ir/1 antes de aqui/1,Uma vez que vaipara/1 chama pode_ir/1 antes de aqui/1, o novo aqui/1 será sempre um lugar legal no jogoo novo aqui/1 será sempre um lugar legal no jogo move(Lugar):- retract(aqui(_)), asserta(aqui(Lugar)).move(Lugar):- retract(aqui(_)), asserta(aqui(Lugar)). ► Mas antes devemos informar a Prolog que iremosMas antes devemos informar a Prolog que iremos manipular aqui/1 em tempo de execuçãomanipular aqui/1 em tempo de execução :- dynamic:- dynamic aqui/1.aqui/1.
  • 11. Nani Search (4)Nani Search (4) ► Testando ...Testando ... ?-?- vaipara(escritório).vaipara(escritório). Você está no(a) escritórioVocê está no(a) escritório Você pode ver:Você pode ver: escrivaninhaescrivaninha computadorcomputador Você pode ir para:Você pode ir para: saguãosaguão cozinhacozinha ?-?- vaipara(saguão).vaipara(saguão). Você está no(a) saguãoVocê está no(a) saguão Você pode ver:Você pode ver: Você pode ir para:Você pode ir para: sala de jantarsala de jantar escritórioescritório YesYes
  • 12. Nani Search (5)Nani Search (5) ► A seguir implementaremos os comandos ‘A seguir implementaremos os comandos ‘pegarpegar’ e’ e ‘‘deixardeixar’’  pegar/1 define um novo predicadopegar/1 define um novo predicado carrega/1carrega/1 com umacom uma cláusula para cada objeto que o jogador possuicláusula para cada objeto que o jogador possui  Inicialmente carrega/1 não está definido porque o jogadorInicialmente carrega/1 não está definido porque o jogador não carrega nadanão carrega nada pegar(X):- pode_pegar(X), pegar_objeto(X).pegar(X):- pode_pegar(X), pegar_objeto(X).  pode_pegar/1 é análoga a pode_ir/1pode_pegar/1 é análoga a pode_ir/1 pode_pegar(Objeto):- aqui(Lugar), local(Objeto, Lugar).pode_pegar(Objeto):- aqui(Lugar), local(Objeto, Lugar). pode_pegar(Objeto):-pode_pegar(Objeto):- write(‘Não há nenhum(a) ’), write(Objeto), write(‘ aqui.’),write(‘Não há nenhum(a) ’), write(Objeto), write(‘ aqui.’), nl, fail.nl, fail.
  • 13. Nani Search (6)Nani Search (6) ►Implementando os comandos ‘Implementando os comandos ‘pegarpegar’ e’ e ‘‘deixardeixar’’  pegar_objeto/1 é análoga a move/1pegar_objeto/1 é análoga a move/1 ►Remove uma cláusula de localização do objetoRemove uma cláusula de localização do objeto (local/2) e inclui uma cláusula carrega/1, refletindo a(local/2) e inclui uma cláusula carrega/1, refletindo a movimentação do objeto do lugar para o jogadormovimentação do objeto do lugar para o jogador pegar_objeto(X):-pegar_objeto(X):- retract(local(X,_)),retract(local(X,_)), asserta(carrega(X)),asserta(carrega(X)), write(‘ok’), nl.write(‘ok’), nl.
  • 14. Exercícios (1)Exercícios (1) ►Nani SearchNani Search  Escreva a cláusulaEscreva a cláusula deixar/1deixar/1 que remove aque remove a cláusula carrega/1 e adiciona a cláusula local/2cláusula carrega/1 e adiciona a cláusula local/2 na sala atualna sala atual  EscrevaEscreva inventario/0inventario/0, que lista os objetos que o, que lista os objetos que o jogador carregajogador carrega  Utilize vaipara/1, pegar/1, deixar/1, olhar/0 eUtilize vaipara/1, pegar/1, deixar/1, olhar/0 e inventario/0 para se mover ao redor e examinar oinventario/0 para se mover ao redor e examinar o ambiente do jogoambiente do jogo  Escreva os predicadosEscreva os predicados liga/1liga/1 ee desliga/1desliga/1 queque devem ser usados para ligar e desligar a lanternadevem ser usados para ligar e desligar a lanterna
  • 15. O que vem a seguir?O que vem a seguir? ►RecursãoRecursão ►Estruturas de DadosEstruturas de Dados ►......