SlideShare uma empresa Scribd logo
Prolog – 09
Fábio M. Pereira
Baseado em
Amzi! inc. – www.amzi.com
Aventura em Prolog 2
Prolog
 Listas
 Utilizando Listas
 Listas X Base de Dados
 Exercícios
Aventura em Prolog 3
Listas
 Lista é uma poderosa estrutura de dados para
manusear e manipular grupos de objetos
 Em Prolog, uma lista é simplesmente uma
coleção de termos
 Os termos podem ser de qualquer tipo de dado
Prolog, incluindo estruturas e outras listas
 Sintaticamente, uma lista é denotada por
colchetes com os termos separados por
vírgulas
 Ex: uma lista de objetos da cozinha
[maçã, brócolis, refrigerador]
Aventura em Prolog 4
Nani Search
 Isto nos dá uma alternativa para representar a
localização dos objetos
 Em vez de termos predicados de localização
separados para cada objeto, podemos ter um
predicado de localização por container, com uma
lista de objetos do container
loc_list([maçã, brócolis, biscoito], cozinha).
loc_list([escrivaninha, computador], escritório).
loc_list([lanterna, envelope], escrivaninha).
loc_list([selo, chave], envelope).
loc_list([‘máquina de lavar’], porão).
loc_list([cobertor], ‘máquina de lavar’).
Aventura em Prolog 5
Lista Vazia
 Existe uma lista especial, chamada lista
vazia, que é representada por um
conjunto de colchetes ([])
 Também pode ser referenciada como nil
 Pode descrever a falta de conteúdo para
um lugar ou objeto
loc_list([], saguão).
Aventura em Prolog 6
Listas X Unificação
 Unificação trabalha com listas da
mesma forma que trabalha com outras
estruturas de dados
 Com o que sabemos até agora sobre
listas, podemos perguntar
?- loc_list(X, cozinha).
X = [maçã, brócolis, biscoito]
?- [_,X,_] = [maçã, brócolis, biscoito].
X = brócolis
Aventura em Prolog 7
Listas X Unificação
 Este último exemplo é uma maneira não
prática de retirar elementos de uma
lista
 Uma vez que os padrões não unificam a não
ser que ambas as listas possuam o mesmo
número de elementos
 Para uma lista ser útil, deve existir uma
maneira fácil de acessar, adicionar e
remover elementos da lista, sem nos
preocupar com o número de elementos
da lista ou com sua ordem
Aventura em Prolog 8
Acesso a Elementos da Lista
 Duas características de Prolog permitem este
fácil acesso:
 Uma notação especial que permite referenciar o
primeiro elemento da lista e o restante dos
elementos da lista
 A outra é recursão
 Estas duas características nos permite
escrever predicados úteis de listas, como
membro/2, que encontra um membro de uma
lista e anexar/3, que une duas listas
Aventura em Prolog 9
Acesso a Elementos da Lista
 Todos os predicados de listas seguem uma
estratégia similar
 Tentar alguma coisa com o primeiro elemento de
uma lista
 Então, recursivamente repetir o processo com o
restante da lista
 Notação especial para estruturas de lista:
 [X | Y], onde
 X é ligada ao primeiro elemento da lista
(cabeça/head)
 Y é ligada aos elementos restantes da lista
(calda/tail)
Aventura em Prolog 10
Unificação usando Listas
 O exemplo seguinte tem unificação bem
sucedida porque as duas estruturas são
sintaticamente equivalentes, note que a calda
é uma lista:
?- [a | [b,c,d]] = [a,b,c,d].
Yes
 O próximo exemplo falha por causa do mal
uso do símbolo de barra (|)
 O que segue a barra deve ser um termo único, para
ter finalidade prática, deve ser uma lista
 O exemplo incorretamente apresenta três termos
após a barra
?- [a | b,c,d] = [a,b,c,d].
No
Aventura em Prolog 11
Exemplos
?- [H|T] = [maçã, brócolis, refrigerador].
H = maçã
T = [brócolis, refrigerador]
?- [H|T] = [a, b, c, d, e].
H = a
T = [b, c, d, e]
?- [H|T] = [maçãs, bananas].
H = maçãs
T = [bananas]
?- [H|T] = [a, [b,c,d]].
H = a
T = [[b,c,d]]
Aventura em Prolog 12
Exemplos
 A calda é uma lista vazia:
?- [H|T] = [maçãs].
H = maçãs
T = []
 A lista vazia não unifica com a sintaxe
de listas padrão porque ela não possui
calda
?- [H|T] = [].
No
Aventura em Prolog 13
Exemplos
 Podemos especificar mais que apenas o
primeiro elemento antes da barra (|)
 De fato, a única regra é que deve ser seguida por
uma lista
?- [Um, Dois | T] = [maçã, biscoito, bolo, leite].
Um = maçã
Dois = biscoito
T = [bolo, leite]
?- [X,Y|T] = [a|Z]. ?- [H|T] = [maçã, Z].
X = a H = maçã
Y = _01 T = [_01]
T = _03 Z = _01
Z = [_01 | _03]
Unificação com listas: entendimento
crítico para a construção de
predicados com listas
Aventura em Prolog 14
Listas
 Uma lista pode ser vista como uma cabeça e
uma lista calda, cuja cabeça é o segundo
elemento e cuja calda é uma lista, cuja cabeça
é o terceiro elemento, e assim por diante
?- [a| [b| [c| [d| []]]]] = [a,b,c,d].
Yes
 Dissemos que uma lista é um tipo especial de
estrutura
 Em um sentido, ela é, mas em outro ela é apenas
como outro termo Prolog
 Se chamarmos a lista de dot/2, então a lista
[a,b,c,d] poderia ser
dot(a, dot(b, dot(c, dot(d, []))))
Aventura em Prolog 15
Notação dot
 De fato, este predicado existe, pelo menos
conceitualmente, e é chamado de dot, mas é
representado por um ponto (.) em vez de dot
 Para vermos a notação de dot, usamos o
predicado interno display/1, que é similar a
write/1, exceto pelo fato de que sempre usa a
sintaxe dot para listas quando escreve na tela
?- X = [a,b,c,d], write(X), nl, display(X), nl.
[a, b, c, d]
.(a, .(b, .(c, .(d, []))))
Aventura em Prolog 16
Notação dot
 Exemplos
?- X = [Head|Tail], write(X), nl, display(X), nl.
[_01| _02]
.(_01, _02)
?- X = [a, b, [c, d], e], write(X), nl, display(X), nl.
[a, b, [c, d], e]
.(a, .(b, .(.(c, .(d, [])), .(e, []))))
Aventura em Prolog 17
Notação dot
 Por que diferentes sintaxes para listas?
 A sintaxe mais fácil facilita a leitura, mas
algumas vezes obscurece o comportamento
do predicado
 A sintaxe dot ajuda a manter esta estrutura
“real” de listas em mente quando
trabalhando com predicados que manipulam
listas
 Esta estrutura de listas é adequada à
escrita de rotinas recursivas
 A seguir veremos o predicado membro/2
Aventura em Prolog 18
membro/2
 Como todo predicado recursivo, iniciaremos
com a condição limite ou caso base
 Um elemento é um membro de uma lista se ele é a
cabeça da lista
membro(H, [H|T]).
 Esta cláusula ilustra como um fato com argumentos
variáveis age como uma regra
 A segunda cláusula de membro/2 é o caso
recursivo
 Ele diz que um elemento é membro da lista se é
