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]),[size: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(size:Size,Options) ->
true
; random(1,20,Size)) ,
length(NType,Size) ,
% any or given type
(Type = any(InOptions) ->
maplist(generate(ground_type(InOptions)),NType)
; % list of single type to use maplist
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(value),NNType,NameList,Record)
; length(Record,Size) ,
maplist(prob_field(value),NType,Record)).