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) ,
( R = 0 ->
random_set_expr_mutation(Expr1,NewExpr1) ,
NewExpr2 = Expr2
; R = 1 ->
random_set_expr_mutation(Expr2,NewExpr2) ,
NewExpr1 = Expr1
; % mutate both arguments
random_set_expr_mutation(Expr1,NewExpr1) ,
random_set_expr_mutation(Expr2,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).