Advertisement
Guest User

Untitled

a guest
Oct 17th, 2019
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Prolog 2.74 KB | None | 0 0
  1. %questao1
  2. soma_lista(X,R):-soma_aux(X,0,[],R).
  3. soma_aux([],_,Z,T):-inv(Z,T).
  4. soma_aux([X|W],Y,Z,R):- S is Y+X,unir([S],Z,T),soma_aux(W,S,T,R).
  5.  
  6. %Explicando a ideia:
  7. %A princípio, tentamos implementar uma funcao para somar os elementos do comeco ao fim com os seguintes predicados:
  8. %soma([],0).
  9. %soma([X|L],N):-soma(L,M),N is M+X.
  10. %Depois, tentamos implementar a seguinte soma da lista:
  11. %somalista([],[]).
  12. %somalista([X|L],[Y|R]):-somalista(L,R),soma(L,Y).
  13. %Mas o resultado era calculado quase que de trás para frente, então decidimos criar uma variável auxiliar que tratava de inverter a lista
  14. %antes de somá-la. Ao final, obtivemos a expressão soma_lista lá em cima.
  15.  
  16.  
  17. %questao2
  18. p(A,B,X,Y):-senha(A,B,X,Y).
  19. senha(A,B,X,Y) :- fx(A,B,X),fy(A,B,M),Y is M - X,!.
  20. fx([],[],0).
  21. fx([A|L1],[A|L2],X) :- fx(L1,L2,K), X is K+1,!.
  22. fx([A|L1],[B|L2],X) :- fx(L1,L2,X).
  23. fy([],_,0).
  24. fy([A|L1],L2,Y) :- pertence(A,L2), remall(A,L2,L3), fy(L1,L3,K), Y = K+1.
  25. fy([A|L1],L2,Y) :- not(pertence(A,L2)), fy(L1,L2,Y).
  26.  
  27. %Explicando a ideia:
  28. %Como precisávamos calcular um valor diferente para duas variáveis distintas, pensamos em ramificar em duas soluções fx de X e fy de Y.
  29. %Para fx: sempre que encontrávamos um mesmo elemento nas cabeças de L1 e L2, seguíamos para próxima iteracao com X igual a K+1.
  30. %Para fy: verificamos se a cabeca de L1 em cada iteracao pertence a L2. Se pertence, removemos de L2 para nao haver recontagem e fazemos Y igual a K+1
  31. %para proxima iteracao
  32.  
  33. %questao3
  34. junte(L, [], L):-!.
  35. junte([], K, K).
  36. junte([X|L], [Y|K], [Z|M]):- X=Y, X=Z, Y=Z, !, junte(L, K, M).
  37. junte([X|L], [Y|K], [Z|M]):- menor(X,Y), X=Z, !, junte(L, [Y|K], M).
  38. junte([X|L], [Y|K], [Z|M]):- maior(X,Y), Y=Z, !, junte([X|L], K, M).
  39.  
  40. %questao4
  41. prog(L1,L2,L):-intersecao_semrep(L1,L2,L).
  42. intersecao_semrep([],L2,[]).
  43. intersecao_semrep([X|L1], L2, [X|L]) :- pertence(X,L2), remall(X, L2, L3), intersecao_semrep(L1, L3, L),!.
  44. intersecao_semrep([X|L1], L2, L) :- not(pertence(X,L2)), intersecao_semrep(L1, L2, L),!.
  45.  
  46. %Explicando a ideia:
  47. %Verifica se o elemento de uma lista pertence a outra lista, se for esse o caso, remove todas ocorrencias deste em L2 e inclui esse elemento na lista de
  48. %intersecao L das listas L1 e L2
  49.  
  50. %%%%%%%%%%%PREDICADOS AUXILIARES%%%%%%%%%%%%%
  51.  
  52. %verifica se elemento pertence
  53. pertence(X,[X|_]).
  54. pertence(X,[_|Y]):-pertence(X,Y).
  55.  
  56. %remove todos os elementos para X escolhido
  57. remall(_,[],[]).
  58. remall(X,[X|Y],L):-remall(X,Y,L).
  59. remall(X,[Z|Y],[Z|L]):-Z\==X,remall(X,Y,L).
  60.  
  61. %remover um elemento
  62. rem(X,[X|Y],Y).
  63. rem(X,[Z|Y],[Z|L]):-rem(X,Y,L).
  64.  
  65. %inverte lista
  66. inv([],[]).
  67. inv([X|L],R):-inv(L,T),unir(T,[X],R).
  68.  
  69. %unir listas
  70. unir([],Y,Y).
  71. unir([X|T],Y,[X|Z]):-unir(T,Y,Z).
  72.  
  73. %maior e menor
  74. maior(X,Y):-X>Y.
  75. menor(X,Y):-X<Y.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement