SlideShare uma empresa Scribd logo
1 de 19
Prolog – 06
Inteligência Artificial
Fábio M. Pereira
Baseado em
Amzi! inc. – www.amzi.com
Aventura em Prolog 2
Aventura em Prolog
 Recursão
 Como a recursão funciona
 Pragmática
 Exercícios
Aventura em Prolog 3
Recursão
 É a habilidade de uma unidade de
código chamar a ela mesma,
repetidamente, se necessário
 É frequentemente uma maneira muito
poderosa e conveniente de representar
certos construtores de programação
 Em Prolog, a recursão ocorre quando
um predicado contém um objetivo que
se refere a ele mesmo
Aventura em Prolog 4
Recursão
 Toda vez que uma regra é chamada,
Prolog usa o corpo da regra para criar
uma nova consulta com novas variáveis
 Uma vez que a consulta é uma nova
cópia cada vez que é chamada, não faz
diferença se uma regra chama outra
regra ou a ela mesma
Aventura em Prolog 5
Recursão
 Uma definição recursiva sempre tem
pelo menos duas partes
 A condição limite (caso base): define um
caso simples que sabemos ser verdadeiro
 O caso recursivo: simplifica o problema
primeiro removendo uma camada de
complexidade, e então chamando ela
mesma
 Em cada nível, a condição limite é testada,
se verdadeira, a recursão pára, se não, a
recursão continua
Aventura em Prolog 6
Exemplo – Nani Search
 Objetos próximos ou aninhados
 O predicado local/2 nos diz que a lanterna
está na escrivaninha e que a escrivaninha
está no escritório, mas não nos indica que a
lanterna está no escritório
?- local(lanterna,escritório).
no
 Usando recursão, iremos escrever um
novo predicado esta_contido_em/2, o
qual irá “cavar” através de camadas de
objetos aninhados
Aventura em Prolog 7
Exemplo – Nani Search
 Para tornar o problema mais
interessante, primeiro iremos adicionar
mais itens aninhados no jogo
 Iremos continuar usando o predicado
local/2 para colocar objetos na
escrivaninha, que por sua vez, podem
conter outros objetos dentro deles
local(envelope, escrivaninha).
local(selo, envelope).
local(chave, envelope).
Aventura em Prolog 8
Exemplo – Nani Search
 Para listar todas as coisas no escritório:
 Primeiro devemos listar os objetos que
estão diretamente no escritório, como a
escrivaninha
 Depois devemos listar os objetos que estão
na escrivaninha
 A seguir objetos que estão dentro dos
objetos que estão na escrivaninha
Aventura em Prolog 9
Exemplo – Nani Search
 A regra:
 Um objeto, O1, está contido em outro
objeto, O2, se O1 está diretamente
localizado em O2  Esta é a condição limite
 Um objeto, O1, está contido em outro
objeto, O2, se algum objeto intermediário,
X, está localizado em O2 e O1 está contido
em X  Aqui é onde nós simplificamos e
fazemos a recursão
Aventura em Prolog 10
Exemplo – Nani Search
 Em Prolog:
 Caso base:
esta_contido_em(O1, O2):-
local(O1, O2).
 Caso recursivo:
esta_contido_em(O1, O2):-
local(X, O2),
esta_contido_em(O1, X).
Aventura em Prolog 11
Exemplo – Nani Search
 Testando...
?- esta_contido_em(X, escritório).
X = escrivaninha ;
X = computador ;
X = lanterna ;
X = envelope ;
X = selo ;
X = chave ;
no
?- esta_contido_em(envelope, escritório).
yes
?- esta_contido_em(maçã, escritório).
no
Aventura em Prolog 12
Como a Recursão Funciona
 Como em todas as chamadas a regras,
as variáveis em uma regra são únicas,
ou o escopo delas é a regra
 Em um caso recursivo, isto significa que
cada chamada à regra, em cada nível,
possui seu próprio conjunto único de
variáveis
 Assim, os valores de X, O1 e O2 no primeiro
nível da recursão são diferentes daqueles
dos segundo nível
Aventura em Prolog 13
Como a Recursão Funciona
 Porém, a unificação entre um objetivo e
a cabeça de uma cláusula obrigue um
relacionamento entre as variáveis de
diferentes níveis
 Acompanhe a execução da consulta a
