Aula de Prolog 07 - Estruturas de Dados

Post on 09-Feb-2017

306 views 0 download

Transcript of Aula de Prolog 07 - Estruturas de Dados

Prolog – 07

Fábio M. Pereira

Baseado emAmzi! 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 = velaT = pequenaP = 0.1 ;

X = maçãT = pequenaP = 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 pequenospode_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/1pode_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 kiloYes 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 ...