Advertisement
Guest User

Untitled

a guest
Oct 17th, 2019
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Prolog 3.48 KB | None | 0 0
  1. % concatena duas listas
  2. concatena([], Lista, Lista).
  3. concatena([X|Y], List2, [X|Resp]) :-
  4.           concatena(Y, List2, Resp).
  5.  
  6. % inverte uma lista
  7. reverte([], []).
  8. reverte([X|Y], L) :-
  9.           reverte(Y, Y1), concatena(Y1, [X], L).
  10.  
  11. % função auxiliar para o Ex p1
  12. soma([], [], 0).
  13. soma([X|List], [K|M], K) :-
  14.           soma(List, M, N), K is N+X.
  15.  
  16. % retorna a lista das, somas, porém invertida
  17. soma_aux(List, Resp) :-
  18.           reverte(List, B), soma(B, Resp, _).
  19.  
  20. % booleano para ver se X é maior que Y
  21. maior_que(X, Y) :- X > Y.
  22.  
  23. % realiza a junção de duas listas ordenadas, formando uma lista ordenada, mas com repetição
  24. junta_com_rep([], List, List2) :-
  25.           concatena([], List, List2).
  26. junta_com_rep(List, [], List2) :-
  27.           concatena(List, [], List2).
  28. junta_com_rep([X|Caud1], [Y|Caud2], [X|M]) :-
  29.           not(maior_que(X, Y)),
  30.           p3(Caud1, [Y|Caud2], M).
  31. junta_com_rep([X|Caud1], [Y|Caud2], [Y|M]) :-
  32.           maior_que(X, Y),
  33.           junta_com_rep([X|Caud1], Caud2, M).
  34.  
  35. % verifica se o elemento X aparece em uma lista
  36. aparece(X, [X|_]).
  37. aparece(X, [_|Y]) :-
  38.           aparece(X, Y).
  39.  
  40. % retira todas as ocorrências de um elemento X da lista
  41. retirar_elemento(_, [], []).
  42. retirar_elemento(X, [X|List1], Resp) :-
  43.           retirar_elemento(X, List1, Resp).
  44. retirar_elemento(X, [Y|List1], [Y|Resp1]) :-
  45.           not(X == Y), retirar_elemento(X, List1, Resp1).
  46.  
  47. % retira a repeticao dos elementos da lista
  48. retirar_repeticao([], []).
  49. retirar_repeticao([X|List1], [X|List2]) :-
  50.           retirar_elemento(X, List1, Aux2),
  51.           retirar_repeticao(Aux2, List2).
  52.  
  53. % retira apenas uma ocorrência de um elemento X da lista
  54. retirar_uma_ocu(X, [X|L], L).
  55. retirar_uma_ocu(X, [Y|L], [Y|L1]) :-
  56.           retirar_uma_ocu(X, L, L1).
  57.  
  58. % realiza a intersecção de duas listas, mas permitindo repetições          
  59. intersec_com_rep([], _, []).
  60. intersec_com_rep([X|List1], List2, [X|Resp1]) :-
  61.           aparece(X, List2), intersec_com_rep(List1, List2, Resp1), !.
  62. intersec_com_rep([X|List1], List2, Resp1) :-
  63.           not(aparece(X, List2)),
  64.           intersec_com_rep(List1, List2, Resp1), !.
  65.  
  66. % função que pega duas listas, verifica as posições com a mesma letra, coloca num contador e gera duas listas sem essas posições
  67. retirar_pos_igual([], [], [], [], 0).
  68. retirar_pos_igual([X|List1], [X|List2], Resp1, Resp2, M) :-
  69.           retirar_pos_igual(List1, List2, Resp1, Resp2, N), M is N+1.
  70. retirar_pos_igual([X|List1], [Y|List2], [X|Resp1], [Y|Resp2], M) :-
  71.           not(X==Y), retirar_pos_igual(List1, List2, Resp1, Resp2, M).
  72.  
  73. % realiza a contagem do Y da questão p2
  74. contar_igual_pos_errada([], _, 0).
  75. contar_igual_pos_errada([X|List1], List2, M) :-
  76.           aparece(X, List2),
  77.           retirar_uma_ocu(X, List2, Resp1),
  78.           contar_igual_pos_errada(List1, Resp1, L),
  79.           M is L + 1.
  80. contar_igual_pos_errada([X|List1], List2, M) :-
  81.           not(aparece(X, List2)),
  82.           contar_igual_pos_errada(List1, List2, M).
  83.  
  84. % predicado das questões
  85. p1(List, Resp) :-
  86.           soma_aux(List, Resp1), reverte(Resp1, Resp).
  87.  
  88. p2(List1, List2, X, Y) :-
  89.           retirar_pos_igual(List1, List2, Resp1, Resp2, X),
  90.           contar_igual_pos_errada(Resp1,Resp2, Y).
  91.  
  92. p3(List1, List2, Resp) :-
  93.           junta_com_rep(List1, List2, Resp1),
  94.           retirar_repeticao(Resp1, Resp).
  95.  
  96. p4(List1, List2, Resp) :-
  97.           intersec_com_rep(List1, List2, Resp1),
  98.           retirar_repeticao(Resp1, Resp).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement