generate(mutation(L:list),Value) :-
flattened(L) ,
random_permutation(L,Value).
generate(mutation(ListOfLists:list),Value) :-
% mutate each list on its own
maplist(random_permutation,ListOfLists,Temp) ,
% also mutate the whole list
random_permutation(Temp,Value).
generate(mutation(Tree:tree(_)),Value) :-
\+ is_list(Tree) ,
tree_to_list(Tree,TreeList) ,
random_permutation(TreeList,TreePerm) ,
list_to_tree(TreePerm,Value).
generate(mutation(List:tree(_)),Value) :-
maplist(tree_to_list,List,TreeList) ,
flatten(TreeList,FlattenedList) ,
random_permutation(FlattenedList,TreePerm) ,
list_to_tree(TreePerm,Value).