generate(prob_value_seq(Options),Value) :-
is_list(Options) ,
generate(ground_type(Options),Type) ,
generate(prob_value_seq(Type,Options),Value).
generate(prob_value_seq(Type),Value) :-
generate(prob_value_seq(Type,[]),Value).
generate(prob_value_seq(Type,Options),Value) :-
(member(not-well-defined,Options)
-> delete(Options,not-well-defined,T) ,
TOptions = [not-well-defined-values|T]
; TOptions = Options) ,
( member(nonEmpty,Options)
-> LowerBound = 1
; LowerBound = 0
) ,
( member(setSize:Size,Options)
-> RSize = Size
; ( member(setBound:Bound,Options)
-> random(LowerBound,Bound,RSize)
; random(LowerBound,50,RSize)
)
) ,
gen_type(Type,value,NType) ,
length(List,RSize) ,
maplist(generate(NType),List) ,
(member(not-well-defined-values,TOptions)
-> maplist(gen_random_indexed_couple,List,CoupleList)
; remove_dups(List,NList) ,
gen_indexed_couple_list(1,NList,CoupleList)) ,
% random choice of list set or avl set if no option is given
random(0,2,R) ,
( \+member(list,TOptions) , (member(avl,TOptions) ; R = 0)
-> % add key to every element to use list_to_avl
findall(Key-true,member(Key,CoupleList),Pairs) ,
list_to_avl(Pairs,AVL) ,
( AVL \== empty
-> Value = avl_set(AVL)
; Value = []
)
; % else list sequence
Value = CoupleList).