generate(prob_ast_set_expr,Value) :-
generate(prob_ast_set_expr([]),Value).
generate(prob_ast_set_expr(Options),Value) :-
is_list(Options) ,
Fixed = [interval,union,intersection,set_subtraction,bool_set,general_union,general_intersection,empty_set],
( member(noString,Options)
-> Choose = Fixed
; Choose = [string_set|Fixed]
),
random_member(Expr,Choose) ,
( member(nonEmpty,Options)
-> Expr \== empty_set
; true
) ,
generate(prob_ast_set_expr(Expr,Options),Value).
generate(prob_ast_set_expr(interval,Options),Gen) :-
( member(posInterval,Options)
-> generate(prob_ast_integer([between(0,15)|Options]),Node1)
; member(negInterval,Options)
-> generate(prob_ast_integer([between(-15,0)|Options]),Node1)
; generate(prob_ast_integer([between(-15,15)|Options]),Node1)
) ,
Node1 = b(integer(Value1),_,_) ,
( member(maxInterval:S,Options)
-> % interval with given maximum size
random(0,S,R) ,
Value2 is Value1 + R ,
Node2 = b(integer(Value2),integer,[])
; generate(prob_ast_integer([small|Options]),Node2) ,
Node2 = b(integer(Value2),_,_)
) ,
% get value from ast node
( Value1 =< Value2
-> Interval = interval(Node1,Node2)
; Interval = interval(Node2,Node1)
),
!,
Gen = b(Interval,set(integer),[]).
generate(prob_ast_set_expr(empty_set,_),b(set_extension([]),set(InnerType),[])) :-
generate(prob_type, InnerType).
generate(prob_ast_set_expr(bool_set,Options),Value) :-
(member(id,Options)
-> generate(id_or_ast(set(boolean([]))),Value)
; generate(prob_ast_set(boolean([]),Options),Value)).
generate(prob_ast_set_expr(string_set,Options),Value) :-
(member(id,Options)
-> generate(id_or_ast(set(string([Options]))),Value)
; generate(prob_ast_set(string([Options]),Options),Value)).
generate(prob_ast_set_expr(Expr,Options),b(NewPred,set(Type),[])) :-
member(Expr,[union,intersection,set_subtraction]) ,
generate(prob_ast_set(Options),Set1) ,
Set1 = b(_,set(Type),_) ,
inner_type(Type,Inner,Outter) ,
NewInner =.. [Inner,Options] ,
surround_type(NewInner,Outter,TType) ,
add_options(TType, Options, NType),
! ,
(member(id,Options) , Type \= empty ->
generate(id_or_ast(set(NType)),Set2)
; generate(prob_ast_set(NType,Options),Set2)) ,
!,
NewPred =.. [Expr,Set1,Set2].
generate(prob_ast_set_expr(Expr,Options),b(NewPred,Type,[])) :-
member(Expr,[general_union,general_intersection]) ,
generate(ground_type(Options),SetType) ,
(member(id,Options)
-> generate(id_or_ast(set(SetType)),Set)
; generate(prob_ast_set(SetType,Options),Set)) ,
Set = b(_,Type,_) ,
SetOfSet = b(set_extension([Set]),set(Type),[]) ,
!,
NewPred =.. [Expr,SetOfSet].