findSublist/3 — prima sublistă contiguă cu sumă dată
Scrieți un predicat findSublist/3 care primește o listă L, o sumă S și returnează o sublistă Sublist astfel încât Sublist este prima sublistă a listei inițiale care are suma elementelor egală cu S, unde o sublistă este definită ca o secvență consecutivă de elemente din listă. Dacă nu există nicio astfel de sublistă, se returnează false.
?- findSublist([1,2,3,4,5], 9, Sublist).
Sublist = [2, 3, 4].
?- findSublist([1,2,3,4,5], 15, Sublist).
Sublist = [1, 2, 3, 4, 5].
?- findSublist([1,2,3,4,5], 100, Sublist).
false.
Hint: folosește
append/3de două ori pentru a genera toate sublistele contigue:append(_, Rest, L), append(Sub, _, Rest). Apoi calculezi suma luiSubși compari cuS. Un cut (!) oprește pe prima soluție găsită.
Te-ai blocat?
editor
soluție
% suma elementelor dintr-o listă (stilul din breviar)
list_sum([], 0) :- !.
list_sum([H | T], S) :-
list_sum(T, ST),
S is ST + H.
% găsește o sublistă contiguă
sublist_contig(L, Sub) :-
append(_, Rest, L),
append(Sub, _, Rest),
Sub \= [].
findSublist(L, S, Sublist) :-
sublist_contig(L, Sublist),
list_sum(Sublist, S),
!.
?-
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)
?
findSublist([1,2,3,4,5], 9, S).
așteptat: S = [2,3,4]
?
findSublist([1,2,3,4,5], 15, S).
așteptat: S = [1,2,3,4,5]
?
findSublist([1,2,3,4,5], 100, S).
așteptat: false