generate(prob_value_record(Type),Record) :-
\+is_list(Type) ,
generate(prob_value_record(Type,[]),Record).
generate(prob_value_record(Type,Options),ListOfRecords) :-
member(list:Size,Options) ,
(member(names:NameList,Options)
-> true
; random(1,20,R) ,
generate(list(atom([size:5,alph]),[setBound:R]),NameList)) ,
length(ListOfRecords,Size) ,
maplist(generate(prob_value_record(Type,[names:NameList])),ListOfRecords).
generate(prob_value_record(Type,Options),rec(Record)) :-
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)
-> maplist(generate(ground_type(InOptions)),NType)
; % list of single type to use maplist
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(value),NNType,NameList,Record)
; length(Record,RSize) ,
maplist(prob_field(value),NType,Record)).