seguir...
?- esta_contido_em(XQ, escritório).
Aventura em Prolog 14
esta_contido_em(XQ, escritório).
No primeiro nível de recursão:
esta_contido_em(O11, O21) :-
local(X1, O21),
esta_contido_em(O11, X1).
XQ = _01
O11 = _01
O21 = escritório
X1 = _02
Reescrita:
esta_contido_em(_01, escritório) :-
local(_02, escritório),
esta_contido_em(_01, _02).
local/2 satisfeito com _02 = escrivaninha
esta_contido_em(_01, escrivaninha)
Este objetivo unifica com a cabeça de uma nova cópia
da cláusula, no próximo nível de recursão. Após a
unificação, as variáveis são:
XQ = _01 O11 = _01 O12 = _01
O21 = escritório O22 = escrivaninha
X1 = escrivaninha X2 = _03
Aventura em Prolog 15
Como a Recursão Funciona
 Quando a recursão encontra uma solução,
como em ‘envelope’, todos os O1s e X0
imediatamente assumem um valor – utilize o
modo de debug para acompanhar a execução
 Ao escrever um predicado recursivo, é
essencial garantir que a condição limite seja
checada em cada nível, em outro caso, o
programa poderá entrar em loop infinito
 A maneira mais simples de fazer isso, é sempre
definir a condição limite primeiro, garantindo que
ela sempre será tentada antes do caso recursivo
Aventura em Prolog 16
Pragmática
 Considere que o objetivo local(X,Y) será
satisfeito por todas as cláusulas de
local/2
 Por outro lado, os objetivos local(X,
escritório) e local(envelope, X) serão
satisfeitos por poucas cláusulas
 Observe no slide a seguir duas versões
para a regra esta_contido_em/2...
Aventura em Prolog 17
Pragmática
 Ambos darão respostas corretas, mas a
performance de cada um irá depender da
consulta:
 A consulta esta_contido_em(X, escritório) irá
executar mais rápido na primeira versão
 O2 é linkada fazendo com que a busca por local(X,
O2) seja mais fácil do que a busca por duas
variáveis não linkadas
 Por razões similares, a consulta esta_contido_em
(chave, X) seja mais rapidamente executada na
segunda versão
esta_contido_em(O1, O2):-
local(X, O2),
esta_contido_em(O1, X).
esta_contido_em(O1, O2):-
local(O1, X),
esta_contido_em(X, O2).
Aventura em Prolog 18
Exercícios
 Banco de dados genealógico
 Utilize recursão para escrever o predicado
ancestral/2
 Utilize ancestral/2 para encontrar todos os
ancestrais e todos os descendentes de uma
pessoa
 Escreva um predicado descendente/2 que
seja otimizado para descendentes, oposto a
ancestral/2, que deve ser otimizado para
ancestrais
Aventura em Prolog 19
O que vem a seguir?
 Estruturas de Dados
 Unificação
 ...

Mais conteúdo relacionado

Mais procurados

Inteligência Artificial - Aula2 - Busca em Grafos
Inteligência Artificial - Aula2 - Busca em GrafosInteligência Artificial - Aula2 - Busca em Grafos
Inteligência Artificial - Aula2 - Busca em GrafosRafael Pinto
 
Lógica e Matemática Computacional - Aula 01
Lógica e Matemática Computacional - Aula 01Lógica e Matemática Computacional - Aula 01
Lógica e Matemática Computacional - Aula 01thomasdacosta
 
Banco de Dados I - Aula 06 - Banco de Dados Relacional (Modelo Lógico)
Banco de Dados I - Aula 06 - Banco de Dados Relacional (Modelo Lógico)Banco de Dados I - Aula 06 - Banco de Dados Relacional (Modelo Lógico)
Banco de Dados I - Aula 06 - Banco de Dados Relacional (Modelo Lógico)Leinylson Fontinele
 
Arquitetura de Computadores: Processos e Threads
Arquitetura de Computadores: Processos e ThreadsArquitetura de Computadores: Processos e Threads
Arquitetura de Computadores: Processos e ThreadsEvandro Júnior
 
Java: Introducao ao Swing
Java: Introducao ao SwingJava: Introducao ao Swing
Java: Introducao ao SwingArthur Emanuel
 
Análise de Algoritmos - Solução de Recorrências
Análise de Algoritmos - Solução de RecorrênciasAnálise de Algoritmos - Solução de Recorrências
Análise de Algoritmos - Solução de RecorrênciasDelacyr Ferreira
 
