SlideShare uma empresa Scribd logo
1 de 21
Prolog – 07
Fábio M. Pereira
Baseado em
Amzi! inc. – www.amzi.com
Aventura em Prolog 2
Aventura em Prolog
 Estruturas de Dados
 Exercícios
Aventura em Prolog 3
Estruturas de Dados
 Até agora, trabalhamos com fatos,
consultas e regras que usam estruturas
de dados simples
 Os argumentos de nossos predicados têm
sido átomos ou inteiros, blocos básicos de
construção em Prolog
 Ex.: maçã, escritório, lanterna, cobertor
 Tipos de dados primitivos podem ser
combinados para formar tipos de dados
complexos, chamados estruturas
Aventura em Prolog 4
Estruturas de Dados
 Uma estrutura é composta por um funtor e um
número fixo de argumentos
 Da mesma forma que objetivos e fatos
funtor(arq1, arq2, ...)
 Cada argumento de uma estrutura pode ser
um tipo de dado primitivo ou uma outra
estrutura
 Ex.: os objetos do jogo são atualmente
representados usando átomos, como ‘escrivaninha’,
‘maçã’, mas podemos utilizar estruturas para criar
uma representação mais rica das coisas
Aventura em Prolog 5
Exemplos
 As estruturas a seguir descrevem um objeto,
sua cor, tamanho e peso:
objeto(vela, vermelha, pequena, 0.1).
objeto(maçã, vermelha, pequena, 0.1).
objeto(maçã, verde, pequena, 0.1).
objeto(mesa, azul, grande, 50).
 Estas estruturas podem ser utilizadas
diretamente no segundo argumento de
local/2, mas para experimentação, iremos
criar um novo predicado local_s/2
Aventura em Prolog 6
Consultas
 Note que mesmo usando estruturas complexas
para descrever os objetos do jogo, local_s/2
continua apenas com dois argumentos:
local_s(objeto(vela, vermelha, pequena, 0.1), cozinha).
local_s(objeto(maçã, vermelha, pequena, 0.1), cozinha).
local_s(objeto(maçã, verde, pequena, 0.1), cozinha).
local_s(objeto(mesa, azul, grande, 50), cozinha).
 Variáveis em Prolog são “sem tipo” e podem
casar facilmente tanto com estruturas como
com átomos
Aventura em Prolog 7
Átomo X Estrutura
 De fato, um átomo é apenas uma
estrutura simples com um funtor e sem
argumentos
 Exemplo:
?- local_s(X, cozinha).
X = objeto(vela, vermelha, pequena, 0.1) ;
X = objeto(maçã, vermelha, pequena, 0.1) ;
X = objeto(maçã, verde, pequena, 0.1) ;
X = objeto(mesa, azul, grande, 50) ;
No
Aventura em Prolog 8
Variáveis X Estruturas
 Podemos também escolher parte da estrutura
com variáveis
 Ex.: encontrar todos os objetos vermelhos que
estão na cozinha
?- local_s(objeto(X, vermelha, T, P), cozinha).
X = vela
T = pequena
P = 0.1 ;
X = maçã
T = pequena
P = 0.1 ;
No
Aventura em Prolog 9
Variável Anônima
 Se nós não nos preocupamos com o
tamanho e o peso podemos substituir as
variáveis T e P pela variável anônima
(_)
?- local_s(objeto(X, vermelha, _, _), cozinha).
X = vela ;
X = maçã ;
No
Aventura em Prolog 10
Nani Search
 Podemos usar estas estruturas para dar mais
realismo ao jogo
 Por exemplo, podemos modificar o predicado
pode_pegar/1, de maneira que só possamos pegar
objetos pequenos
pode_pegar_s(Objeto):-
aqui(Lugar),
(local_s(objeto(Objeto, _, pequeno, _), Lugar);
local_s(objeto(Objeto, _, pequena, _), Lugar)).
 Podemos também mudar as mensagens de erro
