Sunteți pe pagina 1din 2

Laborator Nr. 7 ”Probleme combinatorice”.

Pentru realizarea acestui laborator puteți aplica metode de căutare prin încercări
succesive, backtracking sau orice algoritmi potriviți.

În problemele legate cu repartizări a numerelor de la 1 la N în trei cutii, se poate de


aplicat ușor metoda backtracking. Deoarece în Prolog backtracking-ul este automatizat,
este foarte simplu de realizat.

Exemplul 1. Să se distribuie numerele de la 1 la N în trei cutii (în orice mod).

Remarcă. Dacă soluționați această problemă, ulterior puteți rezolva varianta proprie,
selectând din toate soluțiile pe cele, care satisfac condițiile variantei D-Voastră.

Rezolvare:

distr(0,[],[],[]).
distr(N,[N|A],B,C):-N>0,N1 is N-1,distr(N1,A,B,C).
distr(N,A,[N|B],C):-N>0,N1 is N-1,distr(N1,A,B,C).
distr(N,A,B,[N|C]):-N>0,N1 is N-1,distr(N1,A,B,C).

Exemplu de apelare:

Goal: distr(4,A,B,C)

Răspunsuri (dacă tastați butonul ”Next” până la epuizarea tuturor soluțiilor):

A=[1,2,3,4] B=[] C=[]


A=[1,2,3] B=[4] C=[]
A=[1,2,4] B=[3] C=[]
.......................
A=[] B=[4] C=[1,2,3]
A=[] B=[] C=[1,2,3,4]

Deci vom obține toate repartizările posibile.


În continuare vom da încă un exemplu, adăugând la exemplu precedent o condiție.
Exemplul 2. Să se distribuie numerele de la 1 la N în trei cutii, astfel, ca să se satisfacă
pentru toate cutiile următoarea condiție: dacă două numere x și y se află într-o cutie,
atunci suma lor z=(x+y) nu poate să se afle cu ele în aceeași cutie.

Rezolvare:

distr(0,[],[],[]).
distr(N,[N|A],B,C):-N>0,N1 is N-1,distr(N1,A,B,C),not(conditie(N,A)).
distr(N,A,[N|B],C):-N>0,N1 is N-1,distr(N1,A,B,C),not(conditie(N,B)).
distr(N,A,B,[N|C]):-N>0,N1 is N-1,distr(N1,A,B,C),not(conditie(N,C)).

% predicatul conditie(Z,L), verifica daca in lista L sunt


% doua elemente X si Y, astfel, incat Z=X+Y.

conditie(Z,L):-member(X,L),member(Y,L),not(X=Y),Z is X+Y.

Exemplu de apelare:

Goal: distr(4,A,B,C)

Răspunsuri (cu tastarea ”Next):


A = [4, 3, 2], B = [1], C = []

A = [4, 3, 2], B = [], C = [1]

A = [4, 3], B = [2, 1], C = []

A = [4, 3], B = [2], C = [1]

A = [4, 3], B = [1], C = [2]


...................

Deci se va afișa o submulțime a răspunsurilor din primul aexemplu, în care 1, 2, 3 nu vor


nimeri niciodată în vreo careva cutie împreună (3=1+2) și 1, 3, 4 nu vor nimeri
niciodată în vreo careva cutie împreună (4=1+3).

S-ar putea să vă placă și