membro da calda da lista
membro(X, [H|T]):- membro(X,T).
Aventura em Prolog 19
membro/2
 Note que ambas as cláusulas de membro/2
esperam uma lista como segundo argumento
 Uma vez que T em [H|T] na segunda cláusula é ele
mesmo uma lista, a chamada recursiva a membro/2
funciona
?- membro(maçã, [maçã, brócolis, biscoito]).
Yes
?- membro(brócolis, [maçã, brócolis, biscoito]).
Yes
?- membro(banana, [maçã, brócolis, biscoito]).
No
Aventura em Prolog 20
membro/2
 Utilize trace para acompanhar o
funcionamento do predicado membro/2
 membro/2 pode ser usado de várias
maneiras, observe o uso de variáveis e
backtracking
?- membro(X, [maçã, brócolis, biscoito]).
X = maçã ;
X = brócolis ;
X = biscoito ;
No
Aventura em Prolog 21
anexar/3
 Outro predicado útil de listas:
 Constrói listas a partir de outras listas
 Alternativamente divide lista em peças
separadas
 Neste predicado o segundo argumento é
anexado ao primeiro argumento para
formar o terceiro argumento
 Exemplo:
?- anexar([a,b,c], [d,e,f], X).
X = [a,b,c,d,e,f]
Aventura em Prolog 22
anexar/3
 O funcionamento deste predicado é um pouco
mais difícil de seguir do que membro/2:
 A estratégia básica de trabalhar com a cabeça da
lista não é adequada ao problema de adicionar
alguma coisa no fim de uma lista
 anexar/3 resolve este problema reduzindo a
primeira lista recursivamente
 A condição limite é que uma lista X esteja
anexada a uma lista vazia – o resultado é
também uma lista X
anexar([], X, X).
Aventura em Prolog 23
anexar/3
 A condição recursiva nos diz que se a
lista X é adicionada à lista [H|T1], então
a cabeça da nova lista é também H, e a
calda da nova lista é o resultado da
inclusão de X à calda da primeira lista:
anexar([H|T1], X, [H|T2]):-
anexar(T1, X, T2).
 O predicado completo é:
anexar([], X, X).
anexar([H|T1], X, [H|T2]):-
anexar(T1, X, T2).
Aventura em Prolog 24
Exemplos
?- anexar(X, Y, [a,b,c]).
X = []
Y = [a,b,c] ;
X = [a]
Y = [b,c] ;
X = [a,b]
Y = [c] ;
X = [a,b,c]
Y = [] ;
No
Aventura em Prolog 25
Utilizando Listas
 Agora que possuímos ferramentas para
manipulação de listas, podemos utilizá-las
 Por exemplo, se resolvermos usar loc_list/2
em vez de local/2 para armazenar objetos,
podemos escrever um novo local/2 que se
comporte exatamente igual ao anterior, exceto
pelo fato de computar a resposta em vez de
realizar uma busca
 Isto ilustrará a linha nebulosa que algumas vezes
existe entre dados e procedimento
 O resto do programa não sabe como local/2
consegue seu resultado, se como dado ou por
computação, mas o comportamento é igual até
mesmo no backtracking
Aventura em Prolog 26
Nani Search
 local/2:
local(X,Y):-
loc_list(Lista, Y), membro(X, Lista).
 No jogo, será necessário adicionar objetos às
listas quando algum objeto é deixado em uma
sala
 Podemos escrever add_objeto/3, que usa anexar/3
 Se os chamarmos de NovoObjeto e Container, ela
nos dará uma NovaLista:
add_objeto(NovoObjeto, Container, NovaLista):-
loc_list(ListaAnterior, Container),
anexar([NovoObjeto], ListaAnterior, NovaLista).
Aventura em Prolog 27
Nani Search
 Adicionando objetos:
?- add_objeto(ameixa, cozinha, X).
X = [ameixa, maçã, brócolis, biscoito]
 Entretanto, este é um caso onde o
mesmo efeito pode ser alcançado
através da unificação e da notação de
listas [Head|Tail]
add_objeto2(NovoObjeto, Container, NovaLista):-
loc_list(ListaAnterior, Container),
NovaLista = [NovoObjeto | ListaAnterior].
Aventura em Prolog 28
Nani Search
 Testando...
?- add_objeto2(ameixa, cozinha, X).
X = [ameixa, maçã, brócolis, biscoito]
 Podemos simplificar um passo, removendo a
unificação explícita e usando a unificação
implícita, que ocorre na cláusula da cabeça
(head), que é a forma preferencial de
construção deste tipo de predicado
add_objeto3(NovoObj, Container, [NovoObj|ListaAnterior]):-
loc_list(ListaAnterior, Container).
Aventura em Prolog 29
Nani Search
 Funciona da mesma maneira...
?- add_objeto3(ameixa, cozinha, X).
X = [ameixa, maçã, brócolis, biscoito]
 Na prática, devemos escrever
deixar_objeto/2 diretamente sem usar o
predicado add_objeto/3 para construir
uma nova lista para nós:
deixar_objeto(Objeto, Lugar):-
retract(loc_list(Lista, Lugar)),
asserta(loc_list([Objeto|Lista], Lugar)).
Aventura em Prolog 30
Listas X Base de Dados
 Quando você deve usar entradas na base de
dados ou listas para situações, como fizemos
para localização dos objetos, é um questão de
estilo
 A sua experiência irá levá-lo a utilizar uma ou outra
em diferentes situações
 Algumas vezes, o backtracking sobre múltiplos
predicados é uma solução mais natural para um
problema e outras vezes lidar com recursão sobre
listas é mais natural
 Você deve achar que algumas partes de uma
aplicação em particular se enquadram melhor com
múltiplos fatos na base de dados lógica e outras
partes com listas – neste caso é útil saber como
mudar de um formato para o outro
Aventura em Prolog 31
Listas X Base de Dados
 Converter de uma lista para fatos
múltiplos é simples
 Você pode escrever uma rotina que
continuamente adiciona a cabeça da lista
 Neste exemplo criamos fatos individuais no
predicado coisas/1
break_out([]).
break_out([Head | Tail]):-
assertz(coisas(Head)),
break_out(Tail).
Aventura em Prolog 32
Listas X Base de Dados
 Funcionamento:
?- break_out([lápis, biscoito, neve]).
Yes
?- coisas(X).
X = lápis ;
X = biscoito ;
X = neve ;
No
Aventura em Prolog 33
Listas X Base de Dados
 Transformar múltiplos fatos em uma lista é
mais difícil
 Por esta razão, a maioria das versão de Prolog
fornecem predicados internos que fazem este
trabalho
 O mais comum é findall/3, cujos argumentos
são
 arg1 – Um padrão para os termos na lista resultante
 arg2 – Um padrão objetivo
 arg3 – A lista resultante
Aventura em Prolog 34
Listas X Base de Dados
 findall/3 automaticamente faz uma busca por
backtracking completa do padrão objetivo e
armazena cada resultado na lista
 Podemos transformar nosso coisas/1 de volta
em uma lista:
?- findall(X, coisas(X), L).
L = [lápis, biscoito, neve]
 Padrões interessantes estão disponíveis
 Veja como criar uma lista das salas que possuem
conexão com a cozinha:
?- findall(X, conexao(cozinha, X), L).
L = [escritório, porão, ‘sala de jantar’]
Aventura em Prolog 35
Listas X Base de Dados
 O padrão para o primeiro argumento pode ser
