SlideShare uma empresa Scribd logo
1 de 24
Programação em LógicaProgramação em Lógica
MatemáticaMatemática
PrologProlog
– 04 –– 04 –
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
►RegrasRegras
►Como Regras FuncionamComo Regras Funcionam
►Usando RegrasUsando Regras
►ExercíciosExercícios
RegrasRegras
►Um predicado é definido por cláusulas, queUm predicado é definido por cláusulas, que
podem ser fatos ou regraspodem ser fatos ou regras
►Uma regra não é nada mais que umaUma regra não é nada mais que uma
consulta armazenadaconsulta armazenada
►A sua sintaxe éA sua sintaxe é
 cabeça :- corpo.cabeça :- corpo.
 cabeçacabeça – uma definição do predicado (da mesma– uma definição do predicado (da mesma
forma como um fatoforma como um fato
 :-:- – o símbolo de– o símbolo de pescoçopescoço, as vezes lido como, as vezes lido como
“se”“se”
 corpocorpo – um ou mais objetivos (uma consulta)– um ou mais objetivos (uma consulta)
Exemplo (1)Exemplo (1)
► Uma consulta que encontra onde as coisasUma consulta que encontra onde as coisas
comestíveis estão pode ser armazenada como umacomestíveis estão pode ser armazenada como uma
regra com o predicado de nomeregra com o predicado de nome local_comida/2local_comida/2
local_comida(X,Y) :- local(X,Y), comestivel(X).local_comida(X,Y) :- local(X,Y), comestivel(X).
 Existe algum X para comer na sala Y se X está localizadoExiste algum X para comer na sala Y se X está localizado
em Y e X é comestívelem Y e X é comestível
► Utilizando ...Utilizando ...
?-?- local_comida(X, cozinha).local_comida(X, cozinha).
X = maçã ;X = maçã ;
X = biscoito ;X = biscoito ;
NoNo
?-?- local_comida(Comida, ‘sala de jantar’).local_comida(Comida, ‘sala de jantar’).
NoNo
Exemplo (2)Exemplo (2)
► Podemos checar por coisas específicasPodemos checar por coisas específicas
?-?- local_comida(maçã, cozinha).local_comida(maçã, cozinha).
YesYes
► Ou podemos listar tudoOu podemos listar tudo
?-?- local_comida(Comida, Sala).local_comida(Comida, Sala).
Comida = maçãComida = maçã
Sala = cozinha ;Sala = cozinha ;
Comida = biscoitoComida = biscoito
Sala = cozinha ;Sala = cozinha ;
NoNo
Múltiplas CláusulasMúltiplas Cláusulas
► Da mesma forma que podemos ter múltiplos fatosDa mesma forma que podemos ter múltiplos fatos
definindo um predicado, também podemos terdefinindo um predicado, também podemos ter
múltiplas regrasmúltiplas regras
► Se quisermos oSe quisermos o brócolisbrócolis incluído emincluído em local_comida/2local_comida/2
local_comida(X,Y) :- local(X,Y), comestivel(X).local_comida(X,Y) :- local(X,Y), comestivel(X).
local_comida(X,Y) :- local(X,Y), gosto_ruim(X).local_comida(X,Y) :- local(X,Y), gosto_ruim(X).
► Agora ...Agora ...
?-?- local_comida(X, cozinha).local_comida(X, cozinha).
X = maçã ;X = maçã ;
X = biscoito ;X = biscoito ;
X = brócolis ;X = brócolis ;
NoNo
Como Regras FuncionamComo Regras Funcionam
► Com regras, Prolog unifica o objetivo padrão com aCom regras, Prolog unifica o objetivo padrão com a
cabeça da cláusulacabeça da cláusula
► Se a unificação é bem sucedida, então Prolog iniciaSe a unificação é bem sucedida, então Prolog inicia
uma nova consulta usando os objetivos do corpo dauma nova consulta usando os objetivos do corpo da
cláusulacláusula
► Regras, em seu efeito, levam a múltiplos níveis deRegras, em seu efeito, levam a múltiplos níveis de
consultasconsultas
 O primeiro nível é composto do objetivo originalO primeiro nível é composto do objetivo original
 O próximo nível é uma nova consulta composta deO próximo nível é uma nova consulta composta de
objetivos encontrados no corpo da cláusula do primeiroobjetivos encontrados no corpo da cláusula do primeiro
nívelnível
 Cada nível pode criar níveis mais profundosCada nível pode criar níveis mais profundos
 Teoricamente, isto pode continuar indefinidamente, naTeoricamente, isto pode continuar indefinidamente, na
prática, continua até o limite de memória disponívelprática, continua até o limite de memória disponível
Controle de Fluxo com RegrasControle de Fluxo com Regras
► Note como o backtracking a partir do segundoNote como o backtracking a partir do segundo
objetivo do primeiro nível agora leva ao segundoobjetivo do primeiro nível agora leva ao segundo
nívelnível
► Neste exemplo, o objetivo central do primeiro nívelNeste exemplo, o objetivo central do primeiro nível
é bem sucedido ou falha se o seu corpo é bemé bem sucedido ou falha se o seu corpo é bem
sucedido ou falhasucedido ou falha
[debug] ?- local_comida(Comida,cozinha).
Call: (7) local_comida(_G286, cozinha) ? creep
Call: (8) local(_G286, cozinha) ? creep
Exit: (8) local(maçã, cozinha) ? creep
Call: (8) comestivel(maçã) ? creep
Exit: (8) comestivel(maçã) ? creep
Exit: (7) local_comida(maçã, cozinha) ? creep
Comida = maçã ;
Fail: (8) comestivel(maçã) ? creep
Redo: (8) local(_G286, cozinha) ? creep
Exit: (8) local(brócolis, cozinha) ? creep
Call: (8) comestivel(brócolis) ? creep
Fail: (8) comestivel(brócolis) ? creep
Redo: (8) local(_G286, cozinha) ? creep
Exit: (8) local(biscoito, cozinha) ? creep
Call: (8) comestivel(biscoito) ? creep
Exit: (8) comestivel(biscoito) ? creep
Exit: (7) local_comida(biscoito, cozinha) ? creep
Comida = biscoito ;
Fail: (8) comestivel(biscoito) ? creep
Redo: (8) local(_G286, cozinha) ? creep
Fail: (8) local(_G286, cozinha) ? creep
Redo: (7) local_comida(_G286, cozinha) ? creep
Call: (8) local(_G286, cozinha) ? creep
Exit: (8) local(maçã, cozinha) ? creep
Call: (8) gosto_ruim(maçã) ? creep
Fail: (8) gosto_ruim(maçã) ? creep
Redo: (8) local(_G286, cozinha) ? creep
Exit: (8) local(brócolis, cozinha) ? creep
Call: (8) gosto_ruim(brócolis) ? creep
Exit: (8) gosto_ruim(brócolis) ? creep
Exit: (7) local_comida(brócolis, cozinha) ? creep
Comida = brócolis ;
Fail: (8) gosto_ruim(brócolis) ? creep
Redo: (8) local(_G286, cozinha) ? creep
Exit: (8) local(biscoito, cozinha) ? creep
Call: (8) gosto_ruim(biscoito) ? creep
Fail: (8) gosto_ruim(biscoito) ? creep
Redo: (8) local(_G286, cozinha) ? creep
Fail: (8) local(_G286, cozinha) ? creep
Fail: (7) local_comida(_G286, cozinha) ? creep
No
Rastreamento de local_comida/2Rastreamento de local_comida/2
Usando Regras (1)Usando Regras (1)
► Através do uso de regras, podemos solucionar oAtravés do uso de regras, podemos solucionar o
problema das portas com um único caminhoproblema das portas com um único caminho
► Podemos definir um novo predicado dePodemos definir um novo predicado de doisdois
caminhoscaminhos, com duas cláusulas, chamado, com duas cláusulas, chamado conexao/2conexao/2
conexao(X,Y):- porta(X,Y).conexao(X,Y):- porta(X,Y).
conexao(X,Y):- porta(Y,X).conexao(X,Y):- porta(Y,X).
 A sala X está conectada à sala Y se existe uma porta deA sala X está conectada à sala Y se existe uma porta de
X a Y,X a Y, ouou se existe uma porta de Y a Xse existe uma porta de Y a X
?-?- conexao(cozinha, escritório).conexao(cozinha, escritório).
YesYes
?-?- conexao(escritório, cozinha).conexao(escritório, cozinha).
YesYes
Usando Regras (2)Usando Regras (2)
► Podemos agora listar todas as conexões (o dobro doPodemos agora listar todas as conexões (o dobro do
número de portas) com uma consulta geralnúmero de portas) com uma consulta geral
?-?- conexao(X,Y).conexao(X,Y).
X = escritórioX = escritório
Y = saguão ;Y = saguão ;
X = cozinhaX = cozinha
Y = escritório ;Y = escritório ;
......
X = saguãoX = saguão
Y = escritório ;Y = escritório ;
X = escritórioX = escritório
Y = cozinha ;Y = cozinha ;
......
Nani Search (1)Nani Search (1)
► Podemos agora acrescentar novas regras a NaniPodemos agora acrescentar novas regras a Nani
SearchSearch
► olhar/0olhar/0 – irá informar ao jogador onde ele/ela está,– irá informar ao jogador onde ele/ela está,
quais objetos existem na sala, e quais as salasquais objetos existem na sala, e quais as salas
adjacentesadjacentes
► Iniciaremos comIniciaremos com lista_objetos/1lista_objetos/1, que lista todos os, que lista todos os
objetos em uma salaobjetos em uma sala
lista_objetos(Lugar):- local(X, Lugar), tab(2), write(X), nl,lista_objetos(Lugar):- local(X, Lugar), tab(2), write(X), nl,
fail.fail.
 Agora podemos usarAgora podemos usar
?-?- lista_objetos(cozinha).lista_objetos(cozinha).
maçãmaçã
brócolisbrócolis
biscoitobiscoito
NoNo
Nani Search (2)Nani Search (2)
► Existe um pequeno problema comExiste um pequeno problema com lista_objetos/1lista_objetos/1
 Ela nos dá a lista, mas sempre falhaEla nos dá a lista, mas sempre falha
 Tudo bem, se a chamamos diretamente, mas não permiteTudo bem, se a chamamos diretamente, mas não permite
o uso em conjunção com outras regras que a seguem (ao uso em conjunção com outras regras que a seguem (a
direita do diagrama)direita do diagrama)
► Solucionaremos este problema adicionando umaSolucionaremos este problema adicionando uma
segunda cláusulasegunda cláusula lista_objetos/1lista_objetos/1 que sempre é bemque sempre é bem
sucedidasucedida
lista_objetos(Lugar):- local(X, Lugar), tab(2), write(X), nl,lista_objetos(Lugar):- local(X, Lugar), tab(2), write(X), nl,
fail.fail.
lista_objetos(QualquerLugar).lista_objetos(QualquerLugar).
Nani Search (3)Nani Search (3)
► Agora, quando a primeira cláusula falha, a segundaAgora, quando a primeira cláusula falha, a segunda
cláusula será tentadacláusula será tentada
 Uma vez que o seu argumento é uma variável, ela casaráUma vez que o seu argumento é uma variável, ela casará
com sucesso com qualquer coisa, causandocom sucesso com qualquer coisa, causando
lista_objetos/1lista_objetos/1 ser sempre bem sucedida e sair pela portaser sempre bem sucedida e sair pela porta
‘‘ExitExit’’
► Como na segunda cláusula deComo na segunda cláusula de lista_objetos/1lista_objetos/1 nósnós
não nos preocupamos com o valor da variável, ela énão nos preocupamos com o valor da variável, ela é
simplesmente um “simplesmente um “marcador de lugarmarcador de lugar””
 Para estas situações existe uma variável especialPara estas situações existe uma variável especial
chamada dechamada de variável anônimavariável anônima, representada por um, representada por um
underscore (_)underscore (_)
lista_objetos(_).lista_objetos(_).
Nani Search (4)Nani Search (4)
► Agora escreveremos o predicadoAgora escreveremos o predicado lista_conexoes/1lista_conexoes/1,,
que mostra todas as conexões de uma salaque mostra todas as conexões de uma sala
► Uma vez que regras podem referenciar outrasUma vez que regras podem referenciar outras
regras, bem como fatos, podemos escreverregras, bem como fatos, podemos escrever
lista_conexoes/1lista_conexoes/1 da mesma forma queda mesma forma que
lista_objetos/1lista_objetos/1 usando a regrausando a regra conexao/2conexao/2
lista_conexoes(Lugar):- conexao(Lugar, X), tab(2), write(X),lista_conexoes(Lugar):- conexao(Lugar, X), tab(2), write(X),
nl, fail.nl, fail.
lista_conexoes(_).lista_conexoes(_).
► Testando ...Testando ...
?-?- lista_conexoes(saguão).lista_conexoes(saguão).
sala de jantarsala de jantar
escritórioescritório
YesYes
Nani Search (5)Nani Search (5)
► Agora estamos prontos para escreverAgora estamos prontos para escrever olhar/0olhar/0
► O fato únicoO fato único aqui(cozinha)aqui(cozinha) nos informa ondenos informa onde
estamos no jogoestamos no jogo
 Veremos mais a frente como dinamicamente mudarVeremos mais a frente como dinamicamente mudar
aqui/1aqui/1
► Podemos usá-lo junto com os dois predicados dePodemos usá-lo junto com os dois predicados de
listagem para escreverlistagem para escrever olhar/0olhar/0
olhar :-olhar :-
aqui(Lugar),aqui(Lugar),
write(‘Você está no(a) ’), write(Lugar), nl,write(‘Você está no(a) ’), write(Lugar), nl,
write(‘Você pode ver:’), nl, lista_objetos(Lugar),write(‘Você pode ver:’), nl, lista_objetos(Lugar),
write(‘Você pode ir para:’), nl, lista_conexoes(Lugar).write(‘Você pode ir para:’), nl, lista_conexoes(Lugar).
Nani Search (6)Nani Search (6)
► Veremos como funcionaVeremos como funciona olhar/0olhar/0
?-?- olhar.olhar.
Você está no(a) cozinhaVocê está no(a) cozinha
Você pode ver:Você pode ver:
maçãmaçã
brócolisbrócolis
biscoitobiscoito
Você pode ir para:Você pode ir para:
escritórioescritório
porãoporão
sala de jantarsala de jantar
YesYes
–– Sumário –Sumário –
►Regras PrologRegras Prolog
 Um programa Prolog é um banco de dados deUm programa Prolog é um banco de dados de
fatosfatos ee regrasregras inter-relacionadasinter-relacionadas
 As regras se comunicam através deAs regras se comunicam através de unificaçãounificação ––
casamento de padrões interno de Prologcasamento de padrões interno de Prolog
 As regras se comunicam com o usuário atravésAs regras se comunicam com o usuário através
dede predicados internospredicados internos comocomo write/1write/1
 Regras podem serRegras podem ser consultadasconsultadas individualmenteindividualmente
através do promptatravés do prompt
–– Sumário –Sumário –
►Controle de Fluxo em PrologControle de Fluxo em Prolog
 O comportamento de execução das regras éO comportamento de execução das regras é
controlado pelo mecanismo de busca interno decontrolado pelo mecanismo de busca interno de
Prolog chamadoProlog chamado backtrackingbacktracking
 Podemos forçar o backtracking com o predicadoPodemos forçar o backtracking com o predicado
internointerno fail/0fail/0
 Podemos forçar o sucesso de um predicadoPodemos forçar o sucesso de um predicado
adicionando uma cláusula final com umaadicionando uma cláusula final com uma variávelvariável
anônimaanônima como argumento e sem corpocomo argumento e sem corpo
–– Sumário –Sumário –
► Aspectos de Programação em PrologAspectos de Programação em Prolog
 FatosFatos no banco de dados (localizações, portas, ...)no banco de dados (localizações, portas, ...)
substituem a definição convencional desubstituem a definição convencional de dadosdados
 A busca porA busca por backtrackingbacktracking (lista_objetos/1) substitui a(lista_objetos/1) substitui a
codificação de muitos construtores decodificação de muitos construtores de laçoslaços
 A troca de controle através doA troca de controle através do casamento decasamento de
padrõespadrões (conexao/2) substitui(conexao/2) substitui testes condicionaistestes condicionais ee
estruturas deestruturas de ramificaçãoramificação
 As regras podem ser testadas individualmente,As regras podem ser testadas individualmente,
encorajando oencorajando o desenvolvimento modulardesenvolvimento modular
 Regras podem chamar regras encorajando práticasRegras podem chamar regras encorajando práticas
de programação dede programação de abstração proceduralabstração procedural ee
abstração de dadosabstração de dados
► olhar/0 não sabe como lista_objetos/1 funciona e como os dadosolhar/0 não sabe como lista_objetos/1 funciona e como os dados
de local estão armazenadosde local estão armazenados
Exercícios (1)Exercícios (1)
►Considerando o seguinte banco de dadosConsiderando o seguinte banco de dados
a(a1, 1).a(a1, 1). b(1, b1).b(1, b1).
a(A, 2).a(A, 2). b(2, B).b(2, B).
a(a3, N).a(a3, N). b(N, b3).b(N, b3).
c(X,Y):- a(X,N), b(N,Y).c(X,Y):- a(X,N), b(N,Y).
d(X,Y):- a(X,N), b(Y,N).d(X,Y):- a(X,N), b(Y,N).
d(X,Y):- a(N,X), b(N,Y).d(X,Y):- a(N,X), b(N,Y).
►Qual o resultado das consultasQual o resultado das consultas
?-?- a(X, 2).a(X, 2). ?-?- b(X, kalamazoo).b(X, kalamazoo).
?-?- c(X, b3).c(X, b3). ?-?- c(X, Y).c(X, Y). ?-?- d(X, Y).d(X, Y).
Exercícios (2)Exercícios (2)
► Banco de Dados GenealógicoBanco de Dados Genealógico
 Crie regras para vários relacionamentos familiares queCrie regras para vários relacionamentos familiares que
foram desenvolvidos como consultas na aula anteriorforam desenvolvidos como consultas na aula anterior
mae(M, F):- pais(M, F), mulher(M).mae(M, F):- pais(M, F), mulher(M).
 Crie uma regra para irmãosCrie uma regra para irmãos
► Rastreie o predicado para visualizar o seu funcionamentoRastreie o predicado para visualizar o seu funcionamento
 Podemos resolver o problema de indivíduos seremPodemos resolver o problema de indivíduos serem
irmãos deles mesmos através do predicado interno que éirmãos deles mesmos através do predicado interno que é
bem sucedido caso dois valores sejam diferentes e falhabem sucedido caso dois valores sejam diferentes e falha
caso sejam iguaiscaso sejam iguais
► O predicado é = (X,Y).O predicado é = (X,Y).
► Também podemos escrevê-lo na forma X = YTambém podemos escrevê-lo na forma X = Y
 Use o predicado irmãos para definir regras adicionaisUse o predicado irmãos para definir regras adicionais
para irmãos, irmãs, tios, tias e primospara irmãos, irmãs, tios, tias e primos
Exercícios (3)Exercícios (3)
► Banco de Dados GenealógicoBanco de Dados Genealógico
 O predicado para representar casamento leva aoO predicado para representar casamento leva ao
problema da porta com dois caminhos (porta/2)problema da porta com dois caminhos (porta/2)
► Utilize uma solução idêntica para implementá-loUtilize uma solução idêntica para implementá-lo
 Adicione regras para tios e tias que consiga acrescentarAdicione regras para tios e tias que consiga acrescentar
tios e tias por casamento e não apenas por sanguetios e tias por casamento e não apenas por sangue
 Escreva um predicado para avôEscreva um predicado para avô
► Rastreie o uso de avo(alguem, X). e avo(X, alguem). queRastreie o uso de avo(alguem, X). e avo(X, alguem). que
encontra avôs e netosencontra avôs e netos
► Dependendo de como você escrevê-lo, ele poderá precisar deDependendo de como você escrevê-lo, ele poderá precisar de
muito mais passos em uma consulta que em outramuito mais passos em uma consulta que em outra
► Escreva dois predicados, um chamado avo/2 e outro chamadoEscreva dois predicados, um chamado avo/2 e outro chamado
neto/2neto/2
► Certifique-se de que ambos são eficientesCertifique-se de que ambos são eficientes
O que vem a seguir?O que vem a seguir?
►AritméticaAritmética
►Gerenciando DadosGerenciando Dados
►......

Mais conteúdo relacionado

Mais procurados

Mais procurados (20)

Minicurso Prolog
Minicurso PrologMinicurso Prolog
Minicurso Prolog
 
Linguagem Prolog - Antonio Rufino
Linguagem Prolog - Antonio RufinoLinguagem Prolog - Antonio Rufino
Linguagem Prolog - Antonio Rufino
 
Listas em Prolog
Listas em PrologListas em Prolog
Listas em Prolog
 
Seminário Prolog
Seminário PrologSeminário Prolog
Seminário Prolog
 
Aula prolog 02 ia
Aula prolog 02   iaAula prolog 02   ia
Aula prolog 02 ia
 
Introdução a python
Introdução a pythonIntrodução a python
Introdução a python
 
Programacao logica
Programacao logicaProgramacao logica
Programacao logica
 
Recursividade
RecursividadeRecursividade
Recursividade
 
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
 
Python 01
Python 01Python 01
Python 01
 
Aula 02 - Curso PHP e MySQL
Aula 02 - Curso PHP e MySQLAula 02 - Curso PHP e MySQL
Aula 02 - Curso PHP e MySQL
 
Palestra python
Palestra pythonPalestra python
Palestra python
 
Apostila aed
Apostila aedApostila aed
Apostila aed
 
Python 03
Python 03Python 03
Python 03
 
Perl Moderno, dia5
Perl Moderno, dia5Perl Moderno, dia5
Perl Moderno, dia5
 
Estrutura de Dados - Aula 06
Estrutura de Dados - Aula 06Estrutura de Dados - Aula 06
Estrutura de Dados - Aula 06
 
Estrutura de Dados - Aula 04
Estrutura de Dados - Aula 04Estrutura de Dados - Aula 04
Estrutura de Dados - Aula 04
 
Estrutura de Dados - Aula 08
Estrutura de Dados - Aula 08Estrutura de Dados - Aula 08
Estrutura de Dados - Aula 08
 
Aprendendo Kotlin na Prática
Aprendendo Kotlin na PráticaAprendendo Kotlin na Prática
Aprendendo Kotlin na Prática
 

Destaque

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
 
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
 
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
 
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 - Introdução
Programação Concorrente - IntroduçãoProgramação Concorrente - Introdução
Programação Concorrente - IntroduçãoFabio 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
 

Destaque (20)

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
 
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
 
Haskell - Introdução
Haskell - IntroduçãoHaskell - Introdução
Haskell - Introdução
 
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
 
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
 
05 - Sincronização de Threads - I
05 - Sincronização de Threads - I05 - Sincronização de Threads - I
05 - Sincronização de Threads - I
 
Aula Tratamento de Exceções
Aula Tratamento de ExceçõesAula Tratamento de Exceções
Aula Tratamento de Exceções
 
Programação Concorrente - Introdução
Programação Concorrente - IntroduçãoProgramação Concorrente - Introdução
Programação Concorrente - Introdução
 
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
 
PHP - Strings
PHP - StringsPHP - Strings
PHP - Strings
 
Curso de PHP - Objetos
Curso de PHP - ObjetosCurso de PHP - Objetos
Curso de PHP - Objetos
 
Aula 05 - Java Script Básico
Aula 05 -  Java Script BásicoAula 05 -  Java Script Básico
Aula 05 - Java Script Básico
 
Aprendendo Action Script 2.0
Aprendendo  Action Script 2.0Aprendendo  Action Script 2.0
Aprendendo Action Script 2.0
 
PHP - Funções
PHP - FunçõesPHP - Funções
PHP - Funções
 
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
 
PHP - Introdução
PHP - IntroduçãoPHP - Introdução
PHP - Introdução
 

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
 
Desenvolvimento de Jogos - Game Design
Desenvolvimento de Jogos - Game DesignDesenvolvimento de Jogos - Game Design
Desenvolvimento de Jogos - Game DesignFabio 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 - Mercado Parte 1
Desenvolvimento de Jogos - Mercado Parte 1Desenvolvimento de Jogos - Mercado Parte 1
Desenvolvimento de Jogos - Mercado Parte 1Fabio 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 - Arrays
Curso de PHP - ArraysCurso de PHP - Arrays
Curso de PHP - Arrays
 
Desenvolvimento de Jogos - Game Design
Desenvolvimento de Jogos - Game DesignDesenvolvimento de Jogos - Game Design
Desenvolvimento de Jogos - Game Design
 
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 - Mercado Parte 1
Desenvolvimento de Jogos - Mercado Parte 1Desenvolvimento de Jogos - Mercado Parte 1
Desenvolvimento de Jogos - Mercado Parte 1
 

Prolog 04 - Regras

  • 1. Programação em LógicaProgramação em Lógica MatemáticaMatemática PrologProlog – 04 –– 04 – 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 ►RegrasRegras ►Como Regras FuncionamComo Regras Funcionam ►Usando RegrasUsando Regras ►ExercíciosExercícios
  • 3. RegrasRegras ►Um predicado é definido por cláusulas, queUm predicado é definido por cláusulas, que podem ser fatos ou regraspodem ser fatos ou regras ►Uma regra não é nada mais que umaUma regra não é nada mais que uma consulta armazenadaconsulta armazenada ►A sua sintaxe éA sua sintaxe é  cabeça :- corpo.cabeça :- corpo.  cabeçacabeça – uma definição do predicado (da mesma– uma definição do predicado (da mesma forma como um fatoforma como um fato  :-:- – o símbolo de– o símbolo de pescoçopescoço, as vezes lido como, as vezes lido como “se”“se”  corpocorpo – um ou mais objetivos (uma consulta)– um ou mais objetivos (uma consulta)
  • 4. Exemplo (1)Exemplo (1) ► Uma consulta que encontra onde as coisasUma consulta que encontra onde as coisas comestíveis estão pode ser armazenada como umacomestíveis estão pode ser armazenada como uma regra com o predicado de nomeregra com o predicado de nome local_comida/2local_comida/2 local_comida(X,Y) :- local(X,Y), comestivel(X).local_comida(X,Y) :- local(X,Y), comestivel(X).  Existe algum X para comer na sala Y se X está localizadoExiste algum X para comer na sala Y se X está localizado em Y e X é comestívelem Y e X é comestível ► Utilizando ...Utilizando ... ?-?- local_comida(X, cozinha).local_comida(X, cozinha). X = maçã ;X = maçã ; X = biscoito ;X = biscoito ; NoNo ?-?- local_comida(Comida, ‘sala de jantar’).local_comida(Comida, ‘sala de jantar’). NoNo
  • 5. Exemplo (2)Exemplo (2) ► Podemos checar por coisas específicasPodemos checar por coisas específicas ?-?- local_comida(maçã, cozinha).local_comida(maçã, cozinha). YesYes ► Ou podemos listar tudoOu podemos listar tudo ?-?- local_comida(Comida, Sala).local_comida(Comida, Sala). Comida = maçãComida = maçã Sala = cozinha ;Sala = cozinha ; Comida = biscoitoComida = biscoito Sala = cozinha ;Sala = cozinha ; NoNo
  • 6. Múltiplas CláusulasMúltiplas Cláusulas ► Da mesma forma que podemos ter múltiplos fatosDa mesma forma que podemos ter múltiplos fatos definindo um predicado, também podemos terdefinindo um predicado, também podemos ter múltiplas regrasmúltiplas regras ► Se quisermos oSe quisermos o brócolisbrócolis incluído emincluído em local_comida/2local_comida/2 local_comida(X,Y) :- local(X,Y), comestivel(X).local_comida(X,Y) :- local(X,Y), comestivel(X). local_comida(X,Y) :- local(X,Y), gosto_ruim(X).local_comida(X,Y) :- local(X,Y), gosto_ruim(X). ► Agora ...Agora ... ?-?- local_comida(X, cozinha).local_comida(X, cozinha). X = maçã ;X = maçã ; X = biscoito ;X = biscoito ; X = brócolis ;X = brócolis ; NoNo
  • 7. Como Regras FuncionamComo Regras Funcionam ► Com regras, Prolog unifica o objetivo padrão com aCom regras, Prolog unifica o objetivo padrão com a cabeça da cláusulacabeça da cláusula ► Se a unificação é bem sucedida, então Prolog iniciaSe a unificação é bem sucedida, então Prolog inicia uma nova consulta usando os objetivos do corpo dauma nova consulta usando os objetivos do corpo da cláusulacláusula ► Regras, em seu efeito, levam a múltiplos níveis deRegras, em seu efeito, levam a múltiplos níveis de consultasconsultas  O primeiro nível é composto do objetivo originalO primeiro nível é composto do objetivo original  O próximo nível é uma nova consulta composta deO próximo nível é uma nova consulta composta de objetivos encontrados no corpo da cláusula do primeiroobjetivos encontrados no corpo da cláusula do primeiro nívelnível  Cada nível pode criar níveis mais profundosCada nível pode criar níveis mais profundos  Teoricamente, isto pode continuar indefinidamente, naTeoricamente, isto pode continuar indefinidamente, na prática, continua até o limite de memória disponívelprática, continua até o limite de memória disponível
  • 8. Controle de Fluxo com RegrasControle de Fluxo com Regras ► Note como o backtracking a partir do segundoNote como o backtracking a partir do segundo objetivo do primeiro nível agora leva ao segundoobjetivo do primeiro nível agora leva ao segundo nívelnível ► Neste exemplo, o objetivo central do primeiro nívelNeste exemplo, o objetivo central do primeiro nível é bem sucedido ou falha se o seu corpo é bemé bem sucedido ou falha se o seu corpo é bem sucedido ou falhasucedido ou falha
  • 9. [debug] ?- local_comida(Comida,cozinha). Call: (7) local_comida(_G286, cozinha) ? creep Call: (8) local(_G286, cozinha) ? creep Exit: (8) local(maçã, cozinha) ? creep Call: (8) comestivel(maçã) ? creep Exit: (8) comestivel(maçã) ? creep Exit: (7) local_comida(maçã, cozinha) ? creep Comida = maçã ; Fail: (8) comestivel(maçã) ? creep Redo: (8) local(_G286, cozinha) ? creep Exit: (8) local(brócolis, cozinha) ? creep Call: (8) comestivel(brócolis) ? creep Fail: (8) comestivel(brócolis) ? creep Redo: (8) local(_G286, cozinha) ? creep Exit: (8) local(biscoito, cozinha) ? creep Call: (8) comestivel(biscoito) ? creep Exit: (8) comestivel(biscoito) ? creep Exit: (7) local_comida(biscoito, cozinha) ? creep Comida = biscoito ; Fail: (8) comestivel(biscoito) ? creep Redo: (8) local(_G286, cozinha) ? creep Fail: (8) local(_G286, cozinha) ? creep Redo: (7) local_comida(_G286, cozinha) ? creep Call: (8) local(_G286, cozinha) ? creep Exit: (8) local(maçã, cozinha) ? creep Call: (8) gosto_ruim(maçã) ? creep Fail: (8) gosto_ruim(maçã) ? creep Redo: (8) local(_G286, cozinha) ? creep Exit: (8) local(brócolis, cozinha) ? creep Call: (8) gosto_ruim(brócolis) ? creep Exit: (8) gosto_ruim(brócolis) ? creep Exit: (7) local_comida(brócolis, cozinha) ? creep Comida = brócolis ; Fail: (8) gosto_ruim(brócolis) ? creep Redo: (8) local(_G286, cozinha) ? creep Exit: (8) local(biscoito, cozinha) ? creep Call: (8) gosto_ruim(biscoito) ? creep Fail: (8) gosto_ruim(biscoito) ? creep Redo: (8) local(_G286, cozinha) ? creep Fail: (8) local(_G286, cozinha) ? creep Fail: (7) local_comida(_G286, cozinha) ? creep No Rastreamento de local_comida/2Rastreamento de local_comida/2
  • 10. Usando Regras (1)Usando Regras (1) ► Através do uso de regras, podemos solucionar oAtravés do uso de regras, podemos solucionar o problema das portas com um único caminhoproblema das portas com um único caminho ► Podemos definir um novo predicado dePodemos definir um novo predicado de doisdois caminhoscaminhos, com duas cláusulas, chamado, com duas cláusulas, chamado conexao/2conexao/2 conexao(X,Y):- porta(X,Y).conexao(X,Y):- porta(X,Y). conexao(X,Y):- porta(Y,X).conexao(X,Y):- porta(Y,X).  A sala X está conectada à sala Y se existe uma porta deA sala X está conectada à sala Y se existe uma porta de X a Y,X a Y, ouou se existe uma porta de Y a Xse existe uma porta de Y a X ?-?- conexao(cozinha, escritório).conexao(cozinha, escritório). YesYes ?-?- conexao(escritório, cozinha).conexao(escritório, cozinha). YesYes
  • 11. Usando Regras (2)Usando Regras (2) ► Podemos agora listar todas as conexões (o dobro doPodemos agora listar todas as conexões (o dobro do número de portas) com uma consulta geralnúmero de portas) com uma consulta geral ?-?- conexao(X,Y).conexao(X,Y). X = escritórioX = escritório Y = saguão ;Y = saguão ; X = cozinhaX = cozinha Y = escritório ;Y = escritório ; ...... X = saguãoX = saguão Y = escritório ;Y = escritório ; X = escritórioX = escritório Y = cozinha ;Y = cozinha ; ......
  • 12. Nani Search (1)Nani Search (1) ► Podemos agora acrescentar novas regras a NaniPodemos agora acrescentar novas regras a Nani SearchSearch ► olhar/0olhar/0 – irá informar ao jogador onde ele/ela está,– irá informar ao jogador onde ele/ela está, quais objetos existem na sala, e quais as salasquais objetos existem na sala, e quais as salas adjacentesadjacentes ► Iniciaremos comIniciaremos com lista_objetos/1lista_objetos/1, que lista todos os, que lista todos os objetos em uma salaobjetos em uma sala lista_objetos(Lugar):- local(X, Lugar), tab(2), write(X), nl,lista_objetos(Lugar):- local(X, Lugar), tab(2), write(X), nl, fail.fail.  Agora podemos usarAgora podemos usar ?-?- lista_objetos(cozinha).lista_objetos(cozinha). maçãmaçã brócolisbrócolis biscoitobiscoito NoNo
  • 13. Nani Search (2)Nani Search (2) ► Existe um pequeno problema comExiste um pequeno problema com lista_objetos/1lista_objetos/1  Ela nos dá a lista, mas sempre falhaEla nos dá a lista, mas sempre falha  Tudo bem, se a chamamos diretamente, mas não permiteTudo bem, se a chamamos diretamente, mas não permite o uso em conjunção com outras regras que a seguem (ao uso em conjunção com outras regras que a seguem (a direita do diagrama)direita do diagrama) ► Solucionaremos este problema adicionando umaSolucionaremos este problema adicionando uma segunda cláusulasegunda cláusula lista_objetos/1lista_objetos/1 que sempre é bemque sempre é bem sucedidasucedida lista_objetos(Lugar):- local(X, Lugar), tab(2), write(X), nl,lista_objetos(Lugar):- local(X, Lugar), tab(2), write(X), nl, fail.fail. lista_objetos(QualquerLugar).lista_objetos(QualquerLugar).
  • 14. Nani Search (3)Nani Search (3) ► Agora, quando a primeira cláusula falha, a segundaAgora, quando a primeira cláusula falha, a segunda cláusula será tentadacláusula será tentada  Uma vez que o seu argumento é uma variável, ela casaráUma vez que o seu argumento é uma variável, ela casará com sucesso com qualquer coisa, causandocom sucesso com qualquer coisa, causando lista_objetos/1lista_objetos/1 ser sempre bem sucedida e sair pela portaser sempre bem sucedida e sair pela porta ‘‘ExitExit’’ ► Como na segunda cláusula deComo na segunda cláusula de lista_objetos/1lista_objetos/1 nósnós não nos preocupamos com o valor da variável, ela énão nos preocupamos com o valor da variável, ela é simplesmente um “simplesmente um “marcador de lugarmarcador de lugar””  Para estas situações existe uma variável especialPara estas situações existe uma variável especial chamada dechamada de variável anônimavariável anônima, representada por um, representada por um underscore (_)underscore (_) lista_objetos(_).lista_objetos(_).
  • 15. Nani Search (4)Nani Search (4) ► Agora escreveremos o predicadoAgora escreveremos o predicado lista_conexoes/1lista_conexoes/1,, que mostra todas as conexões de uma salaque mostra todas as conexões de uma sala ► Uma vez que regras podem referenciar outrasUma vez que regras podem referenciar outras regras, bem como fatos, podemos escreverregras, bem como fatos, podemos escrever lista_conexoes/1lista_conexoes/1 da mesma forma queda mesma forma que lista_objetos/1lista_objetos/1 usando a regrausando a regra conexao/2conexao/2 lista_conexoes(Lugar):- conexao(Lugar, X), tab(2), write(X),lista_conexoes(Lugar):- conexao(Lugar, X), tab(2), write(X), nl, fail.nl, fail. lista_conexoes(_).lista_conexoes(_). ► Testando ...Testando ... ?-?- lista_conexoes(saguão).lista_conexoes(saguão). sala de jantarsala de jantar escritórioescritório YesYes
  • 16. Nani Search (5)Nani Search (5) ► Agora estamos prontos para escreverAgora estamos prontos para escrever olhar/0olhar/0 ► O fato únicoO fato único aqui(cozinha)aqui(cozinha) nos informa ondenos informa onde estamos no jogoestamos no jogo  Veremos mais a frente como dinamicamente mudarVeremos mais a frente como dinamicamente mudar aqui/1aqui/1 ► Podemos usá-lo junto com os dois predicados dePodemos usá-lo junto com os dois predicados de listagem para escreverlistagem para escrever olhar/0olhar/0 olhar :-olhar :- aqui(Lugar),aqui(Lugar), write(‘Você está no(a) ’), write(Lugar), nl,write(‘Você está no(a) ’), write(Lugar), nl, write(‘Você pode ver:’), nl, lista_objetos(Lugar),write(‘Você pode ver:’), nl, lista_objetos(Lugar), write(‘Você pode ir para:’), nl, lista_conexoes(Lugar).write(‘Você pode ir para:’), nl, lista_conexoes(Lugar).
  • 17. Nani Search (6)Nani Search (6) ► Veremos como funcionaVeremos como funciona olhar/0olhar/0 ?-?- olhar.olhar. Você está no(a) cozinhaVocê está no(a) cozinha Você pode ver:Você pode ver: maçãmaçã brócolisbrócolis biscoitobiscoito Você pode ir para:Você pode ir para: escritórioescritório porãoporão sala de jantarsala de jantar YesYes
  • 18. –– Sumário –Sumário – ►Regras PrologRegras Prolog  Um programa Prolog é um banco de dados deUm programa Prolog é um banco de dados de fatosfatos ee regrasregras inter-relacionadasinter-relacionadas  As regras se comunicam através deAs regras se comunicam através de unificaçãounificação –– casamento de padrões interno de Prologcasamento de padrões interno de Prolog  As regras se comunicam com o usuário atravésAs regras se comunicam com o usuário através dede predicados internospredicados internos comocomo write/1write/1  Regras podem serRegras podem ser consultadasconsultadas individualmenteindividualmente através do promptatravés do prompt
  • 19. –– Sumário –Sumário – ►Controle de Fluxo em PrologControle de Fluxo em Prolog  O comportamento de execução das regras éO comportamento de execução das regras é controlado pelo mecanismo de busca interno decontrolado pelo mecanismo de busca interno de Prolog chamadoProlog chamado backtrackingbacktracking  Podemos forçar o backtracking com o predicadoPodemos forçar o backtracking com o predicado internointerno fail/0fail/0  Podemos forçar o sucesso de um predicadoPodemos forçar o sucesso de um predicado adicionando uma cláusula final com umaadicionando uma cláusula final com uma variávelvariável anônimaanônima como argumento e sem corpocomo argumento e sem corpo
  • 20. –– Sumário –Sumário – ► Aspectos de Programação em PrologAspectos de Programação em Prolog  FatosFatos no banco de dados (localizações, portas, ...)no banco de dados (localizações, portas, ...) substituem a definição convencional desubstituem a definição convencional de dadosdados  A busca porA busca por backtrackingbacktracking (lista_objetos/1) substitui a(lista_objetos/1) substitui a codificação de muitos construtores decodificação de muitos construtores de laçoslaços  A troca de controle através doA troca de controle através do casamento decasamento de padrõespadrões (conexao/2) substitui(conexao/2) substitui testes condicionaistestes condicionais ee estruturas deestruturas de ramificaçãoramificação  As regras podem ser testadas individualmente,As regras podem ser testadas individualmente, encorajando oencorajando o desenvolvimento modulardesenvolvimento modular  Regras podem chamar regras encorajando práticasRegras podem chamar regras encorajando práticas de programação dede programação de abstração proceduralabstração procedural ee abstração de dadosabstração de dados ► olhar/0 não sabe como lista_objetos/1 funciona e como os dadosolhar/0 não sabe como lista_objetos/1 funciona e como os dados de local estão armazenadosde local estão armazenados
  • 21. Exercícios (1)Exercícios (1) ►Considerando o seguinte banco de dadosConsiderando o seguinte banco de dados a(a1, 1).a(a1, 1). b(1, b1).b(1, b1). a(A, 2).a(A, 2). b(2, B).b(2, B). a(a3, N).a(a3, N). b(N, b3).b(N, b3). c(X,Y):- a(X,N), b(N,Y).c(X,Y):- a(X,N), b(N,Y). d(X,Y):- a(X,N), b(Y,N).d(X,Y):- a(X,N), b(Y,N). d(X,Y):- a(N,X), b(N,Y).d(X,Y):- a(N,X), b(N,Y). ►Qual o resultado das consultasQual o resultado das consultas ?-?- a(X, 2).a(X, 2). ?-?- b(X, kalamazoo).b(X, kalamazoo). ?-?- c(X, b3).c(X, b3). ?-?- c(X, Y).c(X, Y). ?-?- d(X, Y).d(X, Y).
  • 22. Exercícios (2)Exercícios (2) ► Banco de Dados GenealógicoBanco de Dados Genealógico  Crie regras para vários relacionamentos familiares queCrie regras para vários relacionamentos familiares que foram desenvolvidos como consultas na aula anteriorforam desenvolvidos como consultas na aula anterior mae(M, F):- pais(M, F), mulher(M).mae(M, F):- pais(M, F), mulher(M).  Crie uma regra para irmãosCrie uma regra para irmãos ► Rastreie o predicado para visualizar o seu funcionamentoRastreie o predicado para visualizar o seu funcionamento  Podemos resolver o problema de indivíduos seremPodemos resolver o problema de indivíduos serem irmãos deles mesmos através do predicado interno que éirmãos deles mesmos através do predicado interno que é bem sucedido caso dois valores sejam diferentes e falhabem sucedido caso dois valores sejam diferentes e falha caso sejam iguaiscaso sejam iguais ► O predicado é = (X,Y).O predicado é = (X,Y). ► Também podemos escrevê-lo na forma X = YTambém podemos escrevê-lo na forma X = Y  Use o predicado irmãos para definir regras adicionaisUse o predicado irmãos para definir regras adicionais para irmãos, irmãs, tios, tias e primospara irmãos, irmãs, tios, tias e primos
  • 23. Exercícios (3)Exercícios (3) ► Banco de Dados GenealógicoBanco de Dados Genealógico  O predicado para representar casamento leva aoO predicado para representar casamento leva ao problema da porta com dois caminhos (porta/2)problema da porta com dois caminhos (porta/2) ► Utilize uma solução idêntica para implementá-loUtilize uma solução idêntica para implementá-lo  Adicione regras para tios e tias que consiga acrescentarAdicione regras para tios e tias que consiga acrescentar tios e tias por casamento e não apenas por sanguetios e tias por casamento e não apenas por sangue  Escreva um predicado para avôEscreva um predicado para avô ► Rastreie o uso de avo(alguem, X). e avo(X, alguem). queRastreie o uso de avo(alguem, X). e avo(X, alguem). que encontra avôs e netosencontra avôs e netos ► Dependendo de como você escrevê-lo, ele poderá precisar deDependendo de como você escrevê-lo, ele poderá precisar de muito mais passos em uma consulta que em outramuito mais passos em uma consulta que em outra ► Escreva dois predicados, um chamado avo/2 e outro chamadoEscreva dois predicados, um chamado avo/2 e outro chamado neto/2neto/2 ► Certifique-se de que ambos são eficientesCertifique-se de que ambos são eficientes
  • 24. O que vem a seguir?O que vem a seguir? ►AritméticaAritmética ►Gerenciando DadosGerenciando Dados ►......