generate(prob_value_set(Options),Value) :-
is_list(Options) ,
generate(ground_type,Type) ,
generate(prob_value_set(Type,Options),Value).
generate(prob_value_set(Type),Value) :-
generate(prob_value_set(Type,[]),Value).
generate(prob_value_set(Type,Options),Value) :-
(member(not-well-defined,Options) ->
delete(Options,not-well-defined,T) ,
TOptions = [not-well-defined-values|T]
; TOptions = Options) ,
% only generate sets of the same type for any
(Type = any(_) -> generate(ground_type,NType) ; NType = Type) ,
gen_type(NType,value,GenType) ,
( member(size:Size,TOptions) ->
Size > 0 , NOptions = TOptions
; random(1,50,Size) , NOptions = [size:Size|TOptions]) ,
( member(avl,TOptions) ->
% avl tree doesn't have duplicates
generate(avl_tree(GenType,NOptions),Temp) ,
Value = avl_set(Temp)
; member(list,TOptions) ->
generate(list(GenType,NOptions),Temp) ,
(member(not-well-defined-values,NOptions) ->
Value = Temp
; remove_dups(Temp,Value))
; random_member(SetType,[avl,list]) ,
generate(prob_value_set(NType,[SetType|NOptions]),Value)).