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(nonEmptyRec,Options)
-> LowerBound = 1
; LowerBound = 0
) ,
(member(names:NameList,Options)
-> length(NameList, RSize)
; (member(recSize:Size,Options)
-> RSize = Size
; ( member(recBound:Bound,Options)
-> random(LowerBound,Bound,RSize)
; random(LowerBound,50,RSize)
)
) ,
generate(list(atom([size:5,alph]),Options),NameList)
) ,
length(ListOfRecords,RSize) ,
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(nonEmptyRec,Options)
-> LowerBound = 1
; LowerBound = 0
) ,
(member(recSize:Size,Options)
-> RSize = Size
; ( member(recBound:Bound,Options)
-> random(LowerBound,Bound,RSize)
; random(LowerBound,50,RSize)
)
) ,
length(NType,RSize) ,
% any or given type
(Type = any(InOptions)
-> append(InOptions, Options, NOptions),
maplist(generate(ground_type(NOptions)),NType)
; length(NType,RSize) ,
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,RSize) ,
maplist(prob_field(ast),NType,Record)) ,
maplist(field_value_to_type,Record,FieldTypes).