1 :- multifile generate/2.
2 :- multifile shrink/3.
3
4 :- use_module(library(random),[random/3,random_member/2]).
5 :- use_module(library(trees),[list_to_tree/2,tree_to_list/2]).
6
7 % Options:
8 % size:X with X the amount of elements in the tree
9
10 % random binary tree
11 generate(tree(Options),Value) :-
12 is_list(Options) ,
13 generate(tree(any,Options),Value).
14
15 generate(tree(Type),Value) :-
16 generate(tree(Type,[]),Value).
17
18 % tree of given type
19 generate(tree(Type,Options),Value) :-
20 % size specifies amount of elements in the tree
21 (member(size:Size,Options)
22 -> Size > 0
23 ; random(1,20,Size)) ,
24 generate(list(Type,[size:Size]),List) ,
25 list_to_tree(List,Value).
26
27 % shrink binary tree
28 % empty tree
29 shrink(Type,t(_,t,t),t) :-
30 Type =..[tree|_].
31
32 shrink(Type,Value,Shrunken) :-
33 Type =.. [tree|_] ,
34 tree_to_list(Value,List) ,
35 % refer to shrinking of lists
36 shrink(list(_),List,ShrunkenList) ,
37 list_to_tree(ShrunkenList,Shrunken).