Exerciții Șablon parțial (2026-04-22), Subiectul II c) [3 puncte]

solution/3 — sublistă de pare sau impare cu constrângeri

Șablon parțial (2026-04-22), Subiectul II c) [3 puncte] advanced Recursivitate pe listefindall / bagof / setof (generate-and-test)Negația ca eșec (not/1, \+)

Scrieți un predicat solution/3 care primește o listă de elemente întregi, o sumă S și returnează, în al treilea argument, o sublistă Sol astfel încât:

  1. suma elementelor din sublista Sol să fie egală cu S
  2. Sol este o sublistă de numerele pare consecutive sau o sublistă de numere impare consecutive din lista inițială; de exemplu în lista [1, 2, 3, 5, 4] elementele 2 și 4 sunt numere pare consecutive, iar 1, 3, 5 sunt numere impare consecutive
  3. dacă Sol conține numere pare atunci cu siguranță există și o listă de numere impare cu suma S, de lungime cu lungimea lui Sol
  4. dacă Sol conține numere impare atunci cu siguranță există și o listă de numere pare cu suma S, de lungime < cu lungimea lui Sol
  5. predicatul eșuează dacă nu există liste cu numere pare și liste cu numere impare consecutive care au suma S
?- solution([3,2,1,4,5,6], 6, Sol).
Sol = [2, 4]
% se putea obține și din [1, 5], și din [2, 4], dar s-a preferat lista elementelor pare

?- solution([1, 1,2,1,6,5,6], 8, Sol).
Sol = [1, 1, 1, 5]
% se putea obține 8 și din [2, 6], dar s-a preferat cea mai lungă dintre subliste

?- solution([1, 1,2,1,6,5,6], 12, Sol).
false
% se poate obține 12 din [6, 6], dar pe impare nu se poate obține, deci false conform condiției 5

Hint: separă lista în lista pare-consecutive și lista impare-consecutive. Găsește toate sublistele contigue ale fiecăreia care au suma S. Dacă ambele mulțimi sunt nevide, aplică regulile 3 și 4 (în esență: preferă cea mai lungă, cu tiebreaker pe pare).

Te-ai blocat?
editor soluție
?-
Tastează o interogare (ex. father_of(sandra, X).) și apasă Enter — sau apasă pe un caz de test de mai jos.
Cazuri de test (3 — apasă pe unul ca să îl rulezi, sau Verifică pentru toate)
?
solution([3,2,1,4,5,6], 6, Sol). așteptat: Sol = [2,4]
?
solution([1,1,2,1,6,5,6], 8, Sol). așteptat: Sol = [1,1,1,5]
?
solution([1,1,2,1,6,5,6], 12, Sol). așteptat: false