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

Aula Prolog - 05

  • 1.
    Programação em LógicaProgramaçãoem 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
  • 2.
  • 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éticae 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)GerenciandoDados (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)GerenciandoDados (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)NaniSearch (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)NaniSearch (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)NaniSearch (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)NaniSearch (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)NaniSearch (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)NaniSearch (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) ►NaniSearchNani 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 vema seguir?O que vem a seguir? ►RecursãoRecursão ►Estruturas de DadosEstruturas de Dados ►......