And we don’t need clp(fd); freeze/2 and when/2 work just fine:
runs(R, L) :- phrase(runs(_, L), R).
% runs(X, R, L) :- phrase(runs(X, L), R).
runs(X, [X-N|R]) --> {freeze(N, N > 0)}, run(X, N), {dif(X,Y)}, runs(Y, R).
runs(_, []) --> [].
run(X, N) --> {freeze(N, N > 0)}, {when_plus1(M, N)}, [X], run(X, M).
run(_, 0) --> [].
when_plus1(A,C) :-
when((nonvar(A);nonvar(C)), plus(A,1,C)).
?- runs([a, a, b, c, c, c], L).
L = [a-2, b-1, c-3] ;
false.
?- runs(L, [a-2, b-1, c-3]).
L = [a, a, b, c, c, c] ;
false.