para refletir as duas razões porque um objeto não
pode ser carregado
Aventura em Prolog 11
Predicado Interno not/1
 Para garantir que o backtracking não cause a
exibição das duas mensagens de erro, iremos
construir cada cláusula de maneira que uma
única condição seja encontrada
 Para fazer isso, utilizaremos o predicado interno
not/1 – o seu argumento é um objetivo, e ele é bem
sucedido se o seu argumento falha e falha caso seu
argumento seja bem sucedido
?- not( sala(escritório) ).
No
?- not( local(repolho, ‘sala de jantar’) ).
Yes
Aventura em Prolog 12
Predicado Interno not/1
 Semanticamente, not em Prolog
significa que o objetivo não pode ser
resolvido de maneira bem sucedida com
a base de dados lógica atual de fatos e
regras
 Lembre-se da “hipótese do mundo fechado”
Aventura em Prolog 13
Nova versão de pode_pegar/1
pode_pegar_s(Objeto):-
aqui(Lugar),
local_s(objeto(Objeto, _, pequeno, _), Lugar).
pode_pegar_s(Objeto):-
aqui(Lugar),
local_s(objeto(Objeto, _, grande, _), Lugar),
write(‘O(a) ’), write(Objeto),
write(‘ é grande demais para ser carregado(a).’), nl, fail.
pode_pegar_s(Objeto):-
aqui(Lugar),
not( local_s(objeto(Objeto, _, _, _), Lugar) ),
write(‘Não há nenhum(a) ’), write(Objeto), write(‘ aqui.’),
nl, fail.
Aventura em Prolog 14
Nova versão de pode_pegar/1
 Agora podemos tentar, assumindo que
estamos na cozinha:
?- pode_pegar_s(vela).
Yes
?- pode_pegar_s(mesa).
O(a) mesa é grande demais para ser carregado(a).
No
?- pode_pegar_s(escrivaninha).
Não há nenhum(a) escrivaninha aqui.
No
Aventura em Prolog 15
Nani Search
 O predicado lista_objetos/1 pode ser
modificado para dar uma descrição dos
objeto na sala:
lista_objetos_s(Lugar):-
local_s(objeto(Objeto, Cor, Tamanho, Peso), Lugar),
write(‘Um(a) ’), write(Objeto), tab(1),
write(Cor), tab(1),
write(Tamanho), write(‘, pesando ’),
write(Peso), write(‘ kilo(s)’), nl, fail.
lista_objetos_s(_).
Aventura em Prolog 16
Nani Search
 Solicitando uma lista mais detalhada:
?- lista_objetos_s(cozinha).
Um(a) vela vermelha pequena, pesando 0.1 kilo(s)
Um(a) maçã vermelha pequena, pesando 0.1 kilo(s)
Um(a) maçã verde pequena, pesando 0.1 kilo(s)
Um(a) mesa azul grande, pesando 50 kilo(s)
Aventura em Prolog 17
Aperfeiçoando...
 Cansado do formato ‘0.1 kilo(s)’?
 Podemos corrigir isso criando uma nova regra para
escrever o peso, a qual poderá substituir os write’s
diretos até agora utilizados...
write_peso(P):-
P < 2, write(P), write(‘ kilo’).
write_peso(P):-
P >= 2, write(P), write(‘ kilos’).
 Testando...
?- write_peso(4). ?- write_peso(1).
4 kilos 1 kilo
Yes Yes
Aventura em Prolog 18
Estruturas de Dados
 Estruturas podem ser arbitrariamente
complexas, se quisermos ser mais caprichosos
a respeito dos objetos do jogo, podemos
manter suas dimensões (comprimento,
largura, altura) em vez de seu tamanho, como
parte de sua descrição:
objeto(mesa, marrom, dimensao(6, 3, 3), 90).
 Podemos também usar estruturas embarcadas
por motivo de clareza:
objeto(mesa, cor(marrom), tamanho(grande),
peso(90)).
Aventura em Prolog 19
Estruturas de Dados
 Uma consulta utilizando estas estruturas
