:- constraints leq/2. leq(X,X) <=> true. leq(N1,N2) <=> number(N1), number(N2) | N1 =< N2. leq(N1,X) \ leq(N2,X) <=> number(N1), number(N2), N1 > N2 | true. leq(X,N1) \ leq(X,N2) <=> number(N1), number(N2), N1 < N2 | true. leq(X,Y) \ leq(X,Y) <=> true. leq(X,Y) , leq(Y,Z) ==> leq(X,Z). truckload(0,0,_,_). truckload(I,W,D,T) :- % do not include pack I I > 0, I1 is I - 1, truckload(I1,W,D,T). truckload(I,W,D,T) :- % include pack I I > 0, pack(I,Wi,D,Ti), W1 is W - Wi, W1 >= 0, I1 is I - 1, truckload(I1,W1,D,T), T = Ti. pack(30,29,chicago,T) :- leq(19,T),leq(T,29). pack(29,82,chicago,T) :- leq(20,T),leq(T,29). pack(28,24,chicago,T) :- leq(8,T),leq(T,12). %... pack(3,60,chicago,T) :- leq(4,T),leq(T,29). pack(2,82,chicago,T) :- leq(28,T),leq(T,29). pack(1,41,chicago,T) :- leq(27,T),leq(T,28).