generate(prob_ast_seq(Options),Value) :-
is_list(Options) ,
generate(ground_type(Options),Type) ,
generate(prob_ast_seq(Type,Options),Value).
generate(prob_ast_seq(Type),Value) :-
generate(prob_ast_seq(Type,[]),Value).
generate(prob_ast_seq(Type,Options),Value) :-
member(Type,[integer(_),boolean(_),string(_)]) ,
Type =.. [InnerType,_] , ! ,
( member(extension,Options)
-> delete(Options,extension,NOptions) ,
gen_type(Type,ast,NType) ,
generate(list(NType,NOptions),Set),
Value = b(sequence_extension(Set),seq(InnerType),[])
; member(avl,Options)
-> generate(prob_value_seq(Type,Options),Seq),
Value = b(value(Seq),seq(InnerType),[])
; member(list,Options)
-> generate(prob_value_seq(Type,Options),Set),
Value = b(value(Set),seq(InnerType),[])
; % any value sequence
member(value,Options)
-> generate(prob_value_seq(Type,Options),Seq),
Value = b(value(Seq),seq(InnerType),[])
; % sequence or sequence expression
member(any,Options)
-> random_member(T,[seq,expr]) ,
(T = seq
-> generate(ground_type(Options),SeqType) ,
generate(prob_ast_seq(SeqType,[]),Value)
; generate(prob_ast_seq_expr([well-defined]),Value))
; random_member(SeqOption,[[extension|Options],[value|Options]]) ,
generate(prob_ast_seq(Type,SeqOption),Value)).
generate(prob_ast_seq(empty_sequence,Options),Out) :-
( member(nonEmpty,Options)
-> Out = b(sequence_extension([b(integer(1),integer,[])]),seq(integer),[])
; Out = b(sequence_extension([]),seq(integer),[])
).
generate(prob_ast_seq(SeqTypeOptions,Options),b(Seq,seq(NType),[])) :-
SeqTypeOptions =.. [seq,Type|InnerOptions] ,
( InnerOptions = [NOptions]
-> true
; NOptions = InnerOptions
) ,
( 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)
)
) ,
length(List,RSize) ,
( member(list,Options)
-> maplist(generate(prob_value_seq(Type,NOptions)),List) ,
Seq = value(List)
; member(avl,Options)
-> maplist(generate(prob_value_seq(Type,NOptions)),List) ,
findall(Key-true,member(Key,List),AVLList) ,
list_to_avl(AVLList,AVL) ,
Seq = value(avl_set(AVL))
; maplist(generate(prob_ast_seq(Type,NOptions)),List) ,
Seq = sequence_extension(List)) ,
% remove options for node type
inner_type(seq(Type),_,Outter) ,
length(Outter,L) ,
nth1(L,Outter,NewInner,NewOutter) ,
surround_type(NewInner,NewOutter,NType).