1.
Encontrar o elemento na N-ésima posição da lista
---------------------------------------------------
elemento_na_posicao(1, [H|_], H).
elemento_na_posicao(N, [_|T], Elem) :-
N > 1,
N1 is N - 1,
elemento_na_posicao(N1, T, Elem).
Exemplo:
?- elemento_na_posicao(3, [a, b, c, d], X).
X = c.
2. Remover os N primeiros elementos de uma lista
-------------------------------------------------
remover_n_primeiros(0, Lista, Lista).
remover_n_primeiros(N, [_|T], Resto) :-
N > 0,
N1 is N - 1,
remover_n_primeiros(N1, T, Resto).
Exemplo:
?- remover_n_primeiros(2, [a, b, c, d], R).
R = [c, d].
3. Inverter uma lista
----------------------
Versão simples:
inverter_lista([], []).
inverter_lista([H|T], LInvertida) :-
inverter_lista(T, TInvertida),
append(TInvertida, [H], LInvertida).
Versão eficiente com acumulador:
inverter_lista(Lista, Resultado) :-
inverter_aux(Lista, [], Resultado).
inverter_aux([], Acc, Acc).
inverter_aux([H|T], Acc, Resultado) :-
inverter_aux(T, [H|Acc], Resultado).
4. Verificar se um número é primo
----------------------------------
primo(N) :-
N > 1,
\+ tem_divisor(N, 2).
tem_divisor(N, Div) :-
Div * Div =< N,
(N mod Div =:= 0 ; tem_divisor(N, Div + 1)).
Listar primos até N:
lista_primos(Limite, Lista) :-
findall(X, (between(2, Limite, X), primo(X)), Lista).
5. Verificar se um número é par
--------------------------------
par(N) :-
N mod 2 =:= 0.
Listar pares até N:
lista_pares(Limite, Lista) :-
findall(X, (between(0, Limite, X), par(X)), Lista).
6. Explicação do operador =:=
------------------------------
O operador =:= compara o valor numérico de duas expressões.
Exemplos:
?- 2 + 3 =:= 5. % true
?- X is 4 + 1, X =:= 5. % true
?- X = 2 + 3, X =:= 5. % false (X é estrutura, não valor)