1 :- multifile generate/2.
2 :- multifile shrink/3.
3
4 :- use_module(library(lists),[is_list/1,maplist/2]).
5 :- use_module(library(random),[random_permutation/2]).
6
7 % mutation of a list
8 generate(mutation(L:list),Value) :-
9 flattened(L) ,
10 random_permutation(L,Value).
11 % mutation of a list of lists
12 generate(mutation(ListOfLists:list),Value) :-
13 % mutate each list on its own
14 maplist(random_permutation,ListOfLists,Temp) ,
15 % also mutate the whole list
16 random_permutation(Temp,Value).
17
18 % mutation of trees
19 % random permutation of a binary tree
20 generate(mutation(Tree:tree(_)),Value) :-
21 \+ is_list(Tree) ,
22 tree_to_list(Tree,TreeList) ,
23 random_permutation(TreeList,TreePerm) ,
24 list_to_tree(TreePerm,Value).
25
26 % random permutation of several binary trees given in a list
27 generate(mutation(List:tree(_)),Value) :-
28 maplist(tree_to_list,List,TreeList) ,
29 flatten(TreeList,FlattenedList) ,
30 random_permutation(FlattenedList,TreePerm) ,
31 list_to_tree(TreePerm,Value).
32
33 shrink(mutation(_:Type),Value,Shrunken) :-
34 shrink(Type,Value,Shrunken).
35
36 % flatten a nested list
37 flatten([],[]) :- !.
38 flatten(H,[H]) :- \+is_list(H).
39 flatten([H|T],List) :-
40 flatten(H,L1) ,
41 flatten(T,L2) ,
42 append(L1,L2,List).
43
44 % tests if list is flattened
45 flattened(L) :-
46 flatten(L,L).
47
48 % convert all Key-Value pairs to Key
49 avl_list_to_list(AVLList,List) :-
50 findall(Key,member(Key-_,AVLList),List).
51
52 % convert (Index,Value) to Value
53 seq_to_list(Seq,List) :-
54 findall(Value,member((_,Value),Seq),List).