generate(prob_value_seq(Options),Value) :-
is_list(Options) ,
generate(ground_type,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(size:Size,TOptions)
-> true
; random(1,20,Size)) ,
gen_type(Type,value,NType) ,
length(List,Size) ,
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) ,
Value = avl_set(AVL)
; % else list sequence
Value = CoupleList).