random_seq_expr_mutation(b(Expr,SeqType,Info),b(NewExpr,SeqType,Info)) :-
Expr =.. [Type,Seq] ,
member(Type,[front,tail,rev]) ,
mutate_seq(Seq,NewSeq) ,
NewExpr =.. [Type,NewSeq].
random_seq_expr_mutation(b(Expr,SeqType,Info),b(NewExpr,SeqType,Info)) :-
Expr =.. [Type,Seq,Restriction] ,
member(Type,[restrict_front,restrict_tail]) ,
mutate_seq(Seq,NewSeq) ,
NewExpr =.. [Type,NewSeq,Restriction].
random_seq_expr_mutation(b(concat(Expr1,Expr2),SeqType,Info),b(concat(NewExpr1,NewExpr2),SeqType,Info)) :-
random_seq_expr_mutation(Expr1,NewExpr1) ,
random_seq_expr_mutation(Expr2,NewExpr2).
random_seq_expr_mutation(b(insert_front(Value,Expr),SeqType,Info),b(insert_front(Value,NewExpr),SeqType,Info)) :-
random_seq_expr_mutation(Expr,NewExpr).
random_seq_expr_mutation(b(insert_tail(Expr,Value),SeqType,Info),b(insert_tail(NewExpr,Value),SeqType,Info)) :-
random_seq_expr_mutation(Expr,NewExpr).
random_seq_expr_mutation(b(general_concat(b(sequence_extension(InnerSeq),seq(SeqType),Info)),SeqType,OutterInfo),Mutation) :-
maplist(mutate_seq,InnerSeq,NewInnerSeq) ,
Mutation = b(general_concat(b(sequence_extension(NewInnerSeq),seq(SeqType),Info)),SeqType,OutterInfo).
random_seq_expr_mutation(Seq,NewSeq) :-
mutate_seq(Seq,NewSeq).
random_seq_expr_mutation(Expression,Expression).