Caminho Mínimo em Grafos - Algoritmo de Bellman-Ford
Caminho Mínimo em Grafos - Algoritmo de Bellman-FordCaminho Mínimo em Grafos - Algoritmo de Bellman-Ford
Caminho Mínimo em Grafos - Algoritmo de Bellman-FordGabriel Albuquerque
 
Introdução ao OpenLayers
Introdução ao OpenLayersIntrodução ao OpenLayers
Introdução ao OpenLayersFernando Quadro
 
Normalização - Alexandruk
Normalização - AlexandrukNormalização - Alexandruk
Normalização - AlexandrukHebert Alquimim
 
Estrutura de Dados II - Apresentação da Disciplina
Estrutura de Dados II - Apresentação da DisciplinaEstrutura de Dados II - Apresentação da Disciplina
Estrutura de Dados II - Apresentação da DisciplinaDaniel Arndt Alves
 
PUNTEROS (APUNTADORES) EN C++
PUNTEROS (APUNTADORES) EN C++PUNTEROS (APUNTADORES) EN C++
PUNTEROS (APUNTADORES) EN C++die_dex
 
Escalonamento no Windows
Escalonamento no WindowsEscalonamento no Windows
Escalonamento no WindowsFee Kosta
 
Encapsulamento em Orientação a Objetos
Encapsulamento em Orientação a ObjetosEncapsulamento em Orientação a Objetos
Encapsulamento em Orientação a ObjetosDaniel Brandão
 
Banco de Dados II Aula 08 - Linguagem de Consulta SQL (Comandos DML)
Banco de Dados II Aula 08 - Linguagem de Consulta SQL (Comandos DML)Banco de Dados II Aula 08 - Linguagem de Consulta SQL (Comandos DML)
Banco de Dados II Aula 08 - Linguagem de Consulta SQL (Comandos DML)Leinylson Fontinele
 

Mais procurados (20)

Lista de exercícios em Bash (resolvida)
Lista de exercícios em Bash (resolvida) Lista de exercícios em Bash (resolvida)
Lista de exercícios em Bash (resolvida)
 
Paradigmas de programação
Paradigmas de programaçãoParadigmas de programação
Paradigmas de programação
 
Hadoop
HadoopHadoop
Hadoop
 
Paradigma lógico
Paradigma lógicoParadigma lógico
Paradigma lógico
 
Inteligência Artificial - Aula2 - Busca em Grafos
Inteligência Artificial - Aula2 - Busca em GrafosInteligência Artificial - Aula2 - Busca em Grafos
Inteligência Artificial - Aula2 - Busca em Grafos
 
Lógica e Matemática Computacional - Aula 01
Lógica e Matemática Computacional - Aula 01Lógica e Matemática Computacional - Aula 01
Lógica e Matemática Computacional - Aula 01
 
Лекція №5
Лекція №5Лекція №5
Лекція №5
 
Banco de Dados I - Aula 06 - Banco de Dados Relacional (Modelo Lógico)
Banco de Dados I - Aula 06 - Banco de Dados Relacional (Modelo Lógico)Banco de Dados I - Aula 06 - Banco de Dados Relacional (Modelo Lógico)
Banco de Dados I - Aula 06 - Banco de Dados Relacional (Modelo Lógico)
 
Arquitetura de Computadores: Processos e Threads
Arquitetura de Computadores: Processos e ThreadsArquitetura de Computadores: Processos e Threads
Arquitetura de Computadores: Processos e Threads
 
Java: Introducao ao Swing
Java: Introducao ao SwingJava: Introducao ao Swing
Java: Introducao ao Swing
 
Aula 07 - lista linear
Aula 07 - lista linearAula 07 - lista linear
Aula 07 - lista linear
 
Análise de Algoritmos - Solução de Recorrências
Análise de Algoritmos - Solução de RecorrênciasAnálise de Algoritmos - Solução de Recorrências
Análise de Algoritmos - Solução de Recorrências
 
Caminho Mínimo em Grafos - Algoritmo de Bellman-Ford
Caminho Mínimo em Grafos - Algoritmo de Bellman-FordCaminho Mínimo em Grafos - Algoritmo de Bellman-Ford
Caminho Mínimo em Grafos - Algoritmo de Bellman-Ford
 
Introdução ao OpenLayers
Introdução ao OpenLayersIntrodução ao OpenLayers
Introdução ao OpenLayers
 
