% timm tricks

some(N,X) :-
	between(1,N,_),
	one(X).

one(X) :-
	once(any(X)).

any(X) :-
	setof(R/X,(X,R is random(1000)),L),
	member(_/X,L).

map([],    _,X,X).
map([H0|T],P) --> {once(map0(H0,H))}, map1(H,P), map(T,P).

map0(X,call(X)) :- known(X).
map0(X,raw(X)).

map1(raw(X),_,Y,Y) :- X.
map1(call(X),P) -->  call(P,X).
