random_set_expr_mutation(b(Expression,set(SetType),Info),b(NewExpression,set(SetType),Info)) :-
Expression =.. [Type,Expr1,Expr2] ,
member(Type,[union,intersection,set_subtraction]) ,
random(0,3,R) ,
random_set_expr_mutation_aux(R,Expr1,Expr2,NewExpr1,NewExpr2) ,
NewExpression =.. [Type,NewExpr1,NewExpr2].
random_set_expr_mutation(b(Expression,set(SetType),Info),b(NewExpression,set(SetType),Info)) :-
Expression =.. [Type,Expr] ,
member(Type,[general_union,general_intersection]) ,
Expr = b(set_extension([Set]),set(set(SetType)),ArgInfo) ,
% just permutation
permutate_set(Set,NewSet) ,
NewExpr = b(set_extension([NewSet]),set(set(SetType)),ArgInfo) ,
NewExpression =.. [Type,NewExpr].
random_set_expr_mutation(Expression,NewExpression) :-
mutate_set(Expression,NewExpression).
random_set_expr_mutation(Expression,Expression).