apresenta uma leitura mais fácil:
?- local_s(objeto(X, _, tamanho(grande), _),
escritório).
 Note que a posição dos argumentos é
importante
 Os locais onde colocamos variáveis
anônimas são essenciais para a obtenção de
resultados corretos
Aventura em Prolog 20
Exercícios (1)
 Nani Search
 Incorpore um novo local ao jogo
 Note que devido a abstração de dados e
procedimentos, nós precisamos mudar
apenas os predicados de baixo nível que
lidam diretamente com localização
 Os predicados de alto nível, como olhar/0 e
pegar/1 não são afetados pela mudança
Aventura em Prolog 21
O que vem a seguir?
 Unificação
 Listas
 ...

Mais conteúdo relacionado

Mais procurados

Algoritmos de ordenação
Algoritmos de ordenaçãoAlgoritmos de ordenação
Algoritmos de ordenaçãoJonas Mendonça
 
Lógica e Matemática Computacional - Aula 03
Lógica e Matemática Computacional - Aula 03Lógica e Matemática Computacional - Aula 03
Lógica e Matemática Computacional - Aula 03thomasdacosta
 
Segurança da informação
Segurança da informaçãoSegurança da informação
Segurança da informaçãoEmerson Rocha
 
Introdução à analise e complexidade de algoritmos
Introdução à analise e complexidade de algoritmosIntrodução à analise e complexidade de algoritmos
Introdução à analise e complexidade de algoritmosNécio de Lima Veras
 
Redes Neurais Artificiais
Redes Neurais ArtificiaisRedes Neurais Artificiais
Redes Neurais ArtificiaisMarcos Castro
 
Exercicios repeticao
Exercicios repeticaoExercicios repeticao
Exercicios repeticaoNadson Silva
 
Linguagem C - Funções e ponteiros
Linguagem C - Funções e ponteiros Linguagem C - Funções e ponteiros
Linguagem C - Funções e ponteiros Karoline Tavares
 
Criando um banco de dados com MySQL Workbench
Criando um banco de dados com MySQL WorkbenchCriando um banco de dados com MySQL Workbench
Criando um banco de dados com MySQL WorkbenchCentro Paula Souza
 
Algoritmos e Técnicas de Programação - Curso Completo
Algoritmos e Técnicas de Programação - Curso CompletoAlgoritmos e Técnicas de Programação - Curso Completo
Algoritmos e Técnicas de Programação - Curso Completothomasdacosta
 
Bdm aula 5 - construindo modelos er e mapeamento er-relacional
Bdm   aula 5 - construindo modelos er e mapeamento er-relacionalBdm   aula 5 - construindo modelos er e mapeamento er-relacional
Bdm aula 5 - construindo modelos er e mapeamento er-relacionalTicianne Darin
 
Banco de Dados (parte 01)
Banco de Dados (parte 01)Banco de Dados (parte 01)
Banco de Dados (parte 01)Alex Camargo
 
Modelo Relacional
Modelo RelacionalModelo Relacional
Modelo RelacionalJoel Santos
 
Algoritmo clique maximo - Analise de Algoritmos
Algoritmo clique maximo  - Analise de AlgoritmosAlgoritmo clique maximo  - Analise de Algoritmos
Algoritmo clique maximo - Analise de AlgoritmosAdilmar Dantas
 
Aula 7 expressão regular
Aula 7   expressão regularAula 7   expressão regular
Aula 7 expressão regularwab030
 

Mais procurados (20)

Algoritmos de ordenação
Algoritmos de ordenaçãoAlgoritmos de ordenação
Algoritmos de ordenação
 
Lógica e Matemática Computacional - Aula 03
Lógica e Matemática Computacional - Aula 03Lógica e Matemática Computacional - Aula 03
Lógica e Matemática Computacional - Aula 03
 
Segurança da informação
Segurança da informaçãoSegurança da informação
Segurança da informação
 
Linguagem C 07 Registros
Linguagem C 07 RegistrosLinguagem C 07 Registros
Linguagem C 07 Registros
 