até mesmo mais atrativo e o segundo
argumento pode ser uma conjunção de
objetivos
 Parênteses são usados para agrupar a conjunção de
objetivos no segundo argumento, evitando a
ambigüidade em potencial
 Aqui findall/3 cria uma lista de estruturas que
localizam os objetos comestíveis
?- findall(alimentoEm(X,Y), (local(X,Y) , comestivel(X)), L).
L = [alimentoEm(maçã, cozinha), alimentoEm(biscoito,
cozinha)]
Aventura em Prolog 36
Exercícios
 Escreve rotinas de listas que realizem as
seguintes funções:
 Remover um elemento dado da lista
 Encontrar o elemento após um elemento dado
 Dividir a lista em duas listas a partir de um
elemento dado
 Retornar o último elemento de uma lista
 Contar os elementos de uma lista
 Dica: o tamanho de uma lista vazia é zero, o
tamanho de uma lista não vazia é 1 + o tamanho
de sua calda
Aventura em Prolog 37
Exercícios
 Uma vez que write/1 recebe um único
argumento, múltiplos ‘writes’ são necessários
para imprimir uma mistura de strings de texto
e variáveis
 Escreva um predicado de lista respond/1 que recebe
como seu único argumento uma lista de termos a
serem impressos
 Este predicado pode ser usado no jogo para
comunicação com o jogador
 Exemplo:
respond([‘Você não pode ir para a ’, Sala, ‘ a partir
daqui’])
Aventura em Prolog 38
Exercícios
 Listas com uma variável na calda são
chamadas listas abertas
 Elas possuem algumas propriedades
interessantes
 Por exemplo, membro/2 pode ser usado para
adicionar itens a uma lista aberta
 Experimente fazer o rastreamento das seguintes
consultas:
?- membro(a,X).
?- membro(b, [a,b,c|X]).
?- membro(d, [a,b,c|X]).
?- ListaAberta = [a,b,c|X], membro(d, ListaAberta),
write(ListaAberta).
Aventura em Prolog 39
Exercícios
 Tente adivinhar o resultado das
