Aula Prolog - 05

15
Programação em Lógica Programação em Lógica Matemática Matemática Prolog Prolog – 05 – – 05 – Inteligência Artificial Inteligência Artificial Fábio M. Pereira Fábio M. Pereira Baseado em Baseado em Amzi! inc. – www.amzi.com Amzi! inc. – www.amzi.com

Transcript of Aula Prolog - 05

Page 1: Aula Prolog - 05

Programação em Lógica Programação em Lógica MatemáticaMatemática

PrologProlog– 05 –– 05 –

Inteligência ArtificialInteligência ArtificialFábio M. PereiraFábio M. Pereira

Baseado emBaseado emAmzi! inc. – www.amzi.comAmzi! inc. – www.amzi.com

Page 2: Aula Prolog - 05

PrologProlog►AritméticaAritmética►Gerenciamento de DadosGerenciamento de Dados►ExercíciosExercícios

Page 3: Aula Prolog - 05

Aritmética (1)Aritmética (1)► Prolog deve possuir a habilidade de lidar com Prolog deve possuir a habilidade de lidar com

aritmética para se tornar uma linguagem de aritmé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 No entanto, aritmética não se encaixa naturalmente

ao esquema lógicoao esquema lógico O conceito de avaliação de uma expressão O conceito de avaliação de uma expressão

aritmética contrasta com o de casamento de padrõesaritmética contrasta com o de casamento de padrões► Por este motivo, Prolog fornece o predicado Por este motivo, Prolog fornece o predicado

interno ‘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>

Page 4: Aula Prolog - 05

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:X X >> Y Y X X << Y Y X X >=>= Y Y X X =<=< Y Y 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

Page 5: Aula Prolog - 05

Aritmética e PredicadosAritmética e Predicados►Operadores também podem ser usados em Operadores também podem ser usados em

regrasregras► 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

Page 6: Aula Prolog - 05

Gerenciando Dados (1)Gerenciando Dados (1)►Vimos que um programa Prolog é um Vimos que um programa Prolog é um

banco de dados de predicadosbanco de dados de predicados►Prolog nos permite manipular o banco Prolog nos permite manipular o banco

de dados diretamente e fornece de dados diretamente e fornece predicados internos para realizar esta predicados internos para realizar esta funçãofunção asserta(X)asserta(X)

►Adiciona a cláusula X como Adiciona a cláusula X como primeira cláusulaprimeira cláusula para o seu predicado. Como os outros para o seu predicado. Como os outros predicados I/O, sempre falha em backtracking e predicados I/O, sempre falha em backtracking e não desfaz o seu trabalhonão desfaz o seu trabalho

Page 7: Aula Prolog - 05

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 X O mesmo que asserta/1, mas adiciona a cláusula X

como como última cláusulaúltima cláusula do predicado do 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) Informa ao Prolog que as definições do(s) predicado(s) podem mudar durante a execuçãopredicado(s) podem mudar durante a execução:- dynamic:- dynamic

foo/0, baz/2.foo/0, baz/2.

Page 8: Aula Prolog - 05

Nani Search (1)Nani Search (1)► Precisamos manipular o banco de dados em Nani Precisamos 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 sido Para mudar as coisas que tenham sido seguradasseguradas e e 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 lugarvaipara(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 Podemos ir para uma sala se ela está conectada com a sala

onde estamosonde estamospode_ir(Lugar):- aqui(X), conexao(X, Lugar).pode_ir(Lugar):- aqui(X), conexao(X, Lugar).

Page 9: Aula Prolog - 05

Nani Search (2)Nani Search (2)► Podemos testar pode_ir/1 imediatamente (assumindo Podemos testar pode_ir/1 imediatamente (assumindo

que estamos na cozinha):que 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 Seria melhor se pode_ir/1 nos desse uma mensagem em caso de falhaem caso de falhapode_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

Page 10: Aula Prolog - 05

Nani Search (3)Nani Search (3)► Agora podemos desenvolver Agora podemos desenvolver move/1move/1

Atualiza o banco de dados dinamicamente para refletir Atualiza o banco de dados dinamicamente para refletir a nova localização do jogadora nova localização do jogador

Remove a cláusula aqui/1 e a substitui por uma nova Remove a cláusula aqui/1 e a substitui por uma nova cláusula de maneira que sempre exista apenas uma cláusula de maneira que sempre exista apenas uma cláusula aqui/1, representando a posição atual do cláusula aqui/1, representando a posição atual do jogadorjogador

Uma vez que vaipara/1 chama pode_ir/1 antes de Uma vez que vaipara/1 chama pode_ir/1 antes de aqui/1, o novo aqui/1 será sempre um lugar legal no aqui/1, o novo aqui/1 será sempre um lugar legal no jogojogo

move(Lugar):- retract(aqui(_)), asserta(aqui(Lugar)).move(Lugar):- retract(aqui(_)), asserta(aqui(Lugar)).►Mas antes devemos informar a Prolog que iremos Mas 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.

Page 11: Aula Prolog - 05

Nani Search (4)Nani Search (4)► Testando ...Testando ...

?- ?- vaipara(escritório).vaipara(escritório).Você está no(a) Você está no(a)

escritórioescritórioVocê pode ver:Você pode ver: escrivaninhaescrivaninha computadorcomputadorVocê 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ãoVocê pode ver:Você pode ver:Você pode ir para:Você pode ir para: sala de jantarsala de jantar escritórioescritórioYesYes

Page 12: Aula Prolog - 05

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 predicado pegar/1 define um novo predicado carrega/1 carrega/1 com com

uma cláusula para cada objeto que o jogador uma cláusula para cada objeto que o jogador possuipossui

Inicialmente carrega/1 não está definido porque o Inicialmente carrega/1 não está definido porque o jogador não carrega nadajogador nã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.

Page 13: Aula Prolog - 05

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 objeto Remove uma cláusula de localização do objeto (local/2) e inclui uma cláusula carrega/1, (local/2) e inclui uma cláusula carrega/1, refletindo a movimentação do objeto do lugar refletindo a movimentação do objeto do lugar para o jogadorpara o jogadorpegar_objeto(X):- pegar_objeto(X):-

retract(local(X,_)),retract(local(X,_)),asserta(carrega(X)),asserta(carrega(X)),write(‘ok’), nl.write(‘ok’), nl.

Page 14: Aula Prolog - 05

Exercícios (1)Exercícios (1)►Nani SearchNani Search

Escreva a cláusula Escreva a cláusula deixar/1deixar/1 que remove a que remove a cláusula carrega/1 e adiciona a cláusula cláusula carrega/1 e adiciona a cláusula local/2 na sala atuallocal/2 na sala atual

Escreva Escreva inventario/0inventario/0, que lista os objetos que , que lista os objetos que o jogador carregao jogador carrega

Utilize vaipara/1, pegar/1, deixar/1, olhar/0 e Utilize vaipara/1, pegar/1, deixar/1, olhar/0 e inventario/0 para se mover ao redor e inventario/0 para se mover ao redor e examinar o ambiente do jogoexaminar o ambiente do jogo

Escreva os predicados Escreva os predicados liga/1liga/1 e e desliga/1desliga/1 que que devem ser usados para ligar e desligar a devem ser usados para ligar e desligar a lanternalanterna

Page 15: Aula Prolog - 05

O que vem a seguir?O que vem a seguir?

►RecursãoRecursão►Estruturas de DadosEstruturas de Dados► ......