Introdução à analise e complexidade de algoritmos
Introdução à analise e complexidade de algoritmosIntrodução à analise e complexidade de algoritmos
Introdução à analise e complexidade de algoritmos
 
Redes Neurais Artificiais
Redes Neurais ArtificiaisRedes Neurais Artificiais
Redes Neurais Artificiais
 
Tutorial sobre iptables
Tutorial sobre iptablesTutorial sobre iptables
Tutorial sobre iptables
 
Exercicios repeticao
Exercicios repeticaoExercicios repeticao
Exercicios repeticao
 
Introdução ao Prolog
Introdução ao PrologIntrodução ao Prolog
Introdução ao Prolog
 
Linguagem C - Funções e ponteiros
Linguagem C - Funções e ponteiros Linguagem C - Funções e ponteiros
Linguagem C - Funções e ponteiros
 
Aula 1 - Introdução a Segurança da Informação
Aula 1 - Introdução a Segurança da InformaçãoAula 1 - Introdução a Segurança da Informação
Aula 1 - Introdução a Segurança da Informação
 
Criando um banco de dados com MySQL Workbench
Criando um banco de dados com MySQL WorkbenchCriando um banco de dados com MySQL Workbench
Criando um banco de dados com MySQL Workbench
 
Algoritmos gulosos
Algoritmos gulososAlgoritmos gulosos
Algoritmos gulosos
 
Linguagem C - Ponteiros
Linguagem C - PonteirosLinguagem C - Ponteiros
Linguagem C - Ponteiros
 
Algoritmos e Técnicas de Programação - Curso Completo
Algoritmos e Técnicas de Programação - Curso CompletoAlgoritmos e Técnicas de Programação - Curso Completo
Algoritmos e Técnicas de Programação - Curso Completo
 
Bdm aula 5 - construindo modelos er e mapeamento er-relacional
Bdm   aula 5 - construindo modelos er e mapeamento er-relacionalBdm   aula 5 - construindo modelos er e mapeamento er-relacional
Bdm aula 5 - construindo modelos er e mapeamento er-relacional
 
Banco de Dados (parte 01)
Banco de Dados (parte 01)Banco de Dados (parte 01)
Banco de Dados (parte 01)
 
Modelo Relacional
Modelo RelacionalModelo Relacional
Modelo Relacional
 
Algoritmo clique maximo - Analise de Algoritmos
Algoritmo clique maximo  - Analise de AlgoritmosAlgoritmo clique maximo  - Analise de Algoritmos
Algoritmo clique maximo - Analise de Algoritmos
 
Aula 7 expressão regular
Aula 7   expressão regularAula 7   expressão regular
Aula 7 expressão regular
 

Destaque

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
 
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 - 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
 
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
 
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
 
Desenvolvimento de Sistemas Web - Conceitos Básicos
Desenvolvimento de Sistemas Web - Conceitos BásicosDesenvolvimento de Sistemas Web - Conceitos Básicos
Desenvolvimento de Sistemas Web - Conceitos BásicosFabio Moura Pereira
 
Web analitica orientada a usabilidade
Web analitica orientada a usabilidadeWeb analitica orientada a usabilidade
Web analitica orientada a usabilidadewacybis
 
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)

Curso de PHP - Objetos
Curso de PHP - ObjetosCurso de PHP - Objetos
Curso de PHP - Objetos
 
04 - Gerenciamento de Threads - II
04 -  Gerenciamento de Threads - II04 -  Gerenciamento de Threads - II
04 - Gerenciamento de Threads - II
 
Aula Prolog - 05
Aula Prolog - 05Aula Prolog - 05
Aula Prolog - 05
 
Desenvolvimento de Sistemas Web - HTML5 - Introdução
Desenvolvimento de Sistemas Web - HTML5 - IntroduçãoDesenvolvimento de Sistemas Web - HTML5 - Introdução
Desenvolvimento de Sistemas Web - HTML5 - Introdução
 
