generate(prob_ast_set(Options),Value) :-
is_list(Options) ,
generate(ground_type(Options),Type) ,
generate(prob_ast_set(Type,Options),Value).
generate(prob_ast_set(Type),Value) :-
generate(prob_ast_set(Type,[]),Value).
generate(prob_ast_set(Type,Options),Value) :-
member(Type,[integer(_),boolean(_),string(_),couple(_,_)]) ,
Type =.. [InnerType,_] , ! ,
( member(extension,Options)
-> delete(Options,extension,NOptions) ,
TempType =.. [InnerType,Options],
gen_type(TempType,ast,NType) ,
%format('~nGenerating with NType: ~w~nNOptions: ~w~nType: ~w~n', [NType, NOptions,TempType]),
generate(list(NType,NOptions),Set),
Value = b(set_extension(Set),set(InnerType),[])
; (member(avl,Options) ; member(list,Options) ; member(value,Options))
-> generate(prob_value_set(Type,Options),Set),
Value = b(value(Set),set(InnerType),[])
; % set or set expression
member(any,Options) ->
delete(Options,any,NOptions) ,
random_member(T,[set,expr]) ,
(T = set
-> generate(ground_type(Options),SetType) ,
generate(prob_ast_set(SetType,NOptions),Value)
; generate(prob_ast_set_expr(NOptions),Value))
; random_member(SetOption,[[extension|Options],[value|Options]]) ,
generate(prob_ast_set(Type,SetOption),Value)).
generate(prob_ast_set(empty([]),_),b(set_extension([]),set(InnerType),[])) :-
generate(prob_type, InnerType).
generate(prob_ast_set(SetTypeOptions,Options),b(Set,set(NType),[])) :-
SetTypeOptions =.. [set,Type|InnerOptions] ,
( InnerOptions \= []
-> append(Options, InnerOptions, NOptions)
; NOptions = Options
) ,
( member(nonEmpty,NOptions)
-> LowerBound = 1
; LowerBound = 0
) ,
( member(setBound:Bound,NOptions)
-> random(LowerBound,Bound,RSize)
; ( member(setSize:Size,NOptions)
-> RSize = Size
; random(LowerBound,10,RSize)
)
) ,
length(List,RSize) ,
( member(list,NOptions)
-> maplist(generate(prob_value_set(Type,NOptions)),List) ,
Set = value(List)
; member(avl,NOptions)
-> maplist(generate(prob_value_set(Type,NOptions)),List) ,
findall(Key-true,member(Key,List),AVLList) ,
list_to_avl(AVLList,AVL) ,
AVL \= empty,
Set = value(avl_set(AVL))
; maplist(generate(prob_ast_set(Type,NOptions)),List) ,
Set = set_extension(List)) ,
% remove options for node type
inner_type(set(Type),_,Outter) ,
length(Outter,L) ,
nth1(L,Outter,NewInner,NewOutter) ,
surround_type(NewInner,NewOutter,NType).