consultas:
?- [a,b,c,d] = [H|T].
?- [a,[b,c,d]] = [H|T].
?- [] = [H|T].
?- [a] = [H|T].
?- [maçã,3,X,‘O que?'] = [A,B|Z].
?- [[a,b,c],[d,e,f],[g,h,i]] = [H|T].
?- [a(X,c(d,Y)), b(2,3), c(d,Y)] = [H|T].
Aventura em Prolog 40
Exercícios
 Banco de dados genealógico
 Considere o seguinte programa Prolog:
pais(a1, a2).
pais(a2, a3).
pais(a3, a4).
pais(a4, a5).
ancestral(A, D, [A]):- pais (A,D).
ancestral(A, D, [X|Z]):-
pais(X,D),
ancestral(A, X, Z).
 Qual a finalidade do terceiro argumento de
ancestral?
Aventura em Prolog 41
Exercícios
 Banco de dados genealógico (cont.)
 Adivinhe a resposta das seguintes
consultas:
?- ancestral(a2, a3, X).
?- ancestral(a1, a5, X).
?- ancestral(a5, a1, X).
?- ancestral(X, a5, Z).
Aventura em Prolog 42
O que vem a seguir?
 Operadores
 Corte
 ...

Mais conteúdo relacionado

Mais procurados

Aula 02 - Tipos de dados, Variáveis, Constantes e Operadores Aritméticos
Aula 02 - Tipos de dados, Variáveis, Constantes e Operadores AritméticosAula 02 - Tipos de dados, Variáveis, Constantes e Operadores Aritméticos
Aula 02 - Tipos de dados, Variáveis, Constantes e Operadores Aritméticos
Messias Batista
 
Algoritmo recursivo
Algoritmo recursivoAlgoritmo recursivo
Algoritmo recursivo
Carlos Rodrigo de Araujo
 
Poo encapsulamento
Poo encapsulamentoPoo encapsulamento
Poo encapsulamento
Sedu
 
Conjuntos
ConjuntosConjuntos
[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화
NAVER D2
 
Laboratório de Programação II: Tipo Abstrato de Dados (TAD)
Laboratório de Programação II: Tipo Abstrato de Dados (TAD)Laboratório de Programação II: Tipo Abstrato de Dados (TAD)
Laboratório de Programação II: Tipo Abstrato de Dados (TAD)
Alex Camargo
 
Matrix calculus
Matrix calculusMatrix calculus
Matrix calculus
Sungbin Lim
 
JAVA - Matrizes
JAVA - MatrizesJAVA - Matrizes
JAVA - Matrizes
Elaine Cecília Gatto
 
Md9 estruturas algébricas
Md9 estruturas algébricasMd9 estruturas algébricas
Md9 estruturas algébricas
Ulrich Schiel
 
Unsupervised learning represenation with DCGAN
Unsupervised learning represenation with DCGANUnsupervised learning represenation with DCGAN
Unsupervised learning represenation with DCGAN
Shyam Krishna Khadka
 
Aula espaço vetorial
Aula espaço vetorialAula espaço vetorial
Aula espaço vetorial
Tuane Paixão
 
POO - 19 - Elementos Estáticos
POO - 19 - Elementos EstáticosPOO - 19 - Elementos Estáticos
POO - 19 - Elementos Estáticos
Ludimila Monjardim Casagrande
 
パターン認識と機械学習6章(カーネル法)
パターン認識と機械学習6章(カーネル法)パターン認識と機械学習6章(カーネル法)
パターン認識と機械学習6章(カーネル法)
Yukara Ikemiya
 
今さら聞けないカーネル法とサポートベクターマシン
今さら聞けないカーネル法とサポートベクターマシン今さら聞けないカーネル法とサポートベクターマシン
今さら聞けないカーネル法とサポートベクターマシンShinya Shimizu
 
Teorema do confronto
Teorema do confrontoTeorema do confronto
Teorema do confronto
calculogrupo
 
Curso de Java (Parte 2)
 Curso de Java (Parte 2) Curso de Java (Parte 2)
Curso de Java (Parte 2)
Mario Sergio
 
Apostila Calculo 1 - Limites de uma função - Engenharia Civil
Apostila Calculo 1 - Limites de uma função - Engenharia CivilApostila Calculo 1 - Limites de uma função - Engenharia Civil
Apostila Calculo 1 - Limites de uma função - Engenharia Civil
Ana Carolline Pereira
 
Backpropagation in Convolutional Neural Network
Backpropagation in Convolutional Neural NetworkBackpropagation in Convolutional Neural Network
Backpropagation in Convolutional Neural Network
Hiroshi Kuwajima
 
統計的学習の基礎 4.4~
統計的学習の基礎 4.4~統計的学習の基礎 4.4~
統計的学習の基礎 4.4~
Atsushi Hayakawa
 
Python 활용: 이미지 처리와 데이터 분석
Python 활용: 이미지 처리와 데이터 분석Python 활용: 이미지 처리와 데이터 분석
Python 활용: 이미지 처리와 데이터 분석
용 최
 

Mais procurados (20)

Aula 02 - Tipos de dados, Variáveis, Constantes e Operadores Aritméticos
Aula 02 - Tipos de dados, Variáveis, Constantes e Operadores AritméticosAula 02 - Tipos de dados, Variáveis, Constantes e Operadores Aritméticos
Aula 02 - Tipos de dados, Variáveis, Constantes e Operadores Aritméticos
 
Algoritmo recursivo
Algoritmo recursivoAlgoritmo recursivo
Algoritmo recursivo
 
Poo encapsulamento
Poo encapsulamentoPoo encapsulamento
Poo encapsulamento
 
Conjuntos
ConjuntosConjuntos
Conjuntos
 
[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화
 
Laboratório de Programação II: Tipo Abstrato de Dados (TAD)
Laboratório de Programação II: Tipo Abstrato de Dados (TAD)Laboratório de Programação II: Tipo Abstrato de Dados (TAD)
Laboratório de Programação II: Tipo Abstrato de Dados (TAD)
 
Matrix calculus
Matrix calculusMatrix calculus
Matrix calculus
 
JAVA - Matrizes
JAVA - MatrizesJAVA - Matrizes
JAVA - Matrizes
 
Md9 estruturas algébricas
Md9 estruturas algébricasMd9 estruturas algébricas
Md9 estruturas algébricas
 
Unsupervised learning represenation with DCGAN
Unsupervised learning represenation with DCGANUnsupervised learning represenation with DCGAN
Unsupervised learning represenation with DCGAN
 
Aula espaço vetorial
Aula espaço vetorialAula espaço vetorial
Aula espaço vetorial
 
POO - 19 - Elementos Estáticos
POO - 19 - Elementos EstáticosPOO - 19 - Elementos Estáticos
POO - 19 - Elementos Estáticos
 
パターン認識と機械学習6章(カーネル法)
パターン認識と機械学習6章(カーネル法)パターン認識と機械学習6章(カーネル法)
パターン認識と機械学習6章(カーネル法)
 
今さら聞けないカーネル法とサポートベクターマシン
今さら聞けないカーネル法とサポートベクターマシン今さら聞けないカーネル法とサポートベクターマシン
今さら聞けないカーネル法とサポートベクターマシン
 
Teorema do confronto
Teorema do confrontoTeorema do confronto
Teorema do confronto
 
Curso de Java (Parte 2)
 Curso de Java (Parte 2) Curso de Java (Parte 2)
Curso de Java (Parte 2)
 
Apostila Calculo 1 - Limites de uma função - Engenharia Civil
Apostila Calculo 1 - Limites de uma função - Engenharia CivilApostila Calculo 1 - Limites de uma função - Engenharia Civil
Apostila Calculo 1 - Limites de uma função - Engenharia Civil
 
Backpropagation in Convolutional Neural Network
Backpropagation in Convolutional Neural NetworkBackpropagation in Convolutional Neural Network
Backpropagation in Convolutional Neural Network
 
統計的学習の基礎 4.4~
統計的学習の基礎 4.4~統計的学習の基礎 4.4~
統計的学習の基礎 4.4~
 
Python 활용: 이미지 처리와 데이터 분석
Python 활용: 이미지 처리와 데이터 분석Python 활용: 이미지 처리와 데이터 분석
Python 활용: 이미지 처리와 데이터 분석
 

Destaque

Prolog2 (1)
Prolog2 (1)Prolog2 (1)
Aula de Prolog 06 - Recursão
Aula de Prolog 06 - RecursãoAula de Prolog 06 - Recursão
Aula de Prolog 06 - Recursão
Fabio Moura Pereira
 
Prolog 04 - Regras
Prolog 04 - RegrasProlog 04 - Regras
Prolog 04 - Regras
Fabio Moura Pereira
 
Aula Prolog 01
Aula Prolog 01Aula Prolog 01
Aula Prolog 01
Fabio Moura Pereira
 
Aula Prolog 02
Aula Prolog 02Aula Prolog 02
Aula Prolog 02
Fabio Moura Pereira
 
Aula Prolog 03
Aula Prolog 03Aula Prolog 03
Aula Prolog 03
Fabio Moura Pereira
 
Aula Persistência 01 (Java)
Aula Persistência 01 (Java)Aula Persistência 01 (Java)
Aula Persistência 01 (Java)
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 I
Fabio Moura Pereira
 
04 - Gerenciamento de Threads - II
04 -  Gerenciamento de Threads - II04 -  Gerenciamento de Threads - II
04 - Gerenciamento de Threads - II
Fabio Moura Pereira
 
Aula Prolog - 05
Aula Prolog - 05Aula Prolog - 05
Aula Prolog - 05
Fabio 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ção
Fabio Moura Pereira
 
Haskell - Introdução
Haskell - IntroduçãoHaskell - Introdução
Haskell - Introdução
Fabio Moura Pereira
 
05 - Sincronização de Threads - I
05 - Sincronização de Threads - I05 - Sincronização de Threads - I
05 - Sincronização de Threads - I
Fabio 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 II
Fabio Moura Pereira
 
Aula Tratamento de Exceções
Aula Tratamento de ExceçõesAula Tratamento de Exceções
Aula Tratamento de Exceções
Fabio Moura Pereira
 
Programação Concorrente - Introdução
Programação Concorrente - IntroduçãoProgramação Concorrente - Introdução
Programação Concorrente - Introdução
Fabio 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 - CSS3
Fabio 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ário
Fabio Moura Pereira
 
Aula Java Swing
Aula Java SwingAula Java Swing
Aula Java Swing
Fabio Moura Pereira
 
Regression and Classification: An Artificial Neural Network Approach
Regression and Classification: An Artificial Neural Network ApproachRegression and Classification: An Artificial Neural Network Approach
Regression and Classification: An Artificial Neural Network Approach
Khulna University
 

Destaque (20)

Prolog2 (1)
Prolog2 (1)Prolog2 (1)
Prolog2 (1)
 
Aula de Prolog 06 - Recursão
Aula de Prolog 06 - RecursãoAula de Prolog 06 - Recursão
Aula de Prolog 06 - Recursão
 
Prolog 04 - Regras
Prolog 04 - RegrasProlog 04 - Regras
Prolog 04 - Regras
 
Aula Prolog 01
Aula Prolog 01Aula Prolog 01
Aula Prolog 01
 
Aula Prolog 02
Aula Prolog 02Aula Prolog 02
Aula Prolog 02
 
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
 
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
 
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
 
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
 
Regression and Classification: An Artificial Neural Network Approach
Regression and Classification: An Artificial Neural Network ApproachRegression and Classification: An Artificial Neural Network Approach
Regression and Classification: An Artificial Neural Network Approach
 

Semelhante a Aula Prolog 09 - Listas

Listas Encadeadas
Listas EncadeadasListas Encadeadas
Listas Encadeadas
Sérgio Souza Costa
 
Python 02
Python 02Python 02
Python 02
Bruno Catão
 
Pymordida0 Semana de computação da SOCIESC - 2008/10
Pymordida0 Semana de computação da SOCIESC - 2008/10Pymordida0 Semana de computação da SOCIESC - 2008/10
Pymordida0 Semana de computação da SOCIESC - 2008/10
Marco Mendes
 
Técnicas de Programação Funcional
Técnicas de Programação FuncionalTécnicas de Programação Funcional
Técnicas de Programação Funcional
Lambda 3
 
Listas Estáticas Encadeadas usando linguagem C
Listas Estáticas Encadeadas usando linguagem CListas Estáticas Encadeadas usando linguagem C
Listas Estáticas Encadeadas usando linguagem C
MarcosEvandroCintra
 
Linguagem R
Linguagem RLinguagem R
Linguagem R
Anderson Sanches
 
Programando em python listas
Programando em python   listasProgramando em python   listas
Programando em python listas
samuelthiago
 
Listas: conceito e estáticas
Listas:  conceito e estáticasListas:  conceito e estáticas
Listas: conceito e estáticas
Sérgio Souza Costa
 
Programando em python recursao
Programando em python   recursaoProgramando em python   recursao
Programando em python recursao
samuelthiago
 
15 algoritmos de busca em tabelas - sequencial e binaria
15   algoritmos de busca em tabelas - sequencial e binaria15   algoritmos de busca em tabelas - sequencial e binaria
15 algoritmos de busca em tabelas - sequencial e binaria
Ricardo Bolanho
 
Aula - Estruturas de Dados em Python (Curso de Python Básico -- FATEC SENAI M...
Aula - Estruturas de Dados em Python (Curso de Python Básico -- FATEC SENAI M...Aula - Estruturas de Dados em Python (Curso de Python Básico -- FATEC SENAI M...
Aula - Estruturas de Dados em Python (Curso de Python Básico -- FATEC SENAI M...
Filipe Chagas Ferraz
 
Usar explicação
Usar explicaçãoUsar explicação
Usar explicação
Ademar Trindade
 
30-aula30.pdf
30-aula30.pdf30-aula30.pdf
30-aula30.pdf
ronaldo ramos
 
Conjuntos Autor Antonio Carlos Carneiro Barroso
Conjuntos Autor Antonio Carlos Carneiro BarrosoConjuntos Autor Antonio Carlos Carneiro Barroso
Conjuntos Autor Antonio Carlos Carneiro Barroso
guestbf5561
 
Paradigma Funcional - Caso de Estudo Haskell
Paradigma Funcional - Caso de Estudo HaskellParadigma Funcional - Caso de Estudo Haskell
Paradigma Funcional - Caso de Estudo Haskell
Sérgio Souza Costa
 
Estrutura de Dados - Listas Encadeadas
Estrutura de Dados - Listas EncadeadasEstrutura de Dados - Listas Encadeadas
Estrutura de Dados - Listas Encadeadas
Adriano Teixeira de Souza
 
aula5 - Manipulação de Strings.pdf
aula5 -  Manipulação de Strings.pdfaula5 -  Manipulação de Strings.pdf
aula5 - Manipulação de Strings.pdf
DionatasSantos2
 
Programacao logica
Programacao logicaProgramacao logica
Programacao logica
Ialis Cavalcante
 
Apostila do excel 2010 (1)
Apostila do excel 2010 (1)Apostila do excel 2010 (1)
Apostila do excel 2010 (1)
Simone Aparecida Almeida
 
Apostila do excel 2010
Apostila do excel 2010Apostila do excel 2010
Apostila do excel 2010
Sandra Ari
 

Semelhante a Aula Prolog 09 - Listas (20)

Listas Encadeadas
Listas EncadeadasListas Encadeadas
Listas Encadeadas
 
Python 02
Python 02Python 02
Python 02
 
Pymordida0 Semana de computação da SOCIESC - 2008/10
Pymordida0 Semana de computação da SOCIESC - 2008/10Pymordida0 Semana de computação da SOCIESC - 2008/10
Pymordida0 Semana de computação da SOCIESC - 2008/10
 
Técnicas de Programação Funcional
Técnicas de Programação FuncionalTécnicas de Programação Funcional
Técnicas de Programação Funcional
 
Listas Estáticas Encadeadas usando linguagem C
Listas Estáticas Encadeadas usando linguagem CListas Estáticas Encadeadas usando linguagem C
Listas Estáticas Encadeadas usando linguagem C
 
Linguagem R
Linguagem RLinguagem R
Linguagem R
 
Programando em python listas
Programando em python   listasProgramando em python   listas
Programando em python listas
 
Listas: conceito e estáticas
Listas:  conceito e estáticasListas:  conceito e estáticas
Listas: conceito e estáticas
 
Programando em python recursao
Programando em python   recursaoProgramando em python   recursao
Programando em python recursao
 
15 algoritmos de busca em tabelas - sequencial e binaria
15   algoritmos de busca em tabelas - sequencial e binaria15   algoritmos de busca em tabelas - sequencial e binaria
15 algoritmos de busca em tabelas - sequencial e binaria
 
Aula - Estruturas de Dados em Python (Curso de Python Básico -- FATEC SENAI M...
Aula - Estruturas de Dados em Python (Curso de Python Básico -- FATEC SENAI M...Aula - Estruturas de Dados em Python (Curso de Python Básico -- FATEC SENAI M...
Aula - Estruturas de Dados em Python (Curso de Python Básico -- FATEC SENAI M...
 
Usar explicação
Usar explicaçãoUsar explicação
Usar explicação
 
30-aula30.pdf
30-aula30.pdf30-aula30.pdf
30-aula30.pdf
 
Conjuntos Autor Antonio Carlos Carneiro Barroso
Conjuntos Autor Antonio Carlos Carneiro BarrosoConjuntos Autor Antonio Carlos Carneiro Barroso
Conjuntos Autor Antonio Carlos Carneiro Barroso
 
Paradigma Funcional - Caso de Estudo Haskell
Paradigma Funcional - Caso de Estudo HaskellParadigma Funcional - Caso de Estudo Haskell
Paradigma Funcional - Caso de Estudo Haskell
 
Estrutura de Dados - Listas Encadeadas
Estrutura de Dados - Listas EncadeadasEstrutura de Dados - Listas Encadeadas
Estrutura de Dados - Listas Encadeadas
 
aula5 - Manipulação de Strings.pdf
aula5 -  Manipulação de Strings.pdfaula5 -  Manipulação de Strings.pdf
aula5 - Manipulação de Strings.pdf
 
Programacao logica
Programacao logicaProgramacao logica
Programacao logica
 
Apostila do excel 2010 (1)
Apostila do excel 2010 (1)Apostila do excel 2010 (1)
Apostila do excel 2010 (1)
 
Apostila do excel 2010
Apostila do excel 2010Apostila do excel 2010
Apostila do excel 2010
 

Mais de Fabio Moura Pereira

Aula de Prolog 08 - Unificação
Aula de Prolog 08 - UnificaçãoAula de Prolog 08 - Unificação
Aula de Prolog 08 - Unificação
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ência
Fabio 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ção
Fabio 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
 
Padrões de Projeto de Software
Padrões de Projeto de SoftwarePadrões de Projeto de Software
Padrões de Projeto de Software
Fabio Moura Pereira
 
Curso de PHP - Objetos
Curso de PHP - ObjetosCurso de PHP - Objetos
Curso de PHP - Objetos
Fabio Moura Pereira
 
Curso de PHP - Arrays
Curso de PHP - ArraysCurso de PHP - Arrays
Curso de PHP - Arrays
Fabio Moura Pereira
 
Desenvolvimento de Jogos - Game Design
Desenvolvimento de Jogos - Game DesignDesenvolvimento de Jogos - Game Design
Desenvolvimento de Jogos - Game Design
Fabio Moura Pereira
 
Desenvolvimento de Jogos - Mercado Parte 2
Desenvolvimento de Jogos - Mercado Parte 2Desenvolvimento de Jogos - Mercado Parte 2
Desenvolvimento de Jogos - Mercado Parte 2
Fabio Moura Pereira
 
Desenvolvimento de Jogos - Mercado Parte 1
Desenvolvimento de Jogos - Mercado Parte 1Desenvolvimento de Jogos - Mercado Parte 1
Desenvolvimento de Jogos - Mercado Parte 1
Fabio Moura Pereira
 
PHP - Funções
PHP - FunçõesPHP - Funções
PHP - Funções
Fabio Moura Pereira
 
PHP - Introdução
PHP - IntroduçãoPHP - Introdução
PHP - Introdução
Fabio Moura Pereira
 
PHP - Strings
PHP - StringsPHP - Strings
PHP - Strings
Fabio Moura Pereira
 

Mais de Fabio Moura Pereira (13)

Aula de Prolog 08 - Unificação
Aula de Prolog 08 - UnificaçãoAula de Prolog 08 - Unificação
Aula de Prolog 08 - Unificação
 
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 - Objetos
Curso de PHP - ObjetosCurso de PHP - Objetos
Curso de PHP - Objetos
 
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
 
PHP - Strings
PHP - StringsPHP - Strings
PHP - Strings
 

Último

Por que escolhi o Flutter - Campus Party Piauí.pdf
Por que escolhi o Flutter - Campus Party Piauí.pdfPor que escolhi o Flutter - Campus Party Piauí.pdf
Por que escolhi o Flutter - Campus Party Piauí.pdf
Ian Oliveira
 
Como fui de 0 a lead na gringa em 3 anos.pptx
Como fui de 0 a lead na gringa em 3 anos.pptxComo fui de 0 a lead na gringa em 3 anos.pptx
Como fui de 0 a lead na gringa em 3 anos.pptx
tnrlucas
 
Orientações para utilizar Drone no espaço Brasil
Orientações para utilizar Drone no espaço BrasilOrientações para utilizar Drone no espaço Brasil
Orientações para utilizar Drone no espaço Brasil
EliakimArajo2
 
PRATICANDO O SCRUM Scrum team, product owner
PRATICANDO O SCRUM Scrum team, product ownerPRATICANDO O SCRUM Scrum team, product owner
PRATICANDO O SCRUM Scrum team, product owner
anpproferick
 
Ferramentas e Técnicas para aplicar no seu dia a dia numa Transformação Digital!
Ferramentas e Técnicas para aplicar no seu dia a dia numa Transformação Digital!Ferramentas e Técnicas para aplicar no seu dia a dia numa Transformação Digital!
Ferramentas e Técnicas para aplicar no seu dia a dia numa Transformação Digital!
Annelise Gripp
 
Teoria de redes de computadores redes .doc
Teoria de redes de computadores redes .docTeoria de redes de computadores redes .doc
Teoria de redes de computadores redes .doc
anpproferick
 
Gestão de dados: sua importância e benefícios
Gestão de dados: sua importância e benefíciosGestão de dados: sua importância e benefícios
Gestão de dados: sua importância e benefícios
Rafael Santos
 

Último (7)

Por que escolhi o Flutter - Campus Party Piauí.pdf
Por que escolhi o Flutter - Campus Party Piauí.pdfPor que escolhi o Flutter - Campus Party Piauí.pdf
Por que escolhi o Flutter - Campus Party Piauí.pdf
 
Como fui de 0 a lead na gringa em 3 anos.pptx
Como fui de 0 a lead na gringa em 3 anos.pptxComo fui de 0 a lead na gringa em 3 anos.pptx
Como fui de 0 a lead na gringa em 3 anos.pptx
 
Orientações para utilizar Drone no espaço Brasil
Orientações para utilizar Drone no espaço BrasilOrientações para utilizar Drone no espaço Brasil
Orientações para utilizar Drone no espaço Brasil
 
PRATICANDO O SCRUM Scrum team, product owner
PRATICANDO O SCRUM Scrum team, product ownerPRATICANDO O SCRUM Scrum team, product owner
PRATICANDO O SCRUM Scrum team, product owner
 
Ferramentas e Técnicas para aplicar no seu dia a dia numa Transformação Digital!
Ferramentas e Técnicas para aplicar no seu dia a dia numa Transformação Digital!Ferramentas e Técnicas para aplicar no seu dia a dia numa Transformação Digital!
Ferramentas e Técnicas para aplicar no seu dia a dia numa Transformação Digital!
 
Teoria de redes de computadores redes .doc
Teoria de redes de computadores redes .docTeoria de redes de computadores redes .doc
Teoria de redes de computadores redes .doc
 
Gestão de dados: sua importância e benefícios
Gestão de dados: sua importância e benefíciosGestão de dados: sua importância e benefícios
Gestão de dados: sua importância e benefícios
 

Aula Prolog 09 - Listas

  • 1. Prolog – 09 Fábio M. Pereira Baseado em Amzi! inc. – www.amzi.com
  • 2. Aventura em Prolog 2 Prolog  Listas  Utilizando Listas  Listas X Base de Dados  Exercícios
  • 3. Aventura em Prolog 3 Listas  Lista é uma poderosa estrutura de dados para manusear e manipular grupos de objetos  Em Prolog, uma lista é simplesmente uma coleção de termos  Os termos podem ser de qualquer tipo de dado Prolog, incluindo estruturas e outras listas  Sintaticamente, uma lista é denotada por colchetes com os termos separados por vírgulas  Ex: uma lista de objetos da cozinha [maçã, brócolis, refrigerador]
  • 4. Aventura em Prolog 4 Nani Search  Isto nos dá uma alternativa para representar a localização dos objetos  Em vez de termos predicados de localização separados para cada objeto, podemos ter um predicado de localização por container, com uma lista de objetos do container loc_list([maçã, brócolis, biscoito], cozinha). loc_list([escrivaninha, computador], escritório). loc_list([lanterna, envelope], escrivaninha). loc_list([selo, chave], envelope). loc_list([‘máquina de lavar’], porão). loc_list([cobertor], ‘máquina de lavar’).
  • 5. Aventura em Prolog 5 Lista Vazia  Existe uma lista especial, chamada lista vazia, que é representada por um conjunto de colchetes ([])  Também pode ser referenciada como nil  Pode descrever a falta de conteúdo para um lugar ou objeto loc_list([], saguão).
  • 6. Aventura em Prolog 6 Listas X Unificação  Unificação trabalha com listas da mesma forma que trabalha com outras estruturas de dados  Com o que sabemos até agora sobre listas, podemos perguntar ?- loc_list(X, cozinha). X = [maçã, brócolis, biscoito] ?- [_,X,_] = [maçã, brócolis, biscoito]. X = brócolis
  • 7. Aventura em Prolog 7 Listas X Unificação  Este último exemplo é uma maneira não prática de retirar elementos de uma lista  Uma vez que os padrões não unificam a não ser que ambas as listas possuam o mesmo número de elementos  Para uma lista ser útil, deve existir uma maneira fácil de acessar, adicionar e remover elementos da lista, sem nos preocupar com o número de elementos da lista ou com sua ordem
  • 8. Aventura em Prolog 8 Acesso a Elementos da Lista  Duas características de Prolog permitem este fácil acesso:  Uma notação especial que permite referenciar o primeiro elemento da lista e o restante dos elementos da lista  A outra é recursão  Estas duas características nos permite escrever predicados úteis de listas, como membro/2, que encontra um membro de uma lista e anexar/3, que une duas listas
  • 9. Aventura em Prolog 9 Acesso a Elementos da Lista  Todos os predicados de listas seguem uma estratégia similar  Tentar alguma coisa com o primeiro elemento de uma lista  Então, recursivamente repetir o processo com o restante da lista  Notação especial para estruturas de lista:  [X | Y], onde  X é ligada ao primeiro elemento da lista (cabeça/head)  Y é ligada aos elementos restantes da lista (calda/tail)
  • 10. Aventura em Prolog 10 Unificação usando Listas  O exemplo seguinte tem unificação bem sucedida porque as duas estruturas são sintaticamente equivalentes, note que a calda é uma lista: ?- [a | [b,c,d]] = [a,b,c,d]. Yes  O próximo exemplo falha por causa do mal uso do símbolo de barra (|)  O que segue a barra deve ser um termo único, para ter finalidade prática, deve ser uma lista  O exemplo incorretamente apresenta três termos após a barra ?- [a | b,c,d] = [a,b,c,d]. No
  • 11. Aventura em Prolog 11 Exemplos ?- [H|T] = [maçã, brócolis, refrigerador]. H = maçã T = [brócolis, refrigerador] ?- [H|T] = [a, b, c, d, e]. H = a T = [b, c, d, e] ?- [H|T] = [maçãs, bananas]. H = maçãs T = [bananas] ?- [H|T] = [a, [b,c,d]]. H = a T = [[b,c,d]]
  • 12. Aventura em Prolog 12 Exemplos  A calda é uma lista vazia: ?- [H|T] = [maçãs]. H = maçãs T = []  A lista vazia não unifica com a sintaxe de listas padrão porque ela não possui calda ?- [H|T] = []. No
  • 13. Aventura em Prolog 13 Exemplos  Podemos especificar mais que apenas o primeiro elemento antes da barra (|)  De fato, a única regra é que deve ser seguida por uma lista ?- [Um, Dois | T] = [maçã, biscoito, bolo, leite]. Um = maçã Dois = biscoito T = [bolo, leite] ?- [X,Y|T] = [a|Z]. ?- [H|T] = [maçã, Z]. X = a H = maçã Y = _01 T = [_01] T = _03 Z = _01 Z = [_01 | _03] Unificação com listas: entendimento crítico para a construção de predicados com listas
  • 14. Aventura em Prolog 14 Listas  Uma lista pode ser vista como uma cabeça e uma lista calda, cuja cabeça é o segundo elemento e cuja calda é uma lista, cuja cabeça é o terceiro elemento, e assim por diante ?- [a| [b| [c| [d| []]]]] = [a,b,c,d]. Yes  Dissemos que uma lista é um tipo especial de estrutura  Em um sentido, ela é, mas em outro ela é apenas como outro termo Prolog  Se chamarmos a lista de dot/2, então a lista [a,b,c,d] poderia ser dot(a, dot(b, dot(c, dot(d, []))))
  • 15. Aventura em Prolog 15 Notação dot  De fato, este predicado existe, pelo menos conceitualmente, e é chamado de dot, mas é representado por um ponto (.) em vez de dot  Para vermos a notação de dot, usamos o predicado interno display/1, que é similar a write/1, exceto pelo fato de que sempre usa a sintaxe dot para listas quando escreve na tela ?- X = [a,b,c,d], write(X), nl, display(X), nl. [a, b, c, d] .(a, .(b, .(c, .(d, []))))
  • 16. Aventura em Prolog 16 Notação dot  Exemplos ?- X = [Head|Tail], write(X), nl, display(X), nl. [_01| _02] .(_01, _02) ?- X = [a, b, [c, d], e], write(X), nl, display(X), nl. [a, b, [c, d], e] .(a, .(b, .(.(c, .(d, [])), .(e, []))))
  • 17. Aventura em Prolog 17 Notação dot  Por que diferentes sintaxes para listas?  A sintaxe mais fácil facilita a leitura, mas algumas vezes obscurece o comportamento do predicado  A sintaxe dot ajuda a manter esta estrutura “real” de listas em mente quando trabalhando com predicados que manipulam listas  Esta estrutura de listas é adequada à escrita de rotinas recursivas  A seguir veremos o predicado membro/2
  • 18. Aventura em Prolog 18 membro/2  Como todo predicado recursivo, iniciaremos com a condição limite ou caso base  Um elemento é um membro de uma lista se ele é a cabeça da lista membro(H, [H|T]).  Esta cláusula ilustra como um fato com argumentos variáveis age como uma regra  A segunda cláusula de membro/2 é o caso recursivo  Ele diz que um elemento é membro da lista se é membro da calda da lista membro(X, [H|T]):- membro(X,T).
  • 19. Aventura em Prolog 19 membro/2  Note que ambas as cláusulas de membro/2 esperam uma lista como segundo argumento  Uma vez que T em [H|T] na segunda cláusula é ele mesmo uma lista, a chamada recursiva a membro/2 funciona ?- membro(maçã, [maçã, brócolis, biscoito]). Yes ?- membro(brócolis, [maçã, brócolis, biscoito]). Yes ?- membro(banana, [maçã, brócolis, biscoito]). No
  • 20. Aventura em Prolog 20 membro/2  Utilize trace para acompanhar o funcionamento do predicado membro/2  membro/2 pode ser usado de várias maneiras, observe o uso de variáveis e backtracking ?- membro(X, [maçã, brócolis, biscoito]). X = maçã ; X = brócolis ; X = biscoito ; No
  • 21. Aventura em Prolog 21 anexar/3  Outro predicado útil de listas:  Constrói listas a partir de outras listas  Alternativamente divide lista em peças separadas  Neste predicado o segundo argumento é anexado ao primeiro argumento para formar o terceiro argumento  Exemplo: ?- anexar([a,b,c], [d,e,f], X). X = [a,b,c,d,e,f]
  • 22. Aventura em Prolog 22 anexar/3  O funcionamento deste predicado é um pouco mais difícil de seguir do que membro/2:  A estratégia básica de trabalhar com a cabeça da lista não é adequada ao problema de adicionar alguma coisa no fim de uma lista  anexar/3 resolve este problema reduzindo a primeira lista recursivamente  A condição limite é que uma lista X esteja anexada a uma lista vazia – o resultado é também uma lista X anexar([], X, X).
  • 23. Aventura em Prolog 23 anexar/3  A condição recursiva nos diz que se a lista X é adicionada à lista [H|T1], então a cabeça da nova lista é também H, e a calda da nova lista é o resultado da inclusão de X à calda da primeira lista: anexar([H|T1], X, [H|T2]):- anexar(T1, X, T2).  O predicado completo é: anexar([], X, X). anexar([H|T1], X, [H|T2]):- anexar(T1, X, T2).
  • 24. Aventura em Prolog 24 Exemplos ?- anexar(X, Y, [a,b,c]). X = [] Y = [a,b,c] ; X = [a] Y = [b,c] ; X = [a,b] Y = [c] ; X = [a,b,c] Y = [] ; No
  • 25. Aventura em Prolog 25 Utilizando Listas  Agora que possuímos ferramentas para manipulação de listas, podemos utilizá-las  Por exemplo, se resolvermos usar loc_list/2 em vez de local/2 para armazenar objetos, podemos escrever um novo local/2 que se comporte exatamente igual ao anterior, exceto pelo fato de computar a resposta em vez de realizar uma busca  Isto ilustrará a linha nebulosa que algumas vezes existe entre dados e procedimento  O resto do programa não sabe como local/2 consegue seu resultado, se como dado ou por computação, mas o comportamento é igual até mesmo no backtracking
  • 26. Aventura em Prolog 26 Nani Search  local/2: local(X,Y):- loc_list(Lista, Y), membro(X, Lista).  No jogo, será necessário adicionar objetos às listas quando algum objeto é deixado em uma sala  Podemos escrever add_objeto/3, que usa anexar/3  Se os chamarmos de NovoObjeto e Container, ela nos dará uma NovaLista: add_objeto(NovoObjeto, Container, NovaLista):- loc_list(ListaAnterior, Container), anexar([NovoObjeto], ListaAnterior, NovaLista).
  • 27. Aventura em Prolog 27 Nani Search  Adicionando objetos: ?- add_objeto(ameixa, cozinha, X). X = [ameixa, maçã, brócolis, biscoito]  Entretanto, este é um caso onde o mesmo efeito pode ser alcançado através da unificação e da notação de listas [Head|Tail] add_objeto2(NovoObjeto, Container, NovaLista):- loc_list(ListaAnterior, Container), NovaLista = [NovoObjeto | ListaAnterior].
  • 28. Aventura em Prolog 28 Nani Search  Testando... ?- add_objeto2(ameixa, cozinha, X). X = [ameixa, maçã, brócolis, biscoito]  Podemos simplificar um passo, removendo a unificação explícita e usando a unificação implícita, que ocorre na cláusula da cabeça (head), que é a forma preferencial de construção deste tipo de predicado add_objeto3(NovoObj, Container, [NovoObj|ListaAnterior]):- loc_list(ListaAnterior, Container).
  • 29. Aventura em Prolog 29 Nani Search  Funciona da mesma maneira... ?- add_objeto3(ameixa, cozinha, X). X = [ameixa, maçã, brócolis, biscoito]  Na prática, devemos escrever deixar_objeto/2 diretamente sem usar o predicado add_objeto/3 para construir uma nova lista para nós: deixar_objeto(Objeto, Lugar):- retract(loc_list(Lista, Lugar)), asserta(loc_list([Objeto|Lista], Lugar)).
  • 30. Aventura em Prolog 30 Listas X Base de Dados  Quando você deve usar entradas na base de dados ou listas para situações, como fizemos para localização dos objetos, é um questão de estilo  A sua experiência irá levá-lo a utilizar uma ou outra em diferentes situações  Algumas vezes, o backtracking sobre múltiplos predicados é uma solução mais natural para um problema e outras vezes lidar com recursão sobre listas é mais natural  Você deve achar que algumas partes de uma aplicação em particular se enquadram melhor com múltiplos fatos na base de dados lógica e outras partes com listas – neste caso é útil saber como mudar de um formato para o outro
  • 31. Aventura em Prolog 31 Listas X Base de Dados  Converter de uma lista para fatos múltiplos é simples  Você pode escrever uma rotina que continuamente adiciona a cabeça da lista  Neste exemplo criamos fatos individuais no predicado coisas/1 break_out([]). break_out([Head | Tail]):- assertz(coisas(Head)), break_out(Tail).
  • 32. Aventura em Prolog 32 Listas X Base de Dados  Funcionamento: ?- break_out([lápis, biscoito, neve]). Yes ?- coisas(X). X = lápis ; X = biscoito ; X = neve ; No
  • 33. Aventura em Prolog 33 Listas X Base de Dados  Transformar múltiplos fatos em uma lista é mais difícil  Por esta razão, a maioria das versão de Prolog fornecem predicados internos que fazem este trabalho  O mais comum é findall/3, cujos argumentos são  arg1 – Um padrão para os termos na lista resultante  arg2 – Um padrão objetivo  arg3 – A lista resultante
  • 34. Aventura em Prolog 34 Listas X Base de Dados  findall/3 automaticamente faz uma busca por backtracking completa do padrão objetivo e armazena cada resultado na lista  Podemos transformar nosso coisas/1 de volta em uma lista: ?- findall(X, coisas(X), L). L = [lápis, biscoito, neve]  Padrões interessantes estão disponíveis  Veja como criar uma lista das salas que possuem conexão com a cozinha: ?- findall(X, conexao(cozinha, X), L). L = [escritório, porão, ‘sala de jantar’]
  • 35. Aventura em Prolog 35 Listas X Base de Dados  O padrão para o primeiro argumento pode ser até mesmo mais atrativo e o segundo argumento pode ser uma conjunção de objetivos  Parênteses são usados para agrupar a conjunção de objetivos no segundo argumento, evitando a ambigüidade em potencial  Aqui findall/3 cria uma lista de estruturas que localizam os objetos comestíveis ?- findall(alimentoEm(X,Y), (local(X,Y) , comestivel(X)), L). L = [alimentoEm(maçã, cozinha), alimentoEm(biscoito, cozinha)]
  • 36. Aventura em Prolog 36 Exercícios  Escreve rotinas de listas que realizem as seguintes funções:  Remover um elemento dado da lista  Encontrar o elemento após um elemento dado  Dividir a lista em duas listas a partir de um elemento dado  Retornar o último elemento de uma lista  Contar os elementos de uma lista  Dica: o tamanho de uma lista vazia é zero, o tamanho de uma lista não vazia é 1 + o tamanho de sua calda
  • 37. Aventura em Prolog 37 Exercícios  Uma vez que write/1 recebe um único argumento, múltiplos ‘writes’ são necessários para imprimir uma mistura de strings de texto e variáveis  Escreva um predicado de lista respond/1 que recebe como seu único argumento uma lista de termos a serem impressos  Este predicado pode ser usado no jogo para comunicação com o jogador  Exemplo: respond([‘Você não pode ir para a ’, Sala, ‘ a partir daqui’])
  • 38. Aventura em Prolog 38 Exercícios  Listas com uma variável na calda são chamadas listas abertas  Elas possuem algumas propriedades interessantes  Por exemplo, membro/2 pode ser usado para adicionar itens a uma lista aberta  Experimente fazer o rastreamento das seguintes consultas: ?- membro(a,X). ?- membro(b, [a,b,c|X]). ?- membro(d, [a,b,c|X]). ?- ListaAberta = [a,b,c|X], membro(d, ListaAberta), write(ListaAberta).
  • 39. Aventura em Prolog 39 Exercícios  Tente adivinhar o resultado das consultas: ?- [a,b,c,d] = [H|T]. ?- [a,[b,c,d]] = [H|T]. ?- [] = [H|T]. ?- [a] = [H|T]. ?- [maçã,3,X,‘O que?'] = [A,B|Z]. ?- [[a,b,c],[d,e,f],[g,h,i]] = [H|T]. ?- [a(X,c(d,Y)), b(2,3), c(d,Y)] = [H|T].
  • 40. Aventura em Prolog 40 Exercícios  Banco de dados genealógico  Considere o seguinte programa Prolog: pais(a1, a2). pais(a2, a3). pais(a3, a4). pais(a4, a5). ancestral(A, D, [A]):- pais (A,D). ancestral(A, D, [X|Z]):- pais(X,D), ancestral(A, X, Z).  Qual a finalidade do terceiro argumento de ancestral?
  • 41. Aventura em Prolog 41 Exercícios  Banco de dados genealógico (cont.)  Adivinhe a resposta das seguintes consultas: ?- ancestral(a2, a3, X). ?- ancestral(a1, a5, X). ?- ancestral(a5, a1, X). ?- ancestral(X, a5, Z).
  • 42. Aventura em Prolog 42 O que vem a seguir?  Operadores  Corte  ...