Guest User

Untitled

a guest
Jul 7th, 2018
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Prolog 2.57 KB | None | 0 0
  1. % 8. Se da o lista de numere intregi. Se cere sa se
  2. % elimine secventele de lungime maxima formata doar
  3. % din elemente pare.
  4.  
  5. %trace
  6.  
  7. domains
  8.     elem = integer
  9.     list = elem *
  10. predicates
  11.     elimPos(list, list, integer, integer, integer) %(i, i, o, i)
  12.     /*elimPos(l1, l2, p1, p2, n) - elimina din l1,
  13.       din pozitia p1 pana la p2 => rezultat in l2
  14.     */
  15.  
  16.     elim(list, list, list) % (i, i, o)
  17.     /* elim(l1, l2, r) - elimina din l1, toate
  18.        pozitiile din lista de pozitii l2
  19.        => rezultat in r
  20.     */
  21.    
  22.     count(list, list, integer) %(i, o, i)
  23.     /* count(L1, L2, N) - numara toate subsirurile
  24.        de elemente consecutive pare din L1,
  25.        => adauga pozitiile lor in L2
  26.     */
  27.    
  28.     par(integer)
  29.     impar(integer)
  30.     maxPos(list, integer, integer)
  31.     remForMax(list, list, integer)
  32.     run(list, list)
  33.     runMe(list, list)
  34.     updatePos(integer, list, list)
  35. clauses
  36.  
  37.     run(X,R) :- runMe(X,R).
  38.     runMe(X, R) :-
  39.         count([1|X], ListPos, 1),
  40.         maxPos(ListPos, 0, PMax),
  41.         remForMax(ListPos, [H1,H2|ListMax], PMax),
  42.         updatePos(PMax, ListMax, UpdatedListM),
  43.         elim([1|X], [H1,H2|UpdatedListM], [_|R]).
  44.    
  45.        
  46.     updatePos(_, [], []).
  47.     updatePos(N, [H1,H2|T], [H1u,H2u|R]) :-
  48.         H1u = H1 - N,
  49.         H2u = H2 - N,
  50.         Nu =  N * 2,
  51.         updatePos(Nu, T, R).
  52.        
  53.    
  54.     par(X) :- X mod 2 = 0.
  55.     impar(X) :- X mod 2 = 1.
  56.    
  57.            
  58.     maxPos([], X, X).      
  59.     maxPos([H1, H2|T], Mi, Mf) :-
  60.         D = H2 - H1 + 1,
  61.         D > Mi, !,
  62.         maxPos(T, D, Mf).
  63.     maxPos([_,_|T], Mi, Mf) :-
  64.         maxPos(T, Mi, Mf).
  65.        
  66.    
  67.     remForMax([], [], _).
  68.     remForMax([H1, H2|T], [H1,H2|R], M) :-
  69.         M = H2 - H1 + 1,
  70.         remForMax(T, R, M).
  71.     remForMax([H1, H2|T], R, M) :-
  72.         M <> H2 - H1 + 1,
  73.         remForMax(T, R, M).
  74.                
  75.    
  76.     count([], [], _).
  77.     count([H1, H2|T], [N1|R], N) :-
  78.         impar(H1),
  79.         par(H2),
  80.         N1=N+1, !,
  81.         count([H2|T], R, N1).
  82.    
  83.     count([H1, H2|T], R, N) :-  
  84.         impar(H1),
  85.         impar(H2),
  86.         N1=N+1, !,
  87.         count([H2|T], R, N1).
  88.    
  89.     count([H1,H2|T], [N|R], N) :-
  90.         par(H1),
  91.         impar(H2),
  92.         N1=N+1,
  93.         count([H2|T], R, N1).
  94.        
  95.     count([H1,H2|T], R, N ) :-
  96.         par(H1),
  97.         par(H2),
  98.         N1 = N + 1,
  99.         count([H2|T], R, N1).
  100.     count([H], [N], N) :-
  101.         par(H), !.
  102.     count([_], [], _).
  103.    
  104.    
  105.  
  106.     elimPos([], [], _, _, _).
  107.     elimPos([H|T] , [H|X], P1, P2, N) :-   % n < p1
  108.         N<P1,
  109.         N1=N+1,
  110.         !,
  111.         elimPos(T, X, P1, P2, N1).
  112.     elimPos([_|T] , X, P1, P2, N) :-  % p1 <= n <= p2
  113.         N>=P1,
  114.         N<=P2,
  115.         N1=N+1,
  116.         !,
  117.         elimPos(T , X, P1, P2, N1).
  118.     elimPos([H|T] , [H|X], P1, P2, N) :- % n>p2
  119.         N>P2,
  120.         N1=N+1,
  121.         !,
  122.         elimPos(T , X, P1, P2, N1).
  123.        
  124.     elim(L,[],L).
  125.     elim(L, [P1, P2 | T], R) :-
  126.         elimPos(L, Ri, P1, P2, 1),
  127.         !,
  128.         elim(Ri, T, R).
Add Comment
Please, Sign In to add comment