Normalização - Alexandruk
Normalização - AlexandrukNormalização - Alexandruk
Normalização - Alexandruk
 
Estrutura de Dados II - Apresentação da Disciplina
Estrutura de Dados II - Apresentação da DisciplinaEstrutura de Dados II - Apresentação da Disciplina
Estrutura de Dados II - Apresentação da Disciplina
 
PUNTEROS (APUNTADORES) EN C++
PUNTEROS (APUNTADORES) EN C++PUNTEROS (APUNTADORES) EN C++
PUNTEROS (APUNTADORES) EN C++
 
Escalonamento no Windows
Escalonamento no WindowsEscalonamento no Windows
Escalonamento no Windows
 
Encapsulamento em Orientação a Objetos
Encapsulamento em Orientação a ObjetosEncapsulamento em Orientação a Objetos
Encapsulamento em Orientação a Objetos
 
Banco de Dados II Aula 08 - Linguagem de Consulta SQL (Comandos DML)
Banco de Dados II Aula 08 - Linguagem de Consulta SQL (Comandos DML)Banco de Dados II Aula 08 - Linguagem de Consulta SQL (Comandos DML)
Banco de Dados II Aula 08 - Linguagem de Consulta SQL (Comandos DML)
 

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
 
Aula de Prolog 08 - Unificação
Aula de Prolog 08 - UnificaçãoAula de Prolog 08 - Unificação
Aula de Prolog 08 - UnificaçãoFabio Moura Pereira
 

Destaque (20)

Aula Prolog 02
Aula Prolog 02Aula Prolog 02
Aula Prolog 02
 
Aula Prolog 01
Aula Prolog 01Aula Prolog 01
Aula Prolog 01
 
Prolog 04 - Regras
Prolog 04 - RegrasProlog 04 - Regras
Prolog 04 - Regras
 
Aula Prolog 03
Aula Prolog 03Aula Prolog 03
Aula Prolog 03
 
Aula Persistência 01 (Java)
Aula Persistência 01 (Java)Aula Persistência 01 (Java)
Aula Persistência 01 (Java)
 
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 Prolog - 05
Aula Prolog - 05Aula Prolog - 05
Aula Prolog - 05
 
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
 
Aula de Prolog 08 - Unificação
Aula de Prolog 08 - UnificaçãoAula de Prolog 08 - Unificação
Aula de Prolog 08 - Unificação
 
Curso de PHP - Objetos
Curso de PHP - ObjetosCurso de PHP - Objetos
Curso de PHP - Objetos
 

Semelhante a Aula de Prolog 06 - Recursão

Livro - código limpo caps (3,4) (clean code)
Livro - código limpo caps (3,4) (clean code)Livro - código limpo caps (3,4) (clean code)
Livro - código limpo caps (3,4) (clean code)André Justi
 
Apostila ph pwamp_parte5
Apostila ph pwamp_parte5Apostila ph pwamp_parte5
Apostila ph pwamp_parte5Ilton Barbosa
 
Python for the last Jedi episode I - Tchelinux Caxias do Sul 2018 - Joelmir R...
Python for the last Jedi episode I - Tchelinux Caxias do Sul 2018 - Joelmir R...Python for the last Jedi episode I - Tchelinux Caxias do Sul 2018 - Joelmir R...
Python for the last Jedi episode I - Tchelinux Caxias do Sul 2018 - Joelmir R...Tchelinux
 
Curso De Shell Aula 3
Curso De Shell   Aula 3Curso De Shell   Aula 3
Curso De Shell Aula 3Felipe Santos
 
Apostila PhP com Wamp, 4a Parte
Apostila PhP com Wamp, 4a ParteApostila PhP com Wamp, 4a Parte
Apostila PhP com Wamp, 4a ParteIlton Barbosa
 
Recursividade em linguagem C
Recursividade em linguagem CRecursividade em linguagem C
Recursividade em linguagem CLeonardo Lima
 
Introdução ao Node.js
Introdução ao Node.jsIntrodução ao Node.js
Introdução ao Node.jsEdgar Eler
 
Curso de shell
Curso de shellCurso de shell
Curso de shellTiago
 
Curso de shell
Curso de shellCurso de shell
Curso de shellTiago
 

Semelhante a Aula de Prolog 06 - Recursão (13)

Pged 07
Pged 07Pged 07
Pged 07
 
Python Orientação a Objeto
Python Orientação a ObjetoPython Orientação a Objeto
Python Orientação a Objeto
 
