Demo entry 6627801

Primeiro Trabalho PLP

   

Submitted by Leonardo H T Volpe on Jun 29, 2017 at 23:36
Language: Prolog. Code size: 3.8 kB.

/*  PARADIGMAS DE LINGUAGENS DE PROGRAMAÇÃO – 2017-1
           Profa. Heloisa - Primeiro Trabalho           
         Aluno: Leonardo Henrique Tozzatto Volpe      */

% principal() recebe as listas L1 e L2 do usuário e gera uma lista de pares [elemento, repetições] através de conta_atomos
principal() :-
    write('Digite a lista 1: '), read(L1),              % Recebe a lista L1 do usuário
    write('Digite a lista 2: '), read(L2),              % Recebe a lista L2 do usuário
    conta_atomos(L1, L2, Lout),                         % Gera lista de pares dos elementos em comum entre L1 e L2 e suas repetições
    write('Lista de pares resultante: '), write(Lout).  % Imprime lista de pares gerada

% conta_atomos/3 recebe duas listas (L1 e L2) e gera uma lista Lout com pares contendo cada elemento em comum nas listas e suas ocorrências
conta_atomos(L1, L2, Lout) :- 
    desparentize(L1, L1d),              % L1d contém os elementos de L1 e de suas sublistas
    desparentize(L2, L2d),              % L2d contém os elementos de L2 e de suas sublistas
    tira_nao_comuns(L1d, L2d, L1dr),    % Cria L1dr com elementos de L1d que não estão em L2d
    tira_nao_comuns(L2d, L1d, L2dr),    % Cria L2dr com elementos de L2d que não estão em L1d
    append(L1dr, L2dr, Lapp),           % Une as listas L1dr e L2dr em Lapp
    monta_pares(Lapp, Lout).            % Monta lista de pares [elemento, repetições] de Lapp em Lout

% desparentize(Lx, Lxd) recebe uma lista Lx e gera outra lista Lxd contendo todos os elementos de Lx e suas sublistas
desparentize([], [])        :- !.
desparentize([H|T], [H|Td]) :- atomic(H), desparentize(T, Td), !.                   % Mantém elementos atômicos
desparentize([H|T], L)      :- var(H), desparentize(T, L), !.                       % Remove variáveis
desparentize([H|T], L)      :- is_list(H), append(H, T, A), desparentize(A, L), !.  % Quebra sublistas em elementos separados
desparentize([H|T], [H|Td]) :- compound(H), desparentize(T, Tf).                    % Mantém estruturas compostas
    
% tira_nao_comuns(L1, L2, Lr) recebe duas listas L1 e L2 e gera uma lista Lr contendo apenas elementos de L1 em comum com L2
tira_nao_comuns(_, [], [])        :- !.
tira_nao_comuns([], _, [])        :- !.
tira_nao_comuns([H|T], L, [H|Tr]) :- member(H, L), tira_nao_comuns(T, L, Tr), !.    % Se o elemento na ponta de L1 existir em L2, mantenha-o
tira_nao_comuns([H|T], L, Lr)     :- not(member(H, L)), tira_nao_comuns(T, L, Lr).  % Caso contrário, remova-o e cheque o resto

% monta_pares(L, Lp) recebe uma lista L e gera outra lista Lp com pares contendo cada elemento de L e suas ocorrências
monta_pares([], [])         :- !.
monta_pares([H|T], [Hp|Tp]) :- conta_rep(H, [H|T], RH), Hp = [H, RH],       % Monta o par Hp = [elemento H, repetições de H na lista]
                               tira_rep(H, T, TsH),  monta_pares(TsH, Tp).  % Remove outras ocorrências de H e prossegue para outro el.

% conta_rep(E, L, R) recebe um elemento E e uma lista L para contar em R as ocorrências de E em L
conta_rep(_, [], 0)      :- !.
conta_rep(E, L, 0)      :- not(member(E, L)), !.                % Se não houver o elemento na lista, contador = 0
conta_rep(E, [E|T], R) :- conta_rep(E, T, Rr), R is Rr + 1, !.  % Se o elemento na ponta da lista for E, some 1 ao contador
conta_rep(E, [_|T], R)  :- conta_rep(E, T, R).                  % Caso contrário, tente o próximo

% tira_rep(E, L, Lsr) recebe um elemento E e uma lista L para gerar outra lista Lsr com todos os elementos de L exceto E
tira_rep(_, [], [])          :- !.
tira_rep(E, [E|T], Lsr)    :- tira_rep(E, T, Lsr), !.    % Se o elemento na ponta da lista for E, remova-o e cheque o resto
tira_rep(E, [H|T], [H|Tsr]) :- tira_rep(E, T, Tsr).      % Caso contrário, mantenha o elemento e cheque o resto

This snippet took 0.01 seconds to highlight.

Back to the Entry List or Home.

Delete this entry (admin only).