generate(prob_ast_record(Type),Record) :-
\+is_list(Type) ,
generate(prob_ast_record(Type,[]),Record).
generate(prob_ast_record(Type,Options),ListOfRecords) :-
member(list:Size,Options) ,
(member(names:NameList,Options) ->
true
; (member(size:R,Options) ->
true
; random(1,20,R)) ,
generate(list(atom([size:5,alph]),[size:R]),NameList)) ,
length(ListOfRecords,Size) ,
maplist(generate(prob_ast_record(Type,[names:NameList])),ListOfRecords).
generate(prob_ast_record(Type,Options),b(rec(Record),record(FieldTypes),[])) :-
member(Type,[integer(_),string(_),boolean(_),any(_)]) ,
(member(size:Size,Options) ->
true
; random(1,20,Size)) ,
length(NType,Size) ,
% any or given type
(Type = any(InOptions) ->
maplist(generate(ground_type(InOptions)),NType)
; length(NType,Size) ,
maplist(equal(Type),NType)) ,
(member(names:NameList,Options) ->
length(NameList,NewSize) ,
length(Record,NewSize) ,
% size of name list is more substantial than given size
length(NNType,NewSize) ,
maplist(equal(Type),NNType) ,
maplist(prob_field(ast),NNType,NameList,Record)
; % list of single type to use maplist
length(Record,Size) ,
maplist(prob_field(ast),NType,Record)) ,
maplist(field_value_to_type,Record,FieldTypes).