Haskell - Introdução
Haskell - IntroduçãoHaskell - Introdução
Haskell - Introdução
 
Aula 05 - Java Script Básico
Aula 05 -  Java Script BásicoAula 05 -  Java Script Básico
Aula 05 - Java Script Básico
 
05 - Sincronização de Threads - I
05 - Sincronização de Threads - I05 - Sincronização de Threads - I
05 - Sincronização de Threads - I
 
Programação Concorrente - Gerenciamento de Threads - Parte II
Programação Concorrente - Gerenciamento de Threads - Parte IIProgramação Concorrente - Gerenciamento de Threads - Parte II
Programação Concorrente - Gerenciamento de Threads - Parte II
 
Curso de Desenvolvimento de Sistemas Web - (X)HTML
Curso de Desenvolvimento de Sistemas Web - (X)HTMLCurso de Desenvolvimento de Sistemas Web - (X)HTML
Curso de Desenvolvimento de Sistemas Web - (X)HTML
 
Aula 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
 
Desenvolvimento de Sistemas Web - Conceitos Básicos
Desenvolvimento de Sistemas Web - Conceitos BásicosDesenvolvimento de Sistemas Web - Conceitos Básicos
Desenvolvimento de Sistemas Web - Conceitos Básicos
 
Web analitica orientada a usabilidade
Web analitica orientada a usabilidadeWeb analitica orientada a usabilidade
Web analitica orientada a usabilidade
 
02 conceitos iniciais
02   conceitos iniciais02   conceitos iniciais
02 conceitos iniciais
 
IA Prolog
IA PrologIA Prolog
IA Prolog
 
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
 
Aula Prolog 02
Aula Prolog 02Aula Prolog 02
Aula Prolog 02
 
Prolog 04 - Regras
Prolog 04 - RegrasProlog 04 - Regras
Prolog 04 - Regras
 
Aula Prolog 01
Aula Prolog 01Aula Prolog 01
Aula Prolog 01
 
Aula Prolog 03
Aula Prolog 03Aula Prolog 03
Aula Prolog 03
 

Mais de Fabio Moura Pereira

Programação Concorrente - Gerenciamento de Threads - Parte I
Programação Concorrente - Gerenciamento de Threads - Parte IProgramação Concorrente - Gerenciamento de Threads - Parte I
Programação Concorrente - Gerenciamento de Threads - Parte IFabio 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
 
Programação Concorrente - Introdução
Programação Concorrente - IntroduçãoProgramação Concorrente - Introdução
Programação Concorrente - IntroduçãoFabio 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 - 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 (17)

Aula Prolog 09 - Listas
Aula Prolog 09 - ListasAula Prolog 09 - Listas
Aula Prolog 09 - Listas
 
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
 
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
 
Programação Concorrente - Introdução
Programação Concorrente - IntroduçãoProgramação Concorrente - Introdução
Programação Concorrente - Introdução
 
Aula Persistência 01 (Java)
Aula Persistência 01 (Java)Aula Persistência 01 (Java)
Aula Persistência 01 (Java)
 
Aula Tratamento de Exceções
Aula Tratamento de ExceçõesAula Tratamento de Exceções
Aula Tratamento de Exceções
 
Aula Interface Gráfica do Usuário
Aula Interface Gráfica do UsuárioAula Interface Gráfica do Usuário
Aula Interface Gráfica do Usuário
 
