# Sample n items without replacement in Prolog

I have the following Prolog code which samples n items from a list without replacement:

samp(0,_,Sample,Sample).
samp(N,Domain0, Sample0, Sample):-
N >= 0,
length(Domain0,L),
RandomNumber is random(L),
nth0(RandomNumber, Domain0, X),
delete(Domain0,X,Domain1),
append(Sample0,[X],Sample1),
N1 is N-1,
samp(N1,Domain1,Sample1,Sample).

sample(Domain,N,Sample):-
samp(N,Domain,[],Sample).


Is there a 'nicer' way to do this?

• Welcome to Code Review, thanks for understanding exactly what this site is about. As a thank you, I just helped making sure that you got the Association Bonus in the Stack Exchange network. Welcome! :) – Simon Forsberg May 11 '14 at 15:49

sample_swi(Domain, N, Sample) :-

• @S0rin prolog predicates are not functions - they should represent relations. Above code is a function: it works only "one-way". You can query for sample_swi([1,2], 1, Sample) but you'll get error for sample_swi(X, 1, [1]).. If it was "true" relation then it would work both ways and it would work even for this query: sample_swi(X, Y, Z). This is important in Prolog. – Grzegorz Adam Kowalski May 12 '14 at 15:18