Robert Patrick Modell
%To generate a list of 3 elements with random values between 0 and 5
%enter as goal: gen_list( 3, 5, List ).
%gen_list( +length_list, +max_random_val, ?result_list )
gen_list( Length, MaxVal, List ) :-
gen_list( Length, MaxVal, [], List ).
%Stop condition
gen_list( Length, MaxVal, List, Result ) :-
length(List, L), %Determine length of list
L >= Length, %Check if list is long enough
Result = List, %Match result variable with generated list
!. %List is long enough, use cut operator to stop
gen_list( Length, MaxVal, List, Result ) :-
RandomVal is irand(MaxVal), %List too small,generate random value
not (member(RandomVal, List)) -> %Check random value not in list
(
!,
gen_list(Length, MaxVal, [RandomVal|List], Result)
)
; (gen_list(Length, MaxVal, List, Result)).
%Determine the length of a list
length( [], 0 ) :- !.
length( [_|List], Len ) :-
length( List, Len2),
Len is Len2 + 1.
%Check if an element is a member of a list
member( X, [ X|_ ] ).
member( X, [ Y|Tail ] ) :-
member( X, Tail ).
* Sent from RemarQ http://www.remarq.com The Internet's Discussion Network *
The fastest and easiest way to search and participate in Usenet - Free!
?- go.
[4,2,0]
Ray Reeves
(Amzi support)
Here, the predicate shuffle(N, List, Result) chooses randomly N element
from the List. You can use in your case as shuffle(3, [0,1,2,3,4,5], R).
-----------------------------------------------------------------------
shuffle(N, List, Result) :-
length(List, M),
N =< M,
shuffle(N, [], M, List, Result).
shuffle(I, T, M, L, R):-
I > 0,
!,
random(M, K),
delete_nth0(L, K, H, U),
J is I - 1,
N is M - 1,
shuffle(J, [H|T], N, U, R).
shuffle(_, R, _, _, R).
delete_nth0(List, N, DeletedElement, Result) :-
delete_nth0(List, N, 0, DeletedElement,
Result).
delete_nth0([H|T], N, N, H, T) :- !.
delete_nth0([H|T], N, I, D, [H|R]) :-
J is I + 1,
delete_nth0(T, N, J, D, R).
length(L, N) :- length(L, 0, N).
length([_|T], I, N) :-
J is I + 1,
length(T, J, N).
length([], N, N).
random(M, R) :- R is integer(M * random).
-----------------------------------------------------------------------
Sent via Deja.com http://www.deja.com/
Before you buy.