<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Respostas de dominio publico :)
% Carregue esse arquivo no swiprolog usando:
% [respostas-p1].
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Q1:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Seja criativo ;)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Q2:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% As questoes abaixo estao comentadas para nao dar pau no carregamento no SWI-PL

%?- 3+1 = 1+3.
%false
    %% 3+1 = 1+3 e' igual a false.
    %% 3+1 = 3+1 SERIA true, ja que sao realmente iguais.
    %% O prolog faz distincao em relacao a ordem dos termos entre as operacoes.
    
%?- f(X, a(b,X)) = f(Z, a(Z,c)).
%false.
    %% O prolog nesse caso instancia o valor b em Z e o valor c em X
    %% Como os primeiros termo em cada predicado sao X e Z eles precisam bater,
    %% mas nao eh o que ocorre, logo, c &lt;&gt; b...
    
%?- [2, 3, 4|Z] = [2|[3, 4, 5, 6]].
%Z = [5, 6].
    %% Uma lista em prolog (usando notacao cabeca_e_cauda, eh algo no formato
    %% [H|T], aonde H corresponde a um ou mais valores e T corresponde a uma
    %% lista de valores, logo...
    %% [2, 3, 4 | Z] corresponde a [2, 3, 4 | [5, 6]]

%?- pred([], [1]) = pred(X, [Y|X]).
%X = [],
%Y = 1.
    %% Voltando a questao anterior, temos o formato cabeca_e_cauda [H|T], logo
    %% X eh igual a lista vazia (por causa do primeiro termo de cada predicado), 
    %% entao temos o segundo predicado como pred(? , [Y|?]), aonde ? representa 
    %% vazio.
    
%?- suc(pred(suc(pred(1)))) = suc(pred(Z)).
%Z = suc(pred(1)).
    %% Apenas um jogo de substituicao aqui.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Q3:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
nao_tem_na_lista([], _).
nao_tem_na_lista([A|T], B) :-
    (B \= A),
    nao_tem_na_lista(T, B).

todos_sao_diferentes([]).
todos_sao_diferentes([A|T]) :-
    nao_tem_na_lista(T, A),
    todos_sao_diferentes(T).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Q4
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% copiado da net %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
divisible(X, Y):-
    N is Y*Y, N =&lt; X, X mod Y =:= 0.
divisible(X, Y):-
     Y &lt; X, Y1 is Y + 1, divisible(X, Y1).
isprime(X):-
    Y is 2, X &gt; 1 , \+divisible(X, Y).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fim da copia... %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Nao estou tao certo sobre essa resposta ;)
soma_de_2_naturais(0, []).
soma_de_2_naturais(X, [Y|[Z|_]]) :-
    X is Y + Z.

soma2primos(A, [X|[Y|_]]) :-
    soma_de_2_naturais(A, [X, Y]),
    isprime(X),
    isprime(Y).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Q5
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Metodo 'forca-bruta' para achar sucessor ;)
sucessor(a,b).
sucessor(b,c).
sucessor(c,d).
sucessor(d,e).
sucessor(e,f).
sucessor(f,g).
sucessor(g,h).
sucessor(h,i).
sucessor(i,j).
sucessor(j,k).
sucessor(k,l).
sucessor(l,m).
sucessor(m,n).
sucessor(n,o).
sucessor(o,p).
sucessor(p,q).
sucessor(q,r).
sucessor(r,s).
sucessor(s,t).
sucessor(t,u).
sucessor(u,v).
sucessor(v,x).
sucessor(x,z).
sucessor(z,a).

% proximo(X, n, V) encontra o elemento que esta na posicao 'atual + n'...
% proximo(a, 1, V) retorna b na variavel V
proximo(X, 0, X).
proximo(X, 1, V):-
    sucessor(X,V).
proximo(X, N, V):-
    N1 is N-1,
    proximo(X, N1, B),
    sucessor(B, V), !.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Q5 - Segunda parte (codificada)...
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

codificada([], _, []).
codificada([A|T], C, [B|X]) :-
    proximo(A, C, B),
    codificada(T, C, X), !.
</pre></body></html>