Download - Aula de Prolog 07 - Estruturas de Dados
![Page 1: Aula de Prolog 07 - Estruturas de Dados](https://reader034.vdocuments.com.br/reader034/viewer/2022052418/589b51101a28ab4a398b67a3/html5/thumbnails/1.jpg)
Prolog – 07
Fábio M. Pereira
Baseado emAmzi! inc. – www.amzi.com
![Page 2: Aula de Prolog 07 - Estruturas de Dados](https://reader034.vdocuments.com.br/reader034/viewer/2022052418/589b51101a28ab4a398b67a3/html5/thumbnails/2.jpg)
Aventura em Prolog 2
Aventura em Prolog Estruturas de Dados Exercícios
![Page 3: Aula de Prolog 07 - Estruturas de Dados](https://reader034.vdocuments.com.br/reader034/viewer/2022052418/589b51101a28ab4a398b67a3/html5/thumbnails/3.jpg)
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
![Page 4: Aula de Prolog 07 - Estruturas de Dados](https://reader034.vdocuments.com.br/reader034/viewer/2022052418/589b51101a28ab4a398b67a3/html5/thumbnails/4.jpg)
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
![Page 5: Aula de Prolog 07 - Estruturas de Dados](https://reader034.vdocuments.com.br/reader034/viewer/2022052418/589b51101a28ab4a398b67a3/html5/thumbnails/5.jpg)
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
![Page 6: Aula de Prolog 07 - Estruturas de Dados](https://reader034.vdocuments.com.br/reader034/viewer/2022052418/589b51101a28ab4a398b67a3/html5/thumbnails/6.jpg)
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
![Page 7: Aula de Prolog 07 - Estruturas de Dados](https://reader034.vdocuments.com.br/reader034/viewer/2022052418/589b51101a28ab4a398b67a3/html5/thumbnails/7.jpg)
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
![Page 8: Aula de Prolog 07 - Estruturas de Dados](https://reader034.vdocuments.com.br/reader034/viewer/2022052418/589b51101a28ab4a398b67a3/html5/thumbnails/8.jpg)
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
![Page 9: Aula de Prolog 07 - Estruturas de Dados](https://reader034.vdocuments.com.br/reader034/viewer/2022052418/589b51101a28ab4a398b67a3/html5/thumbnails/9.jpg)
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
![Page 10: Aula de Prolog 07 - Estruturas de Dados](https://reader034.vdocuments.com.br/reader034/viewer/2022052418/589b51101a28ab4a398b67a3/html5/thumbnails/10.jpg)
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
![Page 11: Aula de Prolog 07 - Estruturas de Dados](https://reader034.vdocuments.com.br/reader034/viewer/2022052418/589b51101a28ab4a398b67a3/html5/thumbnails/11.jpg)
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
![Page 12: Aula de Prolog 07 - Estruturas de Dados](https://reader034.vdocuments.com.br/reader034/viewer/2022052418/589b51101a28ab4a398b67a3/html5/thumbnails/12.jpg)
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”
![Page 13: Aula de Prolog 07 - Estruturas de Dados](https://reader034.vdocuments.com.br/reader034/viewer/2022052418/589b51101a28ab4a398b67a3/html5/thumbnails/13.jpg)
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.
![Page 14: Aula de Prolog 07 - Estruturas de Dados](https://reader034.vdocuments.com.br/reader034/viewer/2022052418/589b51101a28ab4a398b67a3/html5/thumbnails/14.jpg)
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
![Page 15: Aula de Prolog 07 - Estruturas de Dados](https://reader034.vdocuments.com.br/reader034/viewer/2022052418/589b51101a28ab4a398b67a3/html5/thumbnails/15.jpg)
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(_).
![Page 16: Aula de Prolog 07 - Estruturas de Dados](https://reader034.vdocuments.com.br/reader034/viewer/2022052418/589b51101a28ab4a398b67a3/html5/thumbnails/16.jpg)
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)
![Page 17: Aula de Prolog 07 - Estruturas de Dados](https://reader034.vdocuments.com.br/reader034/viewer/2022052418/589b51101a28ab4a398b67a3/html5/thumbnails/17.jpg)
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
![Page 18: Aula de Prolog 07 - Estruturas de Dados](https://reader034.vdocuments.com.br/reader034/viewer/2022052418/589b51101a28ab4a398b67a3/html5/thumbnails/18.jpg)
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)).
![Page 19: Aula de Prolog 07 - Estruturas de Dados](https://reader034.vdocuments.com.br/reader034/viewer/2022052418/589b51101a28ab4a398b67a3/html5/thumbnails/19.jpg)
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
![Page 20: Aula de Prolog 07 - Estruturas de Dados](https://reader034.vdocuments.com.br/reader034/viewer/2022052418/589b51101a28ab4a398b67a3/html5/thumbnails/20.jpg)
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
![Page 21: Aula de Prolog 07 - Estruturas de Dados](https://reader034.vdocuments.com.br/reader034/viewer/2022052418/589b51101a28ab4a398b67a3/html5/thumbnails/21.jpg)
Aventura em Prolog 21
O que vem a seguir?
Unificação Listas ...