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(avl,Options)
-> % avl tree doesn't have duplicates
generate(avl_tree(GenType,TOptions),Temp) ,
( Temp \== empty % ProB does not accept avl_set(empty)
-> Value = avl_set(Temp)
; Value = []
)
; member(list,Options)
-> generate(list(GenType,TOptions),Temp) ,
(member(not-well-defined-values,TOptions)
-> Value = Temp
; remove_dups(Temp,Value))
; random_member(SetType,[avl,list]) ,
generate(prob_value_set(NType,[SetType|TOptions]),Value)).