As listas são a estrutura de dados mais importante em Prolog. Elas permitem agrupar uma sequência de itens de forma simples e flexível. Neste artigo, vamos explorar a sintaxe das listas, a notação cabeça-cauda e como usar padrões de casamento para extrair elementos de forma declarativa.
1. O que é uma Lista em Prolog?
Uma lista em Prolog é uma sequência linear de itens delimitada por colchetes
([ ]). Os itens podem ser de qualquer tipo: números, átomos, variáveis ou até mesmo outras listas.
|
1 2 3 4 5 6 |
% Exemplos de listas [1, 2, 3] % Lista de números [ana, joao, maria] % Lista de átomos [1, hello, [2, 3]] % Lista mista (com sublista) [] % Lista vazia |
2. A Lista Vazia: []
A lista vazia é representada por []. Ela é o caso base para quase todos os
predicados recursivos que manipulam listas. Em Prolog, [] é um átomo especial que representa
“nenhum elemento”.
|
1 2 3 4 5 |
?- [] = []. true. ?- [] = [1]. false. |
3. Notação Cabeça-Cauda: [X|Y]
A notação [X|Y] é a forma mais importante de manipular listas em Prolog.
Ela separa a lista em dois componentes:
X— a cabeça: o primeiro elemento da lista.Y— a cauda: o resto da lista (que é sempre uma lista).
Essa notação é usada tanto para construir quanto para decompor listas através de unificação.
Exemplo 1: Decompondo uma Lista
|
1 2 3 |
?- [X|Y] = [terra, sol, lua]. X = terra, Y = [sol, lua]. |
A cabeça X recebe o primeiro elemento (terra) e a cauda Y recebe
o restante da lista ([sol, lua]).
Exemplo 2: Lista com Apenas um Elemento
|
1 2 3 |
?- [X|Y] = [estrela]. X = estrela, Y = []. |
Quando a lista tem apenas um elemento, a cauda é a lista vazia.
Exemplo 3: Lista Vazia
|
1 2 |
?- [X|Y] = []. false. |
A notação [X|Y] não casa com a lista vazia, pois exige pelo menos um elemento
(a cabeça).
4. Tabela de Padrões de Listas
A seguir, os principais padrões de listas e o que eles representam:
| Padrão | Significado | Exemplo de Casamento |
|---|---|---|
[] |
Lista vazia (0 elementos) | [] = [] ✅ |
[X] |
Lista com exatamente 1 elemento | [X] = [sol] → X = sol |
[X|Y] |
Lista com pelo menos 1 elemento | [X|Y] = [a,b,c] → X = a, Y = [b,c] |
[X,Y|Z] |
Lista com pelo menos 2 elementos | [X,Y|Z] = [a,b,c,d] → X = a, Y = b, Z = [c,d] |
[X,Y] |
Lista com exatamente 2 elementos | [X,Y] = [a,b] → X = a, Y = b |
[X,Y,Z] |
Lista com exatamente 3 elementos | [X,Y,Z] = [a,b,c] → X = a, Y = b, Z = c |
5. Selecionando Elementos Específicos
Usando padrões, podemos extrair qualquer elemento de uma lista. Para selecionar o terceiro elemento,
usamos a variável anônima _ para ignorar os primeiros:
|
1 2 |
?- [_,_,X|_] = [a, b, c, d, e]. X = c. |
Explicação:
_(primeiro) → ignoraa_(segundo) → ignorabX→ recebec(terceiro elemento)_(cauda) → ignora o resto[d, e]
Exemplo: Quarto Elemento
|
1 2 |
?- [_,_,_,X|_] = [1, 2, 3, 4, 5, 6]. X = 4. |
6. Padrões para Números Exatos de Elementos
Para listas com um número exato de elementos, podemos usar padrões fixos:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
% Exatamente 2 elementos ?- [X,Y] = [sol, lua]. X = sol, Y = lua. % Exatamente 3 elementos ?- [X,Y,Z] = [a, b, c]. X = a, Y = b, Z = c. % Falha quando o tamanho não coincide ?- [X,Y] = [a, b, c]. false. |
7. Exercícios Propostos
Pratique a extração de elementos usando padrões:
-
Segundo elemento: Escreva um padrão que extraia o segundo elemento da lista
[10, 20, 30, 40].
Resposta:?- [_,X|_] = [10, 20, 30, 40].→ X = 20. -
Quarto elemento: Extraia o quarto elemento da lista
[a, b, c, d, e, f].
Resposta:?- [_,_,_,X|_] = [a, b, c, d, e, f].→ X = d. -
Último elemento: Como extrair o último elemento de uma lista com qualquer tamanho?
Dica: Useappend/3ou recursão. -
Lista com 2 elementos: Verifique se
[a, b, c]casa com[X, Y].
Resposta:false(tamanhos diferentes).
8. A Importância da Notação Cabeça-Cauda
A notação [X|Y] é a base de praticamente todos os predicados recursivos
que manipulam listas em Prolog. Ela permite:
- Percorrer listas elemento por elemento.
- Construir novas listas adicionando elementos à frente.
- Dividir uma lista em partes menores.
- Combinar listas através de recursão.
Veja um exemplo clássico: o predicado membro/2 que verifica se um elemento está em uma lista:
|
1 2 3 |
membro(X, [X|_]). % X é a cabeça membro(X, [_|T]) :- % X está na cauda membro(X, T). |
Esse predicado usa a notação cabeça-cauda para:
- Verificar se
Xé o primeiro elemento ([X|_]). - Se não for, ignorar a cabeça e verificar recursivamente na cauda (
[_|T]).
Dominar a notação [X|Y] é o primeiro passo para se tornar proficiente em Prolog.
Pratique com diferentes padrões e explore como eles se comportam em unificações e recursões.