Aula Java Swing
Aula Java SwingAula Java Swing
Aula Java Swing
 
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 07 - Estruturas de Dados

  • 1. Prolog – 07 Fábio M. Pereira Baseado em Amzi! inc. – www.amzi.com
  • 2. Aventura em Prolog 2 Aventura em Prolog  Estruturas de Dados  Exercícios
  • 3. Aventura em Prolog 3 Estruturas de Dados  Até agora, trabalhamos com fatos, consultas e regras que usam estruturas de dados simples  Os argumentos de nossos predicados têm sido átomos ou inteiros, blocos básicos de construção em Prolog  Ex.: maçã, escritório, lanterna, cobertor  Tipos de dados primitivos podem ser combinados para formar tipos de dados complexos, chamados estruturas
  • 4. Aventura em Prolog 4 Estruturas de Dados  Uma estrutura é composta por um funtor e um número fixo de argumentos  Da mesma forma que objetivos e fatos funtor(arq1, arq2, ...)  Cada argumento de uma estrutura pode ser um tipo de dado primitivo ou uma outra estrutura  Ex.: os objetos do jogo são atualmente representados usando átomos, como ‘escrivaninha’, ‘maçã’, mas podemos utilizar estruturas para criar uma representação mais rica das coisas
  • 5. Aventura em Prolog 5 Exemplos  As estruturas a seguir descrevem um objeto, sua cor, tamanho e peso: objeto(vela, vermelha, pequena, 0.1). objeto(maçã, vermelha, pequena, 0.1). objeto(maçã, verde, pequena, 0.1). objeto(mesa, azul, grande, 50).  Estas estruturas podem ser utilizadas diretamente no segundo argumento de local/2, mas para experimentação, iremos criar um novo predicado local_s/2
  • 6. Aventura em Prolog 6 Consultas  Note que mesmo usando estruturas complexas para descrever os objetos do jogo, local_s/2 continua apenas com dois argumentos: local_s(objeto(vela, vermelha, pequena, 0.1), cozinha). local_s(objeto(maçã, vermelha, pequena, 0.1), cozinha). local_s(objeto(maçã, verde, pequena, 0.1), cozinha). local_s(objeto(mesa, azul, grande, 50), cozinha).  Variáveis em Prolog são “sem tipo” e podem casar facilmente tanto com estruturas como com átomos
  • 7. Aventura em Prolog 7 Átomo X Estrutura  De fato, um átomo é apenas uma estrutura simples com um funtor e sem argumentos  Exemplo: ?- local_s(X, cozinha). X = objeto(vela, vermelha, pequena, 0.1) ; X = objeto(maçã, vermelha, pequena, 0.1) ; X = objeto(maçã, verde, pequena, 0.1) ; X = objeto(mesa, azul, grande, 50) ; No
  • 8. Aventura em Prolog 8 Variáveis X Estruturas  Podemos também escolher parte da estrutura com variáveis  Ex.: encontrar todos os objetos vermelhos que estão na cozinha ?- local_s(objeto(X, vermelha, T, P), cozinha). X = vela T = pequena P = 0.1 ; X = maçã T = pequena P = 0.1 ; No
  • 9. Aventura em Prolog 9 Variável Anônima  Se nós não nos preocupamos com o tamanho e o peso podemos substituir as variáveis T e P pela variável anônima (_) ?- local_s(objeto(X, vermelha, _, _), cozinha). X = vela ; X = maçã ; No
  • 10. Aventura em Prolog 10 Nani Search  Podemos usar estas estruturas para dar mais realismo ao jogo  Por exemplo, podemos modificar o predicado pode_pegar/1, de maneira que só possamos pegar objetos pequenos pode_pegar_s(Objeto):- aqui(Lugar), (local_s(objeto(Objeto, _, pequeno, _), Lugar); local_s(objeto(Objeto, _, pequena, _), Lugar)).  Podemos também mudar as mensagens de erro para refletir as duas razões porque um objeto não pode ser carregado
  • 11. Aventura em Prolog 11 Predicado Interno not/1  Para garantir que o backtracking não cause a exibição das duas mensagens de erro, iremos construir cada cláusula de maneira que uma única condição seja encontrada  Para fazer isso, utilizaremos o predicado interno not/1 – o seu argumento é um objetivo, e ele é bem sucedido se o seu argumento falha e falha caso seu argumento seja bem sucedido ?- not( sala(escritório) ). No ?- not( local(repolho, ‘sala de jantar’) ). Yes
  • 12. Aventura em Prolog 12 Predicado Interno not/1  Semanticamente, not em Prolog significa que o objetivo não pode ser resolvido de maneira bem sucedida com a base de dados lógica atual de fatos e regras  Lembre-se da “hipótese do mundo fechado”
  • 13. Aventura em Prolog 13 Nova versão de pode_pegar/1 pode_pegar_s(Objeto):- aqui(Lugar), local_s(objeto(Objeto, _, pequeno, _), Lugar). pode_pegar_s(Objeto):- aqui(Lugar), local_s(objeto(Objeto, _, grande, _), Lugar), write(‘O(a) ’), write(Objeto), write(‘ é grande demais para ser carregado(a).’), nl, fail. pode_pegar_s(Objeto):- aqui(Lugar), not( local_s(objeto(Objeto, _, _, _), Lugar) ), write(‘Não há nenhum(a) ’), write(Objeto), write(‘ aqui.’), nl, fail.
  • 14. Aventura em Prolog 14 Nova versão de pode_pegar/1  Agora podemos tentar, assumindo que estamos na cozinha: ?- pode_pegar_s(vela). Yes ?- pode_pegar_s(mesa). O(a) mesa é grande demais para ser carregado(a). No ?- pode_pegar_s(escrivaninha). Não há nenhum(a) escrivaninha aqui. No
  • 15. Aventura em Prolog 15 Nani Search  O predicado lista_objetos/1 pode ser modificado para dar uma descrição dos objeto na sala: lista_objetos_s(Lugar):- local_s(objeto(Objeto, Cor, Tamanho, Peso), Lugar), write(‘Um(a) ’), write(Objeto), tab(1), write(Cor), tab(1), write(Tamanho), write(‘, pesando ’), write(Peso), write(‘ kilo(s)’), nl, fail. lista_objetos_s(_).
  • 16. Aventura em Prolog 16 Nani Search  Solicitando uma lista mais detalhada: ?- lista_objetos_s(cozinha). Um(a) vela vermelha pequena, pesando 0.1 kilo(s) Um(a) maçã vermelha pequena, pesando 0.1 kilo(s) Um(a) maçã verde pequena, pesando 0.1 kilo(s) Um(a) mesa azul grande, pesando 50 kilo(s)
  • 17. Aventura em Prolog 17 Aperfeiçoando...  Cansado do formato ‘0.1 kilo(s)’?  Podemos corrigir isso criando uma nova regra para escrever o peso, a qual poderá substituir os write’s diretos até agora utilizados... write_peso(P):- P < 2, write(P), write(‘ kilo’). write_peso(P):- P >= 2, write(P), write(‘ kilos’).  Testando... ?- write_peso(4). ?- write_peso(1). 4 kilos 1 kilo Yes Yes
  • 18. Aventura em Prolog 18 Estruturas de Dados  Estruturas podem ser arbitrariamente complexas, se quisermos ser mais caprichosos a respeito dos objetos do jogo, podemos manter suas dimensões (comprimento, largura, altura) em vez de seu tamanho, como parte de sua descrição: objeto(mesa, marrom, dimensao(6, 3, 3), 90).  Podemos também usar estruturas embarcadas por motivo de clareza: objeto(mesa, cor(marrom), tamanho(grande), peso(90)).
  • 19. Aventura em Prolog 19 Estruturas de Dados  Uma consulta utilizando estas estruturas apresenta uma leitura mais fácil: ?- local_s(objeto(X, _, tamanho(grande), _), escritório).  Note que a posição dos argumentos é importante  Os locais onde colocamos variáveis anônimas são essenciais para a obtenção de resultados corretos
  • 20. Aventura em Prolog 20 Exercícios (1)  Nani Search  Incorpore um novo local ao jogo  Note que devido a abstração de dados e procedimentos, nós precisamos mudar apenas os predicados de baixo nível que lidam diretamente com localização  Os predicados de alto nível, como olhar/0 e pegar/1 não são afetados pela mudança
  • 21. Aventura em Prolog 21 O que vem a seguir?  Unificação  Listas  ...