Livro - código limpo caps (3,4) (clean code)
Livro - código limpo caps (3,4) (clean code)Livro - código limpo caps (3,4) (clean code)
Livro - código limpo caps (3,4) (clean code)
 
Apostila ph pwamp_parte5
Apostila ph pwamp_parte5Apostila ph pwamp_parte5
Apostila ph pwamp_parte5
 
Python for the last Jedi episode I - Tchelinux Caxias do Sul 2018 - Joelmir R...
Python for the last Jedi episode I - Tchelinux Caxias do Sul 2018 - Joelmir R...Python for the last Jedi episode I - Tchelinux Caxias do Sul 2018 - Joelmir R...
Python for the last Jedi episode I - Tchelinux Caxias do Sul 2018 - Joelmir R...
 
Curso De Shell Aula 3
Curso De Shell   Aula 3Curso De Shell   Aula 3
Curso De Shell Aula 3
 
Apostila PhP com Wamp, 4a Parte
Apostila PhP com Wamp, 4a ParteApostila PhP com Wamp, 4a Parte
Apostila PhP com Wamp, 4a Parte
 
Recursividade em linguagem C
Recursividade em linguagem CRecursividade em linguagem C
Recursividade em linguagem C
 
Shell script
Shell script Shell script
Shell script
 
Pipeline
PipelinePipeline
Pipeline
 
Introdução ao Node.js
Introdução ao Node.jsIntrodução ao Node.js
Introdução ao Node.js
 
Curso de shell
Curso de shellCurso de shell
Curso de shell
 
Curso de shell
Curso de shellCurso de shell
Curso de shell
 

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 (10)

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
 
PHP - Funções
PHP - FunçõesPHP - Funções
PHP - Funções
 
PHP - Introdução
PHP - IntroduçãoPHP - Introdução
PHP - Introdução
 

