Conceitos e Predicados de Listas em Prolog
Classificado em Formação e Orientação para o Emprego
Escrito em em
português com um tamanho de 4,43 KB
Listas em Prolog
Exemplos de representação de listas:
- Lista1 = [a, b, c]
- Lista2 = [a, b, c]
Estruturas aninhadas:
- Hobbies1 = [tênis, música]
- Hobbies2 = [esqui, comida]
- L = [ana, [tênis, música], pedro, [esqui, comida]]
Estrutura de Listas: Cabeça e Cauda
Em geral, é comum tratar a cauda como um objeto simples.
- Por exemplo, L = [a, b, c] pode ser escrito como:
- Cauda = [b, c]
- L = .(a, Cauda)
- Para expressar isso, Prolog fornece a notação de barra vertical (|), que separa a cabeça da cauda:
- L = [a | Cauda]
- A notação é geral, permitindo que qualquer número de elementos seja seguido por ‘|’ e o restante da lista:
- [a, b, c] = [a | [b, c]] = [a, b | [c]] = [a, b, c | [ ]]
Predicado de Pertinência (pertence/2)
Define-se o predicado pertence(X, Y) para verificar se um elemento pertence a uma lista.
- A primeira condição especifica que um elemento X pertence à lista se ele está na cabeça dela:
pertence(X, [X|Z]). - A segunda condição especifica que um elemento X pertence à lista se ele pertencer à sua cauda:
pertence(X, [W|Z]) :- pertence(X, Z).
Condições Limites e Caso Recursivo
Ao definir um procedimento recursivo, procuram-se as condições limites (parada) e o caso recursivo:
pertence(Cabeca, [Cabeca|Cauda]).
pertence(Cabeca, [OutraCabeca|Cauda]) :-
pertence(Cabeca, Cauda).Exemplos de interrogação:
?- pertence(a, [a, b, c]).yes?- pertence(d, [a, b, c]).no?- pertence(X, [a, b, c]).X = a ; X = b ; X = c ; no
Observação: Interrogações como ?- pertence(a, X). ou ?- pertence(X, Y). podem ter infinitas respostas, pois existem infinitas listas que validam o procedimento.
Documentação de Modos de Ativação
Utiliza-se notação para documentar instanciações de variáveis:
+: argumento de entrada (deve estar instanciado)-: argumento de saída (não deve estar instanciado)?: argumento de entrada e saída (pode ou não estar instanciado)
O procedimento pertence/2 documentado para atingir a condição de parada:
% pertence(?Elemento, +Lista)
pertence(E, [E|_]).
pertence(E, [_|Cauda]) :-
pertence(E, Cauda).Último Elemento de uma Lista
Procedimento para encontrar o último elemento:
- O último elemento de uma lista com um só elemento é o próprio elemento:
ultimo(Elemento, [Elemento]). - O último elemento de uma lista com mais de um elemento é o último elemento da cauda:
ultimo(Elemento, [Cabeca|Cauda]) :- ultimo(Elemento, Cauda).
Procedimento completo:
% ultimo(?Elemento, +Lista) ultimo(Elemento, [Elemento]). ultimo(Elemento, [Cabeca|Cauda]) :- ultimo(Elemento, Cauda).
Inserção na Primeira Posição
Predicado insere/3:
insere(X, L, [X|L]).
Exemplo:
?- insere(a, [b, c, d], Y). Y=[a, b, c, d]; no
Conversão para Valores Absolutos
Converte valores de uma lista em seus valores absolutos.
Exemplo: ?- converte([5, -3, 1, -4], L). resulta em L= [5, 3, 1, 4]
converte([ ], [ ]).
converte([X|L], [Y|L2]):-
abs(X, Y),
converte(L, L2).Concatenar Duas Listas
Procedimento concatenar/3:
- Se o primeiro argumento é a lista vazia, o segundo e terceiro argumentos devem ser iguais:
concatenar([ ], L, L). - Se o primeiro argumento é não-vazio ([X|L1]), a concatenação com L2 resulta em [X|L3], onde L3 é a concatenação de L1 e L2:
concatenar([X|L1], L2, [X|L3]) :- concatenar(L1, L2, L3).
Procedimento completo:
% concatenar(?/+L1,?/?L2,+/?L) concatenar([ ], L, L). concatenar([X|L1], L2, [X|L3]) :- concatenar(L1, L2, L3).
Exemplo de interrogação:
?- concatenar(X, Y, [1, 2, 3, 4]). X = [ ] Y = [1, 2, 3, 4]; X = [1] Y = [2, 3, 4]; X = [1, 2] Y = [3, 4]; X = [1, 2, 3] Y = [4]; X = [1, 2, 3, 4] Y = [ ]; no