Aula de Prolog 06 - Recursão

  • 1. Prolog – 06 Inteligência Artificial Fábio M. Pereira Baseado em Amzi! inc. – www.amzi.com
  • 2. Aventura em Prolog 2 Aventura em Prolog  Recursão  Como a recursão funciona  Pragmática  Exercícios
  • 3. Aventura em Prolog 3 Recursão  É a habilidade de uma unidade de código chamar a ela mesma, repetidamente, se necessário  É frequentemente uma maneira muito poderosa e conveniente de representar certos construtores de programação  Em Prolog, a recursão ocorre quando um predicado contém um objetivo que se refere a ele mesmo
  • 4. Aventura em Prolog 4 Recursão  Toda vez que uma regra é chamada, Prolog usa o corpo da regra para criar uma nova consulta com novas variáveis  Uma vez que a consulta é uma nova cópia cada vez que é chamada, não faz diferença se uma regra chama outra regra ou a ela mesma
  • 5. Aventura em Prolog 5 Recursão  Uma definição recursiva sempre tem pelo menos duas partes  A condição limite (caso base): define um caso simples que sabemos ser verdadeiro  O caso recursivo: simplifica o problema primeiro removendo uma camada de complexidade, e então chamando ela mesma  Em cada nível, a condição limite é testada, se verdadeira, a recursão pára, se não, a recursão continua
  • 6. Aventura em Prolog 6 Exemplo – Nani Search  Objetos próximos ou aninhados  O predicado local/2 nos diz que a lanterna está na escrivaninha e que a escrivaninha está no escritório, mas não nos indica que a lanterna está no escritório ?- local(lanterna,escritório). no  Usando recursão, iremos escrever um novo predicado esta_contido_em/2, o qual irá “cavar” através de camadas de objetos aninhados
  • 7. Aventura em Prolog 7 Exemplo – Nani Search  Para tornar o problema mais interessante, primeiro iremos adicionar mais itens aninhados no jogo  Iremos continuar usando o predicado local/2 para colocar objetos na escrivaninha, que por sua vez, podem conter outros objetos dentro deles local(envelope, escrivaninha). local(selo, envelope). local(chave, envelope).
  • 8. Aventura em Prolog 8 Exemplo – Nani Search  Para listar todas as coisas no escritório:  Primeiro devemos listar os objetos que estão diretamente no escritório, como a escrivaninha  Depois devemos listar os objetos que estão na escrivaninha  A seguir objetos que estão dentro dos objetos que estão na escrivaninha
  • 9. Aventura em Prolog 9 Exemplo – Nani Search  A regra:  Um objeto, O1, está contido em outro objeto, O2, se O1 está diretamente localizado em O2  Esta é a condição limite  Um objeto, O1, está contido em outro objeto, O2, se algum objeto intermediário, X, está localizado em O2 e O1 está contido em X  Aqui é onde nós simplificamos e fazemos a recursão
  • 10. Aventura em Prolog 10 Exemplo – Nani Search  Em Prolog:  Caso base: esta_contido_em(O1, O2):- local(O1, O2).  Caso recursivo: esta_contido_em(O1, O2):- local(X, O2), esta_contido_em(O1, X).
  • 11. Aventura em Prolog 11 Exemplo – Nani Search  Testando... ?- esta_contido_em(X, escritório). X = escrivaninha ; X = computador ; X = lanterna ; X = envelope ; X = selo ; X = chave ; no ?- esta_contido_em(envelope, escritório). yes ?- esta_contido_em(maçã, escritório). no
  • 12. Aventura em Prolog 12 Como a Recursão Funciona  Como em todas as chamadas a regras, as variáveis em uma regra são únicas, ou o escopo delas é a regra  Em um caso recursivo, isto significa que cada chamada à regra, em cada nível, possui seu próprio conjunto único de variáveis  Assim, os valores de X, O1 e O2 no primeiro nível da recursão são diferentes daqueles dos segundo nível
  • 13. Aventura em Prolog 13 Como a Recursão Funciona  Porém, a unificação entre um objetivo e a cabeça de uma cláusula obrigue um relacionamento entre as variáveis de diferentes níveis  Acompanhe a execução da consulta a seguir... ?- esta_contido_em(XQ, escritório).
  • 14. Aventura em Prolog 14 esta_contido_em(XQ, escritório). No primeiro nível de recursão: esta_contido_em(O11, O21) :- local(X1, O21), esta_contido_em(O11, X1). XQ = _01 O11 = _01 O21 = escritório X1 = _02 Reescrita: esta_contido_em(_01, escritório) :- local(_02, escritório), esta_contido_em(_01, _02). local/2 satisfeito com _02 = escrivaninha esta_contido_em(_01, escrivaninha) Este objetivo unifica com a cabeça de uma nova cópia da cláusula, no próximo nível de recursão. Após a unificação, as variáveis são: XQ = _01 O11 = _01 O12 = _01 O21 = escritório O22 = escrivaninha X1 = escrivaninha X2 = _03
  • 15. Aventura em Prolog 15 Como a Recursão Funciona  Quando a recursão encontra uma solução, como em ‘envelope’, todos os O1s e X0 imediatamente assumem um valor – utilize o modo de debug para acompanhar a execução  Ao escrever um predicado recursivo, é essencial garantir que a condição limite seja checada em cada nível, em outro caso, o programa poderá entrar em loop infinito  A maneira mais simples de fazer isso, é sempre definir a condição limite primeiro, garantindo que ela sempre será tentada antes do caso recursivo
  • 16. Aventura em Prolog 16 Pragmática  Considere que o objetivo local(X,Y) será satisfeito por todas as cláusulas de local/2  Por outro lado, os objetivos local(X, escritório) e local(envelope, X) serão satisfeitos por poucas cláusulas  Observe no slide a seguir duas versões para a regra esta_contido_em/2...
  • 17. Aventura em Prolog 17 Pragmática  Ambos darão respostas corretas, mas a performance de cada um irá depender da consulta:  A consulta esta_contido_em(X, escritório) irá executar mais rápido na primeira versão  O2 é linkada fazendo com que a busca por local(X, O2) seja mais fácil do que a busca por duas variáveis não linkadas  Por razões similares, a consulta esta_contido_em (chave, X) seja mais rapidamente executada na segunda versão esta_contido_em(O1, O2):- local(X, O2), esta_contido_em(O1, X). esta_contido_em(O1, O2):- local(O1, X), esta_contido_em(X, O2).
  • 18. Aventura em Prolog 18 Exercícios  Banco de dados genealógico  Utilize recursão para escrever o predicado ancestral/2  Utilize ancestral/2 para encontrar todos os ancestrais e todos os descendentes de uma pessoa  Escreva um predicado descendente/2 que seja otimizado para descendentes, oposto a ancestral/2, que deve ser otimizado para ancestrais
  • 19. Aventura em Prolog 19 O que vem a seguir?  Estruturas